Skip to content

Commit 749c978

Browse files
committed
refactor: use processors
1 parent b429983 commit 749c978

File tree

13 files changed

+235
-134
lines changed

13 files changed

+235
-134
lines changed
Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
package com.reajason.javaweb.memshell.generator;
22

3-
import com.reajason.javaweb.ClassBytesShrink;
43
import com.reajason.javaweb.GenerationException;
54
import com.reajason.javaweb.ShellGenerator;
6-
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
7-
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
85
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
9-
import com.reajason.javaweb.memshell.ServerFactory;
10-
import com.reajason.javaweb.memshell.ShellType;
116
import com.reajason.javaweb.memshell.config.ShellConfig;
127
import com.reajason.javaweb.memshell.config.ShellToolConfig;
13-
import com.reajason.javaweb.memshell.server.AbstractServer;
14-
import com.reajason.javaweb.memshell.server.Jetty;
158
import net.bytebuddy.description.type.TypeDescription;
169
import net.bytebuddy.dynamic.DynamicType;
1710

@@ -35,43 +28,21 @@ public byte[] getBytes() {
3528
DynamicType.Builder<?> builder = getBuilder();
3629
String shellClassName = shellToolConfig.getShellClassName();
3730
Class<?> shellClass = shellToolConfig.getShellClass();
31+
3832
if (shellClass != null) {
3933
shellToolConfig.setShellTypeDescription(TypeDescription.ForLoadedType.of(shellClass));
4034
}
35+
4136
if (shellToolConfig.getShellTypeDescription() == null) {
4237
throw new GenerationException("shellClass or shellTypeDescription could not be null.");
4338
}
4439

45-
String shellType = shellConfig.getShellType();
46-
AbstractServer server = ServerFactory.getServer(shellConfig.getServer());
47-
48-
if (ShellType.LISTENER.equals(shellType) || ShellType.JAKARTA_LISTENER.equals(shellType)) {
49-
builder = ListenerGenerator.build(builder, server.getListenerInterceptor(), shellToolConfig.getShellTypeDescription(), shellClassName);
50-
}
51-
52-
if (ShellType.VALVE.equals(shellType) || ShellType.JAKARTA_VALVE.equals(shellType)) {
53-
builder = ValveGenerator.build(builder, server, shellConfig.getServerVersion());
54-
}
55-
56-
if (server instanceof Jetty
57-
&& (ShellType.HANDLER.equals(shellType) || ShellType.JAKARTA_HANDLER.equals(shellType))) {
58-
builder = JettyHandlerGenerator.build(builder, shellConfig.getServerVersion());
59-
}
60-
61-
if (shellConfig.isJakarta()) {
62-
builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE);
63-
}
64-
65-
if (shellConfig.isDebugOff()) {
66-
builder = LogRemoveMethodVisitor.extend(builder);
67-
}
68-
69-
builder = builder
40+
builder = ProcessorRegistry.applyBuilderProcessors(builder, shellConfig, shellToolConfig)
7041
.name(shellClassName)
7142
.visit(new TargetJreVersionVisitorWrapper(shellConfig.getTargetJreVersion()));
7243

7344
try (DynamicType.Unloaded<?> unloaded = builder.make()) {
74-
return ClassBytesShrink.shrink(unloaded.getBytes(), shellConfig.isShrink());
45+
return ProcessorRegistry.applyByteProcessors(unloaded.getBytes(), shellConfig, shellToolConfig);
7546
}
7647
}
7748
}

generator/src/main/java/com/reajason/javaweb/memshell/generator/JettyHandlerGenerator.java

