refactor: rename

1. 将枚举 Server 改为字符串常量,使得 memshell 和 probeshell 都能共用
2. 移除 memshell 模块直接内置在 generator 中
3. 通用类从 memshell 移动至 javaweb 下,命名修改,增加辨识度
This commit is contained in:
ReaJason
2025-08-13 23:53:40 +08:00
parent d4bde3baad
commit f9dce4f84b
354 changed files with 1094 additions and 1387 deletions
@@ -1,12 +1,9 @@
package com.reajason.javaweb.boot; package com.reajason.javaweb.boot;
import com.reajason.javaweb.memshell.Server;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.Arrays;
/** /**
* @author ReaJason * @author ReaJason
*/ */
@@ -16,8 +13,5 @@ public class BootApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args); SpringApplication.run(BootApplication.class, args);
Server[] values = Server.values();
log.info("Supported servers: {}", Arrays.toString(values));
log.info("For another server, you can open a issue in GitHub, https://github.com/ReaJason/MemShellParty/issues/new?template=%E8%AF%B7%E6%B1%82%E9%80%82%E9%85%8D.md");
} }
} }
@@ -1,10 +1,10 @@
package com.reajason.javaweb.boot.controller; package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.vo.CommandConfigVO; import com.reajason.javaweb.boot.vo.CommandConfigVO;
import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.ServerFactory;
import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.config.CommandConfig; import com.reajason.javaweb.memshell.config.CommandConfig;
import com.reajason.javaweb.memshell.server.AbstractShell; import com.reajason.javaweb.memshell.server.AbstractServer;
import com.reajason.javaweb.packer.Packers; import com.reajason.javaweb.packer.Packers;
import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@@ -25,11 +25,10 @@ public class ConfigController {
@RequestMapping("/servers") @RequestMapping("/servers")
public Map<String, List<String>> getServers() { public Map<String, List<String>> getServers() {
Map<String, List<String>> servers = new LinkedHashMap<>(); Map<String, List<String>> servers = new LinkedHashMap<>();
for (Server server : Server.values()) { List<String> supportedServers = ServerFactory.getSupportedServers();
if (server.getShell() != null) { for (String supportedServer : supportedServers) {
Set<String> supportedShellTypes = server.getShell().getShellInjectorMapping().getSupportedShellTypes(); Set<String> supportedShellTypes = ServerFactory.getServer(supportedServer).getShellInjectorMapping().getSupportedShellTypes();
servers.put(server.name(), supportedShellTypes.stream().toList()); servers.put(supportedServer, supportedShellTypes.stream().toList());
}
} }
return servers; return servers;
} }
@@ -44,20 +43,21 @@ public class ConfigController {
@RequestMapping @RequestMapping
public Map<String, Map<?, ?>> config() { public Map<String, Map<?, ?>> config() {
Map<String, Map<?, ?>> coreMap = new HashMap<>(16); Map<String, Map<?, ?>> coreMap = new HashMap<>(16);
for (Server value : Server.values()) { List<String> supportedServers = ServerFactory.getSupportedServers();
AbstractShell shell = value.getShell(); for (String supportedServer : supportedServers) {
if (shell == null) { AbstractServer server = ServerFactory.getServer(supportedServer);
if (server == null) {
continue; continue;
} }
Map<String, Set<String>> map = new LinkedHashMap<>(16); Map<String, Set<String>> map = new LinkedHashMap<>(16);
for (ShellTool shellTool : shell.getSupportedShellTools()) { for (ShellTool shellTool : server.getSupportedShellTools()) {
Set<String> supportedShellTypes = shell.getSupportedShellTypes(shellTool); Set<String> supportedShellTypes = server.getSupportedShellTypes(shellTool);
if (supportedShellTypes.isEmpty()) { if (supportedShellTypes.isEmpty()) {
continue; continue;
} }
map.put(shellTool.name(), supportedShellTypes); map.put(shellTool.name(), supportedShellTypes);
} }
coreMap.put(value.name(), map); coreMap.put(supportedServer, map);
} }
return coreMap; return coreMap;
} }
@@ -1,7 +1,7 @@
package com.reajason.javaweb.boot.controller; package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.dto.GenerateRequest; import com.reajason.javaweb.boot.dto.MemShellGenerateRequest;
import com.reajason.javaweb.boot.dto.GenerateResponse; import com.reajason.javaweb.boot.dto.MemShellGenerateResponse;
import com.reajason.javaweb.memshell.MemShellGenerator; import com.reajason.javaweb.memshell.MemShellGenerator;
import com.reajason.javaweb.memshell.MemShellResult; import com.reajason.javaweb.memshell.MemShellResult;
import com.reajason.javaweb.memshell.config.InjectorConfig; import com.reajason.javaweb.memshell.config.InjectorConfig;
@@ -19,22 +19,22 @@ import java.util.Base64;
* @since 2024/12/18 * @since 2024/12/18
*/ */
@RestController @RestController
@RequestMapping("/generate") @RequestMapping("/memshell/generate")
@CrossOrigin("*") @CrossOrigin("*")
public class GeneratorController { public class MemShellGeneratorController {
@PostMapping @PostMapping
public GenerateResponse generate(@RequestBody GenerateRequest request) { public MemShellGenerateResponse generate(@RequestBody MemShellGenerateRequest request) {
ShellConfig shellConfig = request.getShellConfig(); ShellConfig shellConfig = request.getShellConfig();
ShellToolConfig shellToolConfig = request.parseShellToolConfig(); ShellToolConfig shellToolConfig = request.parseShellToolConfig();
InjectorConfig injectorConfig = request.getInjectorConfig(); InjectorConfig injectorConfig = request.getInjectorConfig();
MemShellResult generateResult = MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig); MemShellResult generateResult = MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig);
Packer packer = request.getPacker().getInstance(); Packer packer = request.getPacker().getInstance();
if (packer instanceof JarPacker) { if (packer instanceof JarPacker) {
return new GenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult.toJarPackerConfig()))); return new MemShellGenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult.toJarPackerConfig())));
} else if (packer instanceof AggregatePacker) { } else if (packer instanceof AggregatePacker) {
return new GenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult.toClassPackerConfig())); return new MemShellGenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult.toClassPackerConfig()));
} else { } else {
return new GenerateResponse(generateResult, packer.pack(generateResult.toClassPackerConfig())); return new MemShellGenerateResponse(generateResult, packer.pack(generateResult.toClassPackerConfig()));
} }
} }
} }
@@ -1,33 +0,0 @@
package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.dto.ProbeGenerateRequest;
import com.reajason.javaweb.boot.dto.ProbeGenerateResponse;
import com.reajason.javaweb.packer.AggregatePacker;
import com.reajason.javaweb.packer.Packer;
import com.reajason.javaweb.probe.ProbeGenerator;
import com.reajason.javaweb.probe.ProbeResult;
import com.reajason.javaweb.probe.config.ProbeConfig;
import com.reajason.javaweb.probe.config.ProbeContentConfig;
import org.springframework.web.bind.annotation.*;
/**
* @author ReaJason
* @since 2025/8/10
*/
@RestController
@RequestMapping("/probe/generate")
@CrossOrigin("*")
public class ProbeGeneratorController {
@PostMapping
public ProbeGenerateResponse generate(@RequestBody ProbeGenerateRequest request) {
ProbeConfig probeConfig = request.getProbeConfig();
ProbeContentConfig probeContentConfig = request.parseProbeContentConfig();
ProbeResult generateResult = ProbeGenerator.generate(probeConfig, probeContentConfig);
Packer packer = request.getPacker().getInstance();
if (packer instanceof AggregatePacker) {
return new ProbeGenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult.toClassPackerConfig()));
} else {
return new ProbeGenerateResponse(generateResult, packer.pack(generateResult.toClassPackerConfig()));
}
}
}
@@ -0,0 +1,33 @@
package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.dto.ProbeShellGenerateRequest;
import com.reajason.javaweb.boot.dto.ProbeShellGenerateResponse;
import com.reajason.javaweb.packer.AggregatePacker;
import com.reajason.javaweb.packer.Packer;
import com.reajason.javaweb.probe.ProbeShellGenerator;
import com.reajason.javaweb.probe.ProbeShellResult;
import com.reajason.javaweb.probe.config.ProbeConfig;
import com.reajason.javaweb.probe.config.ProbeContentConfig;
import org.springframework.web.bind.annotation.*;
/**
* @author ReaJason
* @since 2025/8/10
*/
@RestController
@RequestMapping("/probe/generate")
@CrossOrigin("*")
public class ProbeShellGeneratorController {
@PostMapping
public ProbeShellGenerateResponse generate(@RequestBody ProbeShellGenerateRequest request) {
ProbeConfig probeConfig = request.getProbeConfig();
ProbeContentConfig probeContentConfig = request.parseProbeContentConfig();
ProbeShellResult generateResult = ProbeShellGenerator.generate(probeConfig, probeContentConfig);
Packer packer = request.getPacker().getInstance();
if (packer instanceof AggregatePacker) {
return new ProbeShellGenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult.toClassPackerConfig()));
} else {
return new ProbeShellGenerateResponse(generateResult, packer.pack(generateResult.toClassPackerConfig()));
}
}
}
@@ -1,8 +1,8 @@
package com.reajason.javaweb.boot.dto; package com.reajason.javaweb.boot.dto;
import com.reajason.javaweb.memshell.config.*; import com.reajason.javaweb.memshell.config.*;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import com.reajason.javaweb.packer.Packers; import com.reajason.javaweb.packer.Packers;
import com.reajason.javaweb.utils.CommonUtil;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -11,7 +11,7 @@ import org.apache.commons.lang3.StringUtils;
* @since 2024/12/18 * @since 2024/12/18
*/ */
@Data @Data
public class GenerateRequest { public class MemShellGenerateRequest {
private ShellConfig shellConfig; private ShellConfig shellConfig;
private ShellToolConfigDTO shellToolConfig; private ShellToolConfigDTO shellToolConfig;
private InjectorConfig injectorConfig; private InjectorConfig injectorConfig;
@@ -12,18 +12,18 @@ import java.util.Map;
*/ */
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public class GenerateResponse { public class MemShellGenerateResponse {
private MemShellResult generateResult; private MemShellResult memShellResult;
private String packResult; private String packResult;
private Map<String, String> allPackResults; private Map<String, String> allPackResults;
public GenerateResponse(MemShellResult generateResult, String packResult) { public MemShellGenerateResponse(MemShellResult memShellResult, String packResult) {
this.generateResult = generateResult; this.memShellResult = memShellResult;
this.packResult = packResult; this.packResult = packResult;
} }
public GenerateResponse(MemShellResult generateResult, Map<String, String> allPackResults) { public MemShellGenerateResponse(MemShellResult memShellResult, Map<String, String> allPackResults) {
this.allPackResults = allPackResults; this.allPackResults = allPackResults;
this.generateResult = generateResult; this.memShellResult = memShellResult;
} }
} }
@@ -1,29 +0,0 @@
package com.reajason.javaweb.boot.dto;
import com.reajason.javaweb.probe.ProbeResult;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @author ReaJason
* @since 2025/8/10
*/
@Data
@NoArgsConstructor
public class ProbeGenerateResponse {
private ProbeResult probeResult;
private String packResult;
private Map<String, String> allPackResults;
public ProbeGenerateResponse(ProbeResult probeResult, String packResult) {
this.probeResult = probeResult;
this.packResult = packResult;
}
public ProbeGenerateResponse(ProbeResult probeResult, Map<String, String> allPackResults) {
this.allPackResults = allPackResults;
this.probeResult = probeResult;
}
}
@@ -9,7 +9,7 @@ import lombok.Data;
* @since 2025/8/10 * @since 2025/8/10
*/ */
@Data @Data
public class ProbeGenerateRequest { public class ProbeShellGenerateRequest {
private ProbeConfig probeConfig; private ProbeConfig probeConfig;
private ProbeContentConfigDTO probeContentConfig; private ProbeContentConfigDTO probeContentConfig;
private Packers packer; private Packers packer;
@@ -0,0 +1,29 @@
package com.reajason.javaweb.boot.dto;
import com.reajason.javaweb.probe.ProbeShellResult;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @author ReaJason
* @since 2025/8/10
*/
@Data
@NoArgsConstructor
public class ProbeShellGenerateResponse {
private ProbeShellResult probeShellResult;
private String packResult;
private Map<String, String> allPackResults;
public ProbeShellGenerateResponse(ProbeShellResult probeShellResult, String packResult) {
this.probeShellResult = probeShellResult;
this.packResult = packResult;
}
public ProbeShellGenerateResponse(ProbeShellResult probeShellResult, Map<String, String> allPackResults) {
this.allPackResults = allPackResults;
this.probeShellResult = probeShellResult;
}
}
+8
View File
@@ -1,6 +1,14 @@
plugins { plugins {
id("java") id("java")
id("idea")
} }
idea {
module {
excludeDirs.add(file("src"))
}
}
version = "2.0.0-SNAPSHOT" version = "2.0.0-SNAPSHOT"
tasks.register("publishAllToMavenCentral") { tasks.register("publishAllToMavenCentral") {
+8 -6
View File
@@ -29,17 +29,19 @@ tasks.test {
dependencies { dependencies {
implementation(project(":memshell-party-common")) implementation(project(":memshell-party-common"))
implementation(project(":packer")) implementation(project(":packer"))
implementation(project(":memshell")) implementation(libs.byte.buddy)
implementation(libs.bundles.jna) implementation(libs.asm.commons)
implementation(libs.javax.servlet.api)
implementation(libs.javax.websocket.api) implementation(libs.javax.websocket.api)
implementation(libs.javax.servlet.api)
implementation(libs.spring.webmvc)
implementation(libs.spring.webflux)
implementation(libs.reactor.netty.core)
implementation(libs.bundles.jna)
implementation(libs.bcel) implementation(libs.bcel)
implementation(libs.okhttp3) implementation(libs.okhttp3)
implementation(libs.logback.classic) implementation(libs.logback.classic)
implementation(libs.jackson.databind) implementation(libs.jackson.databind)
implementation(libs.spring.webmvc)
implementation(libs.spring.webflux)
implementation(libs.reactor.netty.core)
testImplementation(libs.junit.jupiter) testImplementation(libs.junit.jupiter)
testRuntimeOnly(libs.junit.platform.launcher) testRuntimeOnly(libs.junit.platform.launcher)
testImplementation(libs.bundles.mockito) testImplementation(libs.bundles.mockito)
@@ -1,24 +0,0 @@
package com.reajason.javaweb;
/**
* @author ReaJason
* @since 2025/8/5
*/
public class Constants {
public static class Server {
public static final String TOMCAT = "Tomcat";
public static final String JETTY = "Jetty";
public static final String UNDERTOW = "Undertow";
public static final String JBOSS = "JBoss";
public static final String RESIN = "Resin";
public static final String WEBLOGIC = "WebLogic";
public static final String WEBSPHERE = "WebSphere";
public static final String GLASSFISH = "GlassFish";
public static final String TONGWEB = "TongWeb";
public static final String BES = "BES";
public static final String INFORSUITE = "InforSuite";
public static final String APUSIC = "Apusic";
public static final String SPRING_WEBFLUX = "SpringWebFlux";
public static final String SPRING_WEBMVC = "SpringWebMvc";
}
}
@@ -0,0 +1,23 @@
package com.reajason.javaweb;
/**
* @author ReaJason
* @since 2025/8/11
*/
public class Server {
public static final String Tomcat = "Tomcat";
public static final String Jetty = "Jetty";
public static final String Undertow = "Undertow";
public static final String JBoss = "JBoss";
public static final String Resin = "Resin";
public static final String WebLogic = "WebLogic";
public static final String WebSphere = "WebSphere";
public static final String GlassFish = "GlassFish";
public static final String TongWeb = "TongWeb";
public static final String BES = "BES";
public static final String InforSuite = "InforSuite";
public static final String Apusic = "Apusic";
public static final String SpringWebMvc = "SpringWebMvc";
public static final String SpringWebFlux = "SpringWebFlux";
public static final String XXLJOB = "XXLJOB";
}
@@ -1,4 +1,4 @@
package com.reajason.javaweb.memshell.generator; package com.reajason.javaweb;
/** /**
* @author ReaJason * @author ReaJason
@@ -4,8 +4,8 @@ import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig; import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.memshell.generator.InjectorGenerator; import com.reajason.javaweb.memshell.generator.InjectorGenerator;
import com.reajason.javaweb.memshell.server.AbstractShell; import com.reajason.javaweb.memshell.server.AbstractServer;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
@@ -18,14 +18,14 @@ import java.util.Map;
public class MemShellGenerator { public class MemShellGenerator {
public static MemShellResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) { public static MemShellResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) {
Server server = shellConfig.getServer(); String serverName = shellConfig.getServer();
AbstractShell shell = server.getShell(); AbstractServer server = ServerFactory.getServer(serverName);
if (shell == null) { if (server == null) {
throw new IllegalArgumentException("Unsupported server: " + server); throw new IllegalArgumentException("Unsupported server: " + serverName);
} }
if (StringUtils.isBlank(shellToolConfig.getShellClassName())) { if (StringUtils.isBlank(shellToolConfig.getShellClassName())) {
shellToolConfig.setShellClassName(CommonUtil.generateShellClassName(server, shellConfig.getShellType())); shellToolConfig.setShellClassName(CommonUtil.generateShellClassName(serverName, shellConfig.getShellType()));
} }
if (StringUtils.isBlank(injectorConfig.getInjectorClassName())) { if (StringUtils.isBlank(injectorConfig.getInjectorClassName())) {
@@ -35,11 +35,11 @@ public class MemShellGenerator {
Class<?> injectorClass = null; Class<?> injectorClass = null;
if (ShellTool.Custom.equals(shellConfig.getShellTool())) { if (ShellTool.Custom.equals(shellConfig.getShellTool())) {
injectorClass = shellConfig.getServer().getShell().getShellInjectorMapping().getInjector(shellConfig.getShellType()); injectorClass = server.getShellInjectorMapping().getInjector(shellConfig.getShellType());
} else { } else {
Pair<Class<?>, Class<?>> shellInjectorPair = shellConfig.getServer().getShell().getShellInjectorPair(shellConfig.getShellTool(), shellConfig.getShellType()); Pair<Class<?>, Class<?>> shellInjectorPair = server.getShellInjectorPair(shellConfig.getShellTool(), shellConfig.getShellType());
if (shellInjectorPair == null) { if (shellInjectorPair == null) {
throw new UnsupportedOperationException(server + " unsupported shell type: " + shellConfig.getShellType() + " for tool: " + shellConfig.getShellTool()); throw new UnsupportedOperationException(serverName + " unsupported shell type: " + shellConfig.getShellType() + " for tool: " + shellConfig.getShellTool());
} }
Class<?> shellClass = shellInjectorPair.getLeft(); Class<?> shellClass = shellInjectorPair.getLeft();
injectorClass = shellInjectorPair.getRight(); injectorClass = shellInjectorPair.getRight();
@@ -1,5 +1,6 @@
package com.reajason.javaweb.memshell; package com.reajason.javaweb.memshell;
import com.reajason.javaweb.Server;
import com.reajason.javaweb.memshell.server.*; import com.reajason.javaweb.memshell.server.*;
import com.reajason.javaweb.memshell.shelltool.antsword.*; import com.reajason.javaweb.memshell.shelltool.antsword.*;
import com.reajason.javaweb.memshell.shelltool.behinder.*; import com.reajason.javaweb.memshell.shelltool.behinder.*;
@@ -7,102 +8,43 @@ import com.reajason.javaweb.memshell.shelltool.command.*;
import com.reajason.javaweb.memshell.shelltool.godzilla.*; import com.reajason.javaweb.memshell.shelltool.godzilla.*;
import com.reajason.javaweb.memshell.shelltool.neoreg.*; import com.reajason.javaweb.memshell.shelltool.neoreg.*;
import com.reajason.javaweb.memshell.shelltool.suo5.*; import com.reajason.javaweb.memshell.shelltool.suo5.*;
import lombok.Getter;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Supplier;
import static com.reajason.javaweb.memshell.ShellType.*; import static com.reajason.javaweb.memshell.ShellType.*;
import static com.reajason.javaweb.memshell.server.ServerToolRegistry.addToolMapping;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/11/22 * @since 2025/8/11
*/ */
@Getter public class ServerFactory {
public enum Server { private static final Map<String, Supplier<AbstractServer>> registry = new ConcurrentHashMap<>();
/** private static final Map<String, AbstractServer> instances = new ConcurrentHashMap<>();
* Tomcat 中间件 private static final List<String> servers = new CopyOnWriteArrayList<>();
*/
Tomcat(new TomcatShell()),
/**
* Jetty 中间件
*/
Jetty(new JettyShell()),
/**
* JBoss 中间件JBoss 6.4-EAP 也使用的当前方式 <a href="https://jbossas.jboss.org/downloads">JBoss AS</a>
*/
JBoss(new JbossShell()),
/**
* Undertow对应是 Wildfly 以及 JBossEAP7也有可能是 SpringBoot 用的
* <a href="https://developers.redhat.com/products/eap/download">JBossEAP</a>
*/
Undertow(new UndertowShell()),
/**
* SpringMVC 框架
*/
SpringWebMvc(new SpringWebMvcShell()),
/**
* Spring WebFlux 框架
*/
SpringWebFlux(new SpringWebFluxShell()),
/**
* WebSphere 中间件
*/
WebSphere(new WebSphereShell()),
/**
* WebLogic 中间件
*/
WebLogic(new WebLogicShell()),
/**
* Resin 中间件<a href="https://caucho.com/products/resin/download">Resin</a>
*/
Resin(new ResinShell()),
/**
* GlassFish 中间件
*/
GlassFish(new GlassFishShell()),
/**
* 宝兰德中间件9.5.2+ 企业版
*/
BES(new BesShell()),
/**
* 东方通中间件
*/
TongWeb(new TongWebShell()),
/**
* 金蝶天燕中间件only 9
*/
Apusic(new ApusicShell()),
/**
* 中创中间件
*/
InforSuite(new InforSuiteShell()),
/**
* 普元中间件
*/
Primeton(new GlassFishShell()),
/**
* XXL-JOB
*/
XXLJOB(new XxlJobShell());
private final AbstractShell shell;
Server(AbstractShell shell) {
this.shell = shell;
}
static { static {
register(Server.Tomcat, Tomcat::new);
register(Server.Jetty, Jetty::new);
register(Server.Undertow, Undertow::new);
register(Server.JBoss, Jboss::new);
register(Server.Resin, Resin::new);
register(Server.WebLogic, WebLogic::new);
register(Server.WebSphere, WebSphere::new);
register(Server.GlassFish, GlassFish::new);
register(Server.TongWeb, TongWeb::new);
register(Server.BES, Bes::new);
register(Server.InforSuite, InforSuite::new);
register(Server.Apusic, Apusic::new);
register(Server.SpringWebMvc, SpringWebMvc::new);
register(Server.SpringWebFlux, SpringWebFlux::new);
register(Server.XXLJOB, XxlJob::new);
addToolMapping(ShellTool.Godzilla, ToolMapping.builder() addToolMapping(ShellTool.Godzilla, ToolMapping.builder()
.addShellClass(SERVLET, GodzillaServlet.class) .addShellClass(SERVLET, GodzillaServlet.class)
.addShellClass(JAKARTA_SERVLET, GodzillaServlet.class) .addShellClass(JAKARTA_SERVLET, GodzillaServlet.class)
@@ -253,4 +195,51 @@ public enum Server {
.addShellClass(WAS_AGENT_FILTER_MANAGER, NeoreGeorg.class) .addShellClass(WAS_AGENT_FILTER_MANAGER, NeoreGeorg.class)
.build()); .build());
} }
}
public static void register(String serverName, Supplier<AbstractServer> shellSupplier) {
if (serverName == null || serverName.trim().isEmpty()) {
throw new IllegalArgumentException("Server name cannot be null or empty.");
}
Supplier<AbstractServer> existing = registry.putIfAbsent(serverName, shellSupplier);
if (existing == null) {
servers.add(serverName);
}
}
public static AbstractServer getServer(String serverName) {
if (serverName == null) {
return null;
}
return instances.computeIfAbsent(serverName, k -> {
Supplier<AbstractServer> supplier = registry.get(k);
if (supplier == null) {
throw new IllegalArgumentException("Unsupported server type: '" + serverName + "'.");
}
return supplier.get();
});
}
public static void addToolMapping(ShellTool shellTool, ToolMapping toolMapping) {
Map<String, Class<?>> rawToolMapping = toolMapping.getShellClassMap();
List<String> supportedServers = ServerFactory.getSupportedServers();
for (String supportedServer : supportedServers) {
AbstractServer server = ServerFactory.getServer(supportedServer);
InjectorMapping shellInjectorMapping = server.getShellInjectorMapping();
Set<String> injectorSupportedShellTypes = shellInjectorMapping.getSupportedShellTypes();
ToolMapping.ToolMappingBuilder toolMappingBuilder = ToolMapping.builder();
for (String shellType : injectorSupportedShellTypes) {
Class<?> shellClass = rawToolMapping.get(shellType);
if (shellClass == null) {
continue;
}
toolMappingBuilder.addShellClass(shellType, shellClass);
}
server.addToolMapping(shellTool, toolMappingBuilder.build());
}
}
public static List<String> getSupportedServers() {
return Collections.unmodifiableList(servers);
}
}
@@ -1,5 +1,6 @@
package com.reajason.javaweb.memshell; package com.reajason.javaweb.memshell;
import com.reajason.javaweb.ShellGenerator;
import com.reajason.javaweb.memshell.config.*; import com.reajason.javaweb.memshell.config.*;
import com.reajason.javaweb.memshell.generator.*; import com.reajason.javaweb.memshell.generator.*;
import com.reajason.javaweb.memshell.generator.command.CommandGenerator; import com.reajason.javaweb.memshell.generator.command.CommandGenerator;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.*; import lombok.*;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.*; import lombok.*;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.*; import lombok.*;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.*; import lombok.*;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@@ -1,6 +1,5 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.Server;
import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.ShellType; import com.reajason.javaweb.memshell.ShellType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@@ -21,7 +20,7 @@ public class ShellConfig {
/** /**
* 目标服务类型 * 目标服务类型
*/ */
private Server server; private String server;
/** /**
* 目标服务版本 * 目标服务版本
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.*; import lombok.*;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@@ -1,5 +1,6 @@
package com.reajason.javaweb.memshell.generator; package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ShellGenerator;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig; import com.reajason.javaweb.memshell.config.ShellToolConfig;
@@ -2,8 +2,8 @@ package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.memshell.config.BehinderConfig; import com.reajason.javaweb.memshell.config.BehinderConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.utils.DigestUtils;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
import org.apache.commons.codec.digest.DigestUtils;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
@@ -1,13 +1,15 @@
package com.reajason.javaweb.memshell.generator; package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ClassBytesShrink; import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.ShellGenerator;
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor; import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper; import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper; import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.memshell.ServerFactory;
import com.reajason.javaweb.memshell.ShellType; import com.reajason.javaweb.memshell.ShellType;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig; import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.memshell.server.AbstractShell; import com.reajason.javaweb.memshell.server.AbstractServer;
import net.bytebuddy.ByteBuddy; import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
@@ -36,14 +38,14 @@ public abstract class ByteBuddyShellGenerator<T extends ShellToolConfig> impleme
.visit(new TargetJreVersionVisitorWrapper(shellConfig.getTargetJreVersion()))); .visit(new TargetJreVersionVisitorWrapper(shellConfig.getTargetJreVersion())));
String shellType = shellConfig.getShellType(); String shellType = shellConfig.getShellType();
AbstractShell shell = shellConfig.getServer().getShell(); AbstractServer server = ServerFactory.getServer(shellConfig.getServer());
if (ShellType.LISTENER.equals(shellType) || ShellType.JAKARTA_LISTENER.equals(shellType)) { if (ShellType.LISTENER.equals(shellType) || ShellType.JAKARTA_LISTENER.equals(shellType)) {
builder = ListenerGenerator.build(builder, shell.getListenerInterceptor(), shellClass, shellClassName); builder = ListenerGenerator.build(builder, server.getListenerInterceptor(), shellClass, shellClassName);
} }
if (ShellType.VALVE.equals(shellType) || ShellType.JAKARTA_VALVE.equals(shellType)) { if (ShellType.VALVE.equals(shellType) || ShellType.JAKARTA_VALVE.equals(shellType)) {
builder = ValveGenerator.build(builder, shell, shellConfig.getServerVersion()); builder = ValveGenerator.build(builder, server, shellConfig.getServerVersion());
} }
if (shellConfig.isJakarta()) { if (shellConfig.isJakarta()) {
@@ -1,10 +1,9 @@
package com.reajason.javaweb.memshell.generator; package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.memshell.config.GodzillaConfig; import com.reajason.javaweb.memshell.config.GodzillaConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.utils.DigestUtils;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
import org.apache.commons.codec.digest.DigestUtils;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
@@ -5,7 +5,7 @@ import com.reajason.javaweb.asm.InnerClassDiscovery;
import com.reajason.javaweb.buddy.*; import com.reajason.javaweb.buddy.*;
import com.reajason.javaweb.memshell.config.InjectorConfig; import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import net.bytebuddy.ByteBuddy; import net.bytebuddy.ByteBuddy;
import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription;
@@ -1,7 +1,7 @@
package com.reajason.javaweb.memshell.generator; package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.buddy.MethodCallReplaceVisitorWrapper; import com.reajason.javaweb.buddy.MethodCallReplaceVisitorWrapper;
import com.reajason.javaweb.memshell.utils.ShellCommonUtil; import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.modifier.Ownership; import net.bytebuddy.description.modifier.Ownership;
import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.description.modifier.Visibility;
@@ -1,9 +1,9 @@
package com.reajason.javaweb.memshell.generator; package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.GenerationException; import com.reajason.javaweb.GenerationException;
import com.reajason.javaweb.memshell.server.AbstractShell; import com.reajason.javaweb.memshell.server.AbstractServer;
import com.reajason.javaweb.memshell.server.BesShell; import com.reajason.javaweb.memshell.server.Bes;
import com.reajason.javaweb.memshell.server.TongWebShell; import com.reajason.javaweb.memshell.server.TongWeb;
import net.bytebuddy.asm.AsmVisitorWrapper; import net.bytebuddy.asm.AsmVisitorWrapper;
import net.bytebuddy.description.field.FieldDescription; import net.bytebuddy.description.field.FieldDescription;
import net.bytebuddy.description.field.FieldList; import net.bytebuddy.description.field.FieldList;
@@ -30,7 +30,7 @@ public class ValveGenerator {
public static final String TONGWEB7_VALVE_PACKAGE = "com.tongweb.catalina"; public static final String TONGWEB7_VALVE_PACKAGE = "com.tongweb.catalina";
public static final String TONGWEB8_VALVE_PACKAGE = "com.tongweb.server"; public static final String TONGWEB8_VALVE_PACKAGE = "com.tongweb.server";
public static DynamicType.Builder<?> build(DynamicType.Builder<?> builder, AbstractShell shell, String serverVersion) { public static DynamicType.Builder<?> build(DynamicType.Builder<?> builder, AbstractServer shell, String serverVersion) {
String packageName = null; String packageName = null;
if (serverVersion.equals("6")) { if (serverVersion.equals("6")) {
packageName = TONGWEB6_VALVE_PACKAGE; packageName = TONGWEB6_VALVE_PACKAGE;
@@ -38,11 +38,11 @@ public class ValveGenerator {
packageName = TONGWEB7_VALVE_PACKAGE; packageName = TONGWEB7_VALVE_PACKAGE;
} else if (serverVersion.equals("8")) { } else if (serverVersion.equals("8")) {
packageName = TONGWEB8_VALVE_PACKAGE; packageName = TONGWEB8_VALVE_PACKAGE;
} else if (shell instanceof BesShell) { } else if (shell instanceof Bes) {
packageName = BES_VALVE_PACKAGE; packageName = BES_VALVE_PACKAGE;
} }
if (StringUtils.isEmpty(packageName)) { if (StringUtils.isEmpty(packageName)) {
if (shell instanceof TongWebShell) { if (shell instanceof TongWeb) {
throw new GenerationException("serverVersion is needed for TongWeb valve shell, please use 6/7/8 for shellConfig.serverVersion"); throw new GenerationException("serverVersion is needed for TongWeb valve shell, please use 6/7/8 for shellConfig.serverVersion");
} }
return builder; return builder;
@@ -6,7 +6,7 @@ import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
import com.reajason.javaweb.memshell.config.CommandConfig; import com.reajason.javaweb.memshell.config.CommandConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.generator.ByteBuddyShellGenerator; import com.reajason.javaweb.memshell.generator.ByteBuddyShellGenerator;
import com.reajason.javaweb.memshell.utils.ShellCommonUtil; import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.modifier.Ownership; import net.bytebuddy.description.modifier.Ownership;
import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.description.modifier.Visibility;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.generator.command; package com.reajason.javaweb.memshell.generator.command;
import com.reajason.javaweb.memshell.utils.ShellCommonUtil; import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
/** /**
@@ -2,12 +2,9 @@ package com.reajason.javaweb.memshell.injector.springwebmvc;
import org.objectweb.asm.*; import org.objectweb.asm.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation; import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain; import java.security.ProtectionDomain;
import java.util.zip.GZIPInputStream;
/** /**
* @author ReaJason * @author ReaJason
@@ -2,12 +2,9 @@ package com.reajason.javaweb.memshell.injector.tomcat;
import org.objectweb.asm.*; import org.objectweb.asm.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation; import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain; import java.security.ProtectionDomain;
import java.util.zip.GZIPInputStream;
/** /**
* @author ReaJason * @author ReaJason
@@ -6,7 +6,10 @@ import java.io.IOException;
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.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
@@ -36,7 +39,6 @@ public class TongWebFilterInjector {
try { try {
Set<Object> contexts = getContext(); Set<Object> contexts = getContext();
for (Object context : contexts) { for (Object context : contexts) {
logger.info(context.getClass().getName());
Object filter = getShell(context); Object filter = getShell(context);
inject(context, filter); inject(context, filter);
} }
@@ -12,7 +12,7 @@ import java.util.Set;
* @author ReaJason * @author ReaJason
* @since 2024/12/7 * @since 2024/12/7
*/ */
public abstract class AbstractShell { public abstract class AbstractServer {
private final Map<ShellTool, ToolMapping> map = new LinkedHashMap<>(); private final Map<ShellTool, ToolMapping> map = new LinkedHashMap<>();
@@ -27,7 +27,7 @@ public abstract class AbstractShell {
return null; return null;
} }
protected void addToolMapping(ShellTool shellTool, ToolMapping mapping) { public void addToolMapping(ShellTool shellTool, ToolMapping mapping) {
map.put(shellTool, mapping); map.put(shellTool, mapping);
} }
@@ -4,9 +4,8 @@ import com.reajason.javaweb.memshell.injector.apusic.ApusicFilterChainAgentInjec
import com.reajason.javaweb.memshell.injector.apusic.ApusicFilterInjector; import com.reajason.javaweb.memshell.injector.apusic.ApusicFilterInjector;
import com.reajason.javaweb.memshell.injector.apusic.ApusicListenerInjector; import com.reajason.javaweb.memshell.injector.apusic.ApusicListenerInjector;
import com.reajason.javaweb.memshell.injector.apusic.ApusicServletInjector; import com.reajason.javaweb.memshell.injector.apusic.ApusicServletInjector;
import com.reajason.javaweb.memshell.utils.ShellCommonUtil; import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import net.bytebuddy.implementation.bytecode.assign.Assigner;
import static com.reajason.javaweb.memshell.ShellType.*; import static com.reajason.javaweb.memshell.ShellType.*;
@@ -14,7 +13,7 @@ import static com.reajason.javaweb.memshell.ShellType.*;
* @author ReaJason * @author ReaJason
* @since 2024/12/27 * @since 2024/12/27
*/ */
public class ApusicShell extends AbstractShell { public class Apusic extends AbstractServer {
public static class ListenerInterceptor { public static class ListenerInterceptor {
@Advice.OnMethodExit @Advice.OnMethodExit
@@ -8,11 +8,11 @@ import static com.reajason.javaweb.memshell.ShellType.*;
* @author ReaJason * @author ReaJason
* @since 2024/12/26 * @since 2024/12/26
*/ */
public class BesShell extends AbstractShell { public class Bes extends AbstractServer {
@Override @Override
public Class<?> getListenerInterceptor() { public Class<?> getListenerInterceptor() {
return TomcatShell.ListenerInterceptor.class; return Tomcat.ListenerInterceptor.class;
} }
@Override @Override
@@ -5,7 +5,7 @@ import com.reajason.javaweb.memshell.injector.glassfish.GlassFishFilterChainAgen
import com.reajason.javaweb.memshell.injector.glassfish.GlassFishFilterInjector; import com.reajason.javaweb.memshell.injector.glassfish.GlassFishFilterInjector;
import com.reajason.javaweb.memshell.injector.glassfish.GlassFishValveInjector; import com.reajason.javaweb.memshell.injector.glassfish.GlassFishValveInjector;
import com.reajason.javaweb.memshell.injector.tomcat.TomcatListenerInjector; import com.reajason.javaweb.memshell.injector.tomcat.TomcatListenerInjector;
import com.reajason.javaweb.memshell.utils.ShellCommonUtil; import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import static com.reajason.javaweb.memshell.ShellType.*; import static com.reajason.javaweb.memshell.ShellType.*;
@@ -14,7 +14,7 @@ import static com.reajason.javaweb.memshell.ShellType.*;
* @author ReaJason * @author ReaJason
* @since 2024/12/12 * @since 2024/12/12
*/ */
public class GlassFishShell extends AbstractShell { public class GlassFish extends AbstractServer {
public static class ListenerInterceptor { public static class ListenerInterceptor {
@@ -4,8 +4,6 @@ import com.reajason.javaweb.memshell.injector.glassfish.GlassFishContextValveAge
import com.reajason.javaweb.memshell.injector.glassfish.GlassFishFilterChainAgentInjector; import com.reajason.javaweb.memshell.injector.glassfish.GlassFishFilterChainAgentInjector;
import com.reajason.javaweb.memshell.injector.glassfish.GlassFishValveInjector; import com.reajason.javaweb.memshell.injector.glassfish.GlassFishValveInjector;
import com.reajason.javaweb.memshell.injector.inforsuite.InforSuiteFilterInjector; import com.reajason.javaweb.memshell.injector.inforsuite.InforSuiteFilterInjector;
import com.reajason.javaweb.memshell.injector.tomcat.TomcatContextValveAgentInjector;
import com.reajason.javaweb.memshell.injector.tomcat.TomcatFilterChainAgentInjector;
import com.reajason.javaweb.memshell.injector.tomcat.TomcatListenerInjector; import com.reajason.javaweb.memshell.injector.tomcat.TomcatListenerInjector;
import static com.reajason.javaweb.memshell.ShellType.*; import static com.reajason.javaweb.memshell.ShellType.*;
@@ -14,11 +12,11 @@ import static com.reajason.javaweb.memshell.ShellType.*;
* @author ReaJason * @author ReaJason
* @since 2024/12/24 * @since 2024/12/24
*/ */
public class InforSuiteShell extends AbstractShell { public class InforSuite extends AbstractServer {
@Override @Override
public Class<?> getListenerInterceptor() { public Class<?> getListenerInterceptor() {
return TomcatShell.ListenerInterceptor.class; return Tomcat.ListenerInterceptor.class;
} }
@Override @Override
@@ -13,11 +13,11 @@ import static com.reajason.javaweb.memshell.ShellType.*;
* @author ReaJason * @author ReaJason
* @since 2024/12/10 * @since 2024/12/10
*/ */
public class JbossShell extends AbstractShell { public class Jboss extends AbstractServer {
@Override @Override
public Class<?> getListenerInterceptor() { public Class<?> getListenerInterceptor() {
return TomcatShell.ListenerInterceptor.class; return Tomcat.ListenerInterceptor.class;
} }
@Override @Override
@@ -4,9 +4,8 @@ import com.reajason.javaweb.memshell.injector.jetty.JettyFilterInjector;
import com.reajason.javaweb.memshell.injector.jetty.JettyHandlerAgentInjector; import com.reajason.javaweb.memshell.injector.jetty.JettyHandlerAgentInjector;
import com.reajason.javaweb.memshell.injector.jetty.JettyListenerInjector; import com.reajason.javaweb.memshell.injector.jetty.JettyListenerInjector;
import com.reajason.javaweb.memshell.injector.jetty.JettyServletInjector; import com.reajason.javaweb.memshell.injector.jetty.JettyServletInjector;
import com.reajason.javaweb.memshell.utils.ShellCommonUtil; import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import net.bytebuddy.implementation.bytecode.assign.Assigner;
import static com.reajason.javaweb.memshell.ShellType.*; import static com.reajason.javaweb.memshell.ShellType.*;
@@ -14,7 +13,7 @@ import static com.reajason.javaweb.memshell.ShellType.*;
* @author ReaJason * @author ReaJason
* @since 2024/12/7 * @since 2024/12/7
*/ */
public class JettyShell extends AbstractShell { public class Jetty extends AbstractServer {
public static class ListenerInterceptor { public static class ListenerInterceptor {
@@ -4,9 +4,8 @@ import com.reajason.javaweb.memshell.injector.resin.ResinFilterChainAgentInjecto
import com.reajason.javaweb.memshell.injector.resin.ResinFilterInjector; import com.reajason.javaweb.memshell.injector.resin.ResinFilterInjector;
import com.reajason.javaweb.memshell.injector.resin.ResinListenerInjector; import com.reajason.javaweb.memshell.injector.resin.ResinListenerInjector;
import com.reajason.javaweb.memshell.injector.resin.ResinServletInjector; import com.reajason.javaweb.memshell.injector.resin.ResinServletInjector;
import com.reajason.javaweb.memshell.utils.ShellCommonUtil; import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import net.bytebuddy.implementation.bytecode.assign.Assigner;
import static com.reajason.javaweb.memshell.ShellType.*; import static com.reajason.javaweb.memshell.ShellType.*;
@@ -14,7 +13,7 @@ import static com.reajason.javaweb.memshell.ShellType.*;
* @author ReaJason * @author ReaJason
* @since 2024/12/14 * @since 2024/12/14
*/ */
public class ResinShell extends AbstractShell { public class Resin extends AbstractServer {
public static class ListenerInterceptor { public static class ListenerInterceptor {
@Advice.OnMethodExit @Advice.OnMethodExit
@@ -1,33 +0,0 @@
package com.reajason.javaweb.memshell.server;
import com.reajason.javaweb.memshell.Server;
import com.reajason.javaweb.memshell.ShellTool;
import java.util.Map;
import java.util.Set;
/**
* @author ReaJason
* @since 2025/2/22
*/
public class ServerToolRegistry {
public static void addToolMapping(ShellTool shellTool, ToolMapping toolMapping) {
Map<String, Class<?>> rawToolMapping = toolMapping.getShellClassMap();
for (Server value : Server.values()) {
AbstractShell shell = value.getShell();
InjectorMapping shellInjectorMapping = shell.getShellInjectorMapping();
Set<String> injectorSupportedShellTypes = shellInjectorMapping.getSupportedShellTypes();
ToolMapping.ToolMappingBuilder toolMappingBuilder = ToolMapping.builder();
for (String shellType : injectorSupportedShellTypes) {
Class<?> shellClass = rawToolMapping.get(shellType);
if (shellClass == null) {
continue;
}
toolMappingBuilder.addShellClass(shellType, shellClass);
}
shell.addToolMapping(shellTool, toolMappingBuilder.build());
}
}
}
@@ -11,7 +11,7 @@ import static com.reajason.javaweb.memshell.ShellType.*;
* @author ReaJason * @author ReaJason
* @since 2024/12/24 * @since 2024/12/24
*/ */
public class SpringWebFluxShell extends AbstractShell { public class SpringWebFlux extends AbstractServer {
@Override @Override
public InjectorMapping getShellInjectorMapping() { public InjectorMapping getShellInjectorMapping() {

Some files were not shown because too many files have changed in this diff Show More