Skip to content

Commit 54301ba

Browse files
committed
HandlerEnhancer unit tested
1 parent cbd915e commit 54301ba

97 files changed

Lines changed: 2128 additions & 614 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

pom.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,16 @@
144144
<version>4.4.1</version>
145145
</dependency>
146146

147+
<dependency>
148+
<groupId>com.esotericsoftware</groupId>
149+
<artifactId>reflectasm</artifactId>
150+
<version>1.10.0</version>
151+
</dependency>
152+
147153
<dependency>
148154
<groupId>org.osgl</groupId>
149155
<artifactId>osgl-tool</artifactId>
150-
<version>0.4-SNAPSHOT</version>
156+
<version>0.4.3-SNAPSHOT</version>
151157
</dependency>
152158

153159
<dependency>

src/main/java/org/osgl/oms/BootstrapClassLoader.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import org.osgl._;
44
import org.osgl.oms.asm.ClassReader;
5-
import org.osgl.oms.asm.ClassVisitor;
65
import org.osgl.oms.asm.ClassWriter;
76
import org.osgl.oms.util.BytecodeVisitor;
87
import org.osgl.oms.util.Jars;
@@ -134,7 +133,7 @@ private Class<?> loadOmsClass(String name, boolean resolve, boolean pluginOnly)
134133