Lines changed: 0 additions & 85 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.reajason.javaweb.memshell.generator;
2+
3+
import com.reajason.javaweb.memshell.config.ShellConfig;
4+
import com.reajason.javaweb.memshell.config.ShellToolConfig;
5+
6+
/**
7+
* @author ReaJason
8+
* @since 2025/12/7
9+
*/
10+
public interface Processor<T> {
11+
T process(T input, ShellConfig shellConfig, ShellToolConfig shellToolConfig);
12+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.reajason.javaweb.memshell.generator;
2+
3+
import com.reajason.javaweb.memshell.config.ShellConfig;
4+
import com.reajason.javaweb.memshell.config.ShellToolConfig;
5+
import com.reajason.javaweb.memshell.generator.processors.*;
6+
import net.bytebuddy.dynamic.DynamicType;
7+
8+
import java.util.Arrays;
9+
import java.util.List;
10+
11+
/**
12+
* @author ReaJason
13+
* @since 2025/12/7
14+
*/
15+
public final class ProcessorRegistry {
16+
17+
private static final List<Processor<DynamicType.Builder<?>>> BUILDER_PROCESSORS = Arrays.asList(
18+
new ListenerBuilderModifier(),
19+
new ValveBuilderModifier(),
20+
new JakartaBuilderModifier(),
21+
new DebugOffBuilderModifier()
22+
);
23+
24+
private static final List<Processor<byte[]>> BYTE_PROCESSORS = Arrays.asList(
25+
new ShrinkPostProcessor(),
26+
new JettyHandlerPostProcessor()
27+
);
28+
29+
private ProcessorRegistry() {
30+
// Prevent instantiation
31+
}
32+
33+
public static DynamicType.Builder<?> applyBuilderProcessors(
34+
DynamicType.Builder<?> builder,
35+
ShellConfig shellConfig,
36+
ShellToolConfig shellToolConfig) {
37+
for (Processor<DynamicType.Builder<?>> processor : BUILDER_PROCESSORS) {
38+
builder = processor.process(builder, shellConfig, shellToolConfig);
39+
}
40+
return builder;
41+
}
42+
43+
public static byte[] applyByteProcessors(
44+
byte[] bytes,
45+
ShellConfig shellConfig,
46+
ShellToolConfig shellToolConfig) {
47+
for (Processor<byte[]> processor : BYTE_PROCESSORS) {
48+
bytes = processor.process(bytes, shellConfig, shellToolConfig);
49+
}
50+
return bytes;
51+
}
52+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.reajason.javaweb.memshell.generator.processors;
2+
3+
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
4+
import com.reajason.javaweb.memshell.config.ShellConfig;
5+
import com.reajason.javaweb.memshell.config.ShellToolConfig;
6+
import com.reajason.javaweb.memshell.generator.Processor;
7+
import net.bytebuddy.dynamic.DynamicType;
8+
9+
/**
10+
* @author ReaJason
11+
* @since 2025/12/7
12+
*/
13+
public class DebugOffBuilderModifier implements Processor<DynamicType.Builder<?>> {
14+
15+
@Override
16+
public DynamicType.Builder<?> process(DynamicType.Builder<?> builder, ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
17+
if (shellConfig.isDebugOff()) {
18+
builder = LogRemoveMethodVisitor.extend(builder);
19+
}
20+
return builder;
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.reajason.javaweb.memshell.generator.processors;
2+
3+
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
4+
import com.reajason.javaweb.memshell.config.ShellConfig;
5+
import com.reajason.javaweb.memshell.config.ShellToolConfig;
6+
import com.reajason.javaweb.memshell.generator.Processor;
7+
import net.bytebuddy.dynamic.DynamicType;
8+
9+
/**
10+
* @author ReaJason
11+
* @since 2025/12/7
12+
*/
13+
public class JakartaBuilderModifier implements Processor<DynamicType.Builder<?>> {
14+
15+
@Override
16+
public DynamicType.Builder<?> process(DynamicType.Builder<?> builder, ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
17+
if (shellConfig.isJakarta()) {
18+
builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE);
19+
}
20+
return builder;
21+
}
22+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.reajason.javaweb.memshell.generator.processors;
2+
3+
import com.reajason.javaweb.GenerationException;
4+
import com.reajason.javaweb.asm.ClassRenameUtils;
5+
import com.reajason.javaweb.asm.ClassSuperClassUtils;
6+
import com.reajason.javaweb.memshell.ServerFactory;
7+
import com.reajason.javaweb.memshell.ShellType;
8+
import com.reajason.javaweb.memshell.config.ShellConfig;
9+
import com.reajason.javaweb.memshell.config.ShellToolConfig;
10+
import com.reajason.javaweb.memshell.generator.Processor;
11+
import com.reajason.javaweb.memshell.server.AbstractServer;
12+
import com.reajason.javaweb.memshell.server.Jetty;
13+
14+
/**
15+
* @author ReaJason
16+
* @since 2025/12/7
17+
*/
18+
public class JettyHandlerPostProcessor implements Processor<byte[]> {
19+
20+
@Override
21+
public byte[] process(byte[] bytes, ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
22+
AbstractServer server = ServerFactory.getServer(shellConfig.getServer());
23+
String shellType = shellConfig.getShellType();
24+
if (server instanceof Jetty
25+
&& (ShellType.HANDLER.equals(shellType)
26+
|| ShellType.JAKARTA_HANDLER.equals(shellType))
27+
) {
28+
String superClassName = null;
29+
String serverVersion = shellConfig.getServerVersion();
30+
if (serverVersion != null) {
31+
switch (serverVersion) {
32+
case "6":
33+
superClassName = "org/mortbay/jetty/handler/AbstractHandler";
34+
bytes = ClassRenameUtils.relocateClass(bytes, "org/eclipse/jetty/server", "org/mortbay/jetty");
35+
break;
36+
case "7+":
37+
superClassName = "org/eclipse/jetty/server/handler/AbstractHandler";
38+
break;
39+
case "12":
40+
superClassName = "org/eclipse/jetty/server/Handler$Abstract";
41+
break;
42+
}
43+
}
44+
if (superClassName == null) {
45+
throw new GenerationException("serverVersion is needed for Jetty Handler or unknow serverVersion: [" + serverVersion + "], please use one of ['6', '7+', '12'] for shellConfig.serverVersion");
46+
}
47+
return ClassSuperClassUtils.addSuperClass(bytes, superClassName);
48+
}
49+
return bytes;
50+
}
51+
}

generator/src/main/java/com/reajason/javaweb/memshell/generator/ListenerGenerator.java renamed to generator/src/main/java/com/reajason/javaweb/memshell/generator/processors/ListenerBuilderModifier.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
package com.reajason.javaweb.memshell.generator;
1+
package com.reajason.javaweb.memshell.generator.processors;
22

33
import com.reajason.javaweb.GenerationException;
44
import com.reajason.javaweb.buddy.MethodCallReplaceVisitorWrapper;
5+
import com.reajason.javaweb.memshell.ServerFactory;
6+
import com.reajason.javaweb.memshell.ShellType;
7+
import com.reajason.javaweb.memshell.config.ShellConfig;
8+
import com.reajason.javaweb.memshell.config.ShellToolConfig;
9+
import com.reajason.javaweb.memshell.generator.Processor;
10+
import com.reajason.javaweb.memshell.server.AbstractServer;
511
import com.reajason.javaweb.utils.ShellCommonUtil;
612
import net.bytebuddy.asm.Advice;
713
import net.bytebuddy.description.method.MethodDescription;
@@ -18,12 +24,26 @@
1824

1925
/**
2026
* @author ReaJason
21-
* @since 2025/2/22
27+
* @since 2025/12/7
2228
*/
23-
public class ListenerGenerator {
29+
public class ListenerBuilderModifier implements Processor<DynamicType.Builder<?>> {
2430

25-
public static DynamicType.Builder<?> build(DynamicType.Builder<?> builder, Class<?> implInterceptor,
26-
TypeDescription typeDefinition, String newClassName) {
31+
@Override
32+
public DynamicType.Builder<?> process(DynamicType.Builder<?> builder, ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
33+
String shellType = shellConfig.getShellType();
34+
if (ShellType.LISTENER.equals(shellType) || ShellType.JAKARTA_LISTENER.equals(shellType)) {
35+
AbstractServer server = ServerFactory.getServer(shellConfig.getServer());
36+
String shellClassName = shellToolConfig.getShellClassName();
37+
builder = modifier(builder,
38+
server.getListenerInterceptor(),
39+
shellToolConfig.getShellTypeDescription(),
40+
shellClassName);
41+
}
42+
return builder;
43+
}
44+
45+
public static DynamicType.Builder<?> modifier(DynamicType.Builder<?> builder, Class<?> implInterceptor,
46+
TypeDescription typeDefinition, String newClassName) {
2747
MethodList<MethodDescription.InDefinedShape> methods = typeDefinition.getDeclaredMethods();
2848

2949
if (methods.filter(ElementMatchers.named("getResponseFromRequest")
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.reajason.javaweb.memshell.generator.processors;
2+
3+
import com.reajason.javaweb.ClassBytesShrink;
4+
import com.reajason.javaweb.memshell.config.ShellConfig;
5+
import com.reajason.javaweb.memshell.config.ShellToolConfig;
6+
import com.reajason.javaweb.memshell.generator.Processor;
7+
8+
/**
9+
* @author ReaJason
10+
* @since 2025/12/7
11+
*/
12+
public class ShrinkPostProcessor implements Processor<byte[]> {
13+
14+
@Override
15+
public byte[] process(byte[] bytes, ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
16+
return ClassBytesShrink.shrink(bytes, shellConfig.isShrink());
17+
}
18+
}

0 commit comments

Comments
 (0)