135134
if (null == c) {
136135
_.Var<ClassWriter> cw = _.val(null);
137-
BytecodeVisitor enhancer = OMS.enhancerManager().generalAsmEnhancer(name, cw);
136+
BytecodeVisitor enhancer = OMS.enhancerManager().generalEnhancer(name, cw);
138137
if (null == enhancer) {
139138
c = super.defineClass(name, ba, 0, ba.length, DOMAIN);
140139
} else {

src/main/java/org/osgl/oms/BytecodeEnhancerManager.java

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,68 @@
11
package org.osgl.oms;
22

33
import org.osgl._;
4-
import org.osgl.oms.OMS;
5-
import org.osgl.oms.asm.ClassVisitor;
4+
import org.osgl.oms.app.App;
65
import org.osgl.oms.asm.ClassWriter;
6+
import org.osgl.oms.controller.bytecode.ControllerEnhancer;
7+
import org.osgl.oms.util.AppBytecodeEnhancer;
78
import org.osgl.oms.util.AsmBytecodeEnhancer;
89
import org.osgl.oms.util.BytecodeVisitor;
9-
import org.osgl.oms.util.PredicatableBytecodeVisitor;
1010
import org.osgl.util.C;
1111

1212
import java.util.List;
1313

1414
public class BytecodeEnhancerManager {
15-
private List<AsmBytecodeEnhancer> appEnhancers = C.newList();
15+
private List<AppBytecodeEnhancer> appEnhancers = C.newList();
1616
private List<AsmBytecodeEnhancer> generalEnhancers = C.newList();
1717

18+
public BytecodeEnhancerManager() {
19+
registerBuiltInPlugins();
20+
}
21+
1822
public void register(AsmBytecodeEnhancer enhancer) {
19-
if (enhancer.isTargetClass(OMS.class.getName())) {
20-
generalEnhancers.add(enhancer);
23+
if (enhancer instanceof AppBytecodeEnhancer) {
24+
appEnhancers.add((AppBytecodeEnhancer) enhancer);
2125
} else {
22-
appEnhancers.add(enhancer);
26+
generalEnhancers.add(enhancer);
2327
}
2428
}
2529

26-
public BytecodeVisitor appAsmEnhancer(String className, _.Var<ClassWriter> cw) {
27-
return buildAsmEnhancer(appEnhancers, className, cw);
30+
public void register(AppBytecodeEnhancer enhancer) {
31+
appEnhancers.add(enhancer);
32+
}
33+
34+
public BytecodeVisitor appEnhancer(App app, String className, _.Var<ClassWriter> cw) {
35+
List<AppBytecodeEnhancer> l = appFilter(app, className);
36+
return l.isEmpty() ? null : BytecodeVisitor.chain(cw, l);
2837
}
2938

30-
public BytecodeVisitor generalAsmEnhancer(String className, _.Var<ClassWriter> cw) {
31-
return buildAsmEnhancer(generalEnhancers, className, cw);
39+
public BytecodeVisitor generalEnhancer(String className, _.Var<ClassWriter> cw) {
40+
List<AsmBytecodeEnhancer> l = generalFilter(className);
41+
return l.isEmpty() ? null : BytecodeVisitor.chain(cw, l);
3242
}
3343

34-
private BytecodeVisitor buildAsmEnhancer(List<AsmBytecodeEnhancer> list, String className, _.Var<ClassWriter> cw) {
35-
List<AsmBytecodeEnhancer> filtered = filter(className, list);
36-
return filtered.isEmpty() ? null : BytecodeVisitor.chain(cw, filtered);
44+
private void registerBuiltInPlugins() {
45+
register(new ControllerEnhancer());
46+
}
47+
48+
private List<AppBytecodeEnhancer> appFilter(App app, String className) {
49+
List<AppBytecodeEnhancer> l = C.newList();
50+
for (AppBytecodeEnhancer e : appEnhancers) {
51+
AppBytecodeEnhancer e0 = (AppBytecodeEnhancer)e.clone();
52+
e0.app(app);
53+
if (e0.isTargetClass(className)) {
54+
l.add(e0);
55+
}
56+
}
57+
return l;
3758
}
3859

39-
private List<AsmBytecodeEnhancer> filter(String className, List<AsmBytecodeEnhancer> list) {
60+
private List<AsmBytecodeEnhancer> generalFilter(String className) {
4061
List<AsmBytecodeEnhancer> l = C.newList();
41-
for (AsmBytecodeEnhancer e : list) {
42-
if (e.isTargetClass(className)) {
43-
l.add(e);
62+
for (AsmBytecodeEnhancer e : generalEnhancers) {
63+
AsmBytecodeEnhancer e0 = e.clone();
64+
if (e0.isTargetClass(className)) {
65+
l.add(e0.clone());
4466
}
4567
}
4668
return l;

src/main/java/org/osgl/oms/OMS.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44
import org.osgl.exception.NotAppliedException;
55
import org.osgl.logging.L;
66
import org.osgl.logging.Logger;
7+
import org.osgl.oms.controller.meta.CatchMethodMetaInfo;
8+
import org.osgl.oms.handler.builtin.controller.*;
79
import org.osgl.oms.app.*;
810
import org.osgl.oms.conf.OmsConfLoader;
911
import org.osgl.oms.conf.OmsConfig;
12+
import org.osgl.oms.controller.meta.ActionMethodMetaInfo;
13+
import org.osgl.oms.controller.meta.InterceptorMethodMetaInfo;
14+
import org.osgl.oms.handler.builtin.controller.impl.ReflectedHandlerInvoker;
1015
import org.osgl.oms.plugin.PluginScanner;
1116
import org.osgl.oms.util.Banner;
1217
import org.osgl.util.E;
@@ -51,6 +56,26 @@ public AppClassLoader classLoader(App app) {
5156
return new AppClassLoader(app);
5257
}
5358

59+
public ControllerAction createRequestHandler(ActionMethodMetaInfo action, App app) {
60+
return ReflectedHandlerInvoker.createControllerAction(action, app);
61+
}
62+
63+
public BeforeInterceptor createBeforeInterceptor(InterceptorMethodMetaInfo before, App app) {
64+
return ReflectedHandlerInvoker.createBeforeInterceptor(before, app);
65+
}
66+
67+
public AfterInterceptor createAfterInterceptor(InterceptorMethodMetaInfo after, App app) {
68+
return ReflectedHandlerInvoker.createAfterInterceptor(after, app);
69+
}
70+
71+
public ExceptionInterceptor createExceptionInterceptor(CatchMethodMetaInfo ex, App app) {
72+
return ReflectedHandlerInvoker.createExceptionInterceptor(ex, app);
73+
}
74+
75+
public FinallyInterceptor createFinallyInterceptor(InterceptorMethodMetaInfo fin, App app) {
76+
return ReflectedHandlerInvoker.createFinannyInterceptor(fin, app);
77+
}
78+
5479
public static Mode valueOfIgnoreCase(String mode) {
5580
return valueOf(mode.trim().toUpperCase());
5681
}
@@ -120,7 +145,7 @@ private static void initExecuteService() {
120145
E.tbd("init execute service");
121146
}
122147

123-
private static void initEnhancerManager() {
148+
static void initEnhancerManager() {
124149
enhancerManager = new BytecodeEnhancerManager();
125150
}
126151

src/main/java/org/osgl/oms/action/ActionHandlerBase.java

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/main/java/org/osgl/oms/action/ActionHandlerResolver.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/main/java/org/osgl/oms/action/ActionHandlerResolverBase.java

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/main/java/org/osgl/oms/app/App.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private void loadConfig() {
114114
}
115115

116116
private void initRouter() {
117-
router = new Router(config);
117+
router = new Router(this);
118118
}
119119

120120
private void loadRoutes() {

src/main/java/org/osgl/oms/app/AppClassLoader.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.osgl.oms.asm.ClassWriter;
1010
import org.osgl.oms.conf.AppConfig;
1111
import org.osgl.oms.controller.bytecode.ControllerScanner;
12+
import org.osgl.oms.controller.meta.ControllerClassMetaInfoHolder;
13+
import org.osgl.oms.controller.meta.ControllerClassMetaInfo;
1214
import org.osgl.oms.controller.meta.ControllerClassMetaInfoManager;
1315
import org.osgl.oms.util.BytecodeVisitor;
1416
import org.osgl.oms.util.Files;
@@ -30,7 +32,7 @@
3032
/**
3133
* The top level class loader to load a specific application classes into JVM
3234
*/
33-
public class AppClassLoader extends ClassLoader {
35+
public class AppClassLoader extends ClassLoader implements ControllerClassMetaInfoHolder {
3436
protected final static Logger logger = L.get(AppClassLoader.class);
3537
private App app;
3638
private Map<String, byte[]> libClsCache = C.newMap();
@@ -63,6 +65,10 @@ public boolean isSourceClass(String className) {
6365
return false;
6466
}
6567

68+
public ControllerClassMetaInfo controllerClassMetaInfo(String controllerClassName) {
69+
return ctrlInfo.controllerMetaInfo(controllerClassName);
70+
}
71+
6672
@Override
6773
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
6874
Class<?> c = findLoadedClass(name);
@@ -149,7 +155,7 @@ protected byte[] enhance(String className, byte[] bytecode) {
149155

150156
private byte[] asmEnhance(String className, byte[] bytecode) {
151157
_.Var<ClassWriter> cw = _.var(null);
152-
BytecodeVisitor enhancer = OMS.enhancerManager().appAsmEnhancer(className, cw);
158+
BytecodeVisitor enhancer = OMS.enhancerManager().appEnhancer(app, className, cw);
153159
if (null == enhancer) {
154160
return bytecode;
155161
}

src/main/java/org/osgl/oms/app/AppContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,10 @@ public static AppContext get() {
238238
return _local.get();
239239
}
240240

241+
public static void clear() {
242+
_local.remove();
243+
}
244+
241245
/**
242246
* Create an new {@code AppContext} and return the new instance
243247
*/

0 commit comments

Comments
 (0)