Skip to content

Commit 193201d

Browse files
author
孙健
committed
support filter in class for api
1 parent 4c2fcec commit 193201d

File tree

3 files changed

+86
-123
lines changed

3 files changed

+86
-123
lines changed

src/main/java/org/nlpcn/jcoder/run/mvc/ApiActionChainMaker.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.ArrayList;
44
import java.util.List;
55

6+
import org.nlpcn.jcoder.run.mvc.processor.ApiActionFiltersProcessor;
67
import org.nlpcn.jcoder.run.mvc.processor.ApiAdaptorProcessor;
78
import org.nlpcn.jcoder.run.mvc.processor.ApiCrossOriginProcessor;
89
import org.nlpcn.jcoder.run.mvc.processor.ApiFailProcessor;
@@ -26,7 +27,7 @@ public JcoderActionChain eval(NutConfig config, ActionInfo ai) {
2627
list.add(init(config, ai, new EncodingProcessor())); // 设置编码信息@Encoding
2728
list.add(init(config, ai, new ApiCrossOriginProcessor())) ;//增加跨域支持
2829
list.add(init(config, ai, new ApiModuleProcessor())); // 获取入口类的对象,从ioc或直接new
29-
list.add(init(config, ai, new ActionFiltersProcessor())); // 处理@Filters
30+
list.add(init(config, ai, new ApiActionFiltersProcessor())); // 处理@Filters
3031
list.add(init(config, ai, new ApiAdaptorProcessor())); // 处理@Adaptor
3132
ApiMethodInvokeProcessor apiMethodInvokeProcessor = new ApiMethodInvokeProcessor();
3233
list.add(init(config, ai, apiMethodInvokeProcessor)); // 执行入口方法

src/main/java/org/nlpcn/jcoder/run/mvc/ApiLoadings.java

Lines changed: 14 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.lang.reflect.Method;
55
import java.lang.reflect.Modifier;
66
import java.util.ArrayList;
7+
import java.util.Collections;
78
import java.util.List;
89
import java.util.Map;
910

@@ -49,7 +50,7 @@ public static ActionInfo createInfo(Class<?> type) {
4950
ActionInfo ai = new ActionInfo();
5051
evalEncoding(ai, Mirror.getAnnotationDeep(type, Encoding.class));
5152
evalHttpAdaptor(ai, Mirror.getAnnotationDeep(type, AdaptBy.class));
52-
evalActionFilters(ai, Mirror.getAnnotationDeep(type, Filters.class));
53+
evalActionFilters(ai, Mirror.getAnnotationDeep(type, Filters.class), null);
5354
evalPathMap(ai, Mirror.getAnnotationDeep(type, PathMap.class));
5455
evalOk(ai, Mirror.getAnnotationDeep(type, Ok.class));
5556
evalFail(ai, Mirror.getAnnotationDeep(type, Fail.class));
@@ -73,128 +74,13 @@ public static ActionInfo createInfo(Method method) {
7374
ActionInfo ai = new ActionInfo();
7475
evalEncoding(ai, Mirror.getAnnotationDeep(method, Encoding.class));
7576
evalHttpAdaptor(ai, Mirror.getAnnotationDeep(method, AdaptBy.class));
76-
evalActionFilters(ai, Mirror.getAnnotationDeep(method, Filters.class));
77+
evalActionFilters(ai, Mirror.getAnnotationDeep(ai.getModuleType(), Filters.class), Mirror.getAnnotationDeep(method, Filters.class));
7778
evalActionChainMaker(ai, Mirror.getAnnotationDeep(method, Chain.class));
7879
evalHttpMethod(ai, method, Mirror.getAnnotationDeep(method, Execute.class), Mirror.getAnnotationDeep(method, DefaultExecute.class));
7980
ai.setMethod(method);
8081
return ai;
8182
}
8283

83-
// public static Set<Class<?>> scanModules(Ioc ioc, Class<?> mainModule) {
84-
// Modules ann = mainModule.getAnnotation(Modules.class);
85-
// boolean scan = null == ann ? true : ann.scanPackage();
86-
// // 准备扫描列表
87-
// Set<Class<?>> forScans = new HashSet<Class<?>>();
88-
//
89-
// // 准备存放模块类的集合
90-
// Set<Class<?>> modules = new HashSet<Class<?>>();
91-
//
92-
// // 添加主模块,简直是一定的
93-
// forScans.add(mainModule);
94-
//
95-
// // 根据配置,扩展扫描列表
96-
// if (null != ann) {
97-
// // 指定的类,这些类可以作为种子类,如果 ann.scanPackage 为 true 还要递归搜索所有子包
98-
// for (Class<?> module : ann.value()) {
99-
// forScans.add(module);
100-
// }
101-
//
102-
// // 如果定义了扩展扫描接口 ...
103-
// for (String str : ann.by()) {
104-
// ModuleScanner ms;
105-
// // 扫描器来自 Ioc 容器
106-
// if (str.startsWith("ioc:")) {
107-
// String nm = str.substring("ioc:".length());
108-
// ms = ioc.get(ModuleScanner.class, nm);
109-
// }
110-
// // 扫描器直接无参创建
111-
// else {
112-
// try {
113-
// Class<?> klass = Lang.loadClass(str);
114-
// Mirror<?> mi = Mirror.me(klass);
115-
// ms = (ModuleScanner) mi.born();
116-
// }
117-
// catch (ClassNotFoundException e) {
118-
// throw Lang.wrapThrow(e);
119-
// }
120-
// }
121-
// // 执行扫描,并将结果计入搜索结果
122-
// Collection<Class<?>> col = ms.scan();
123-
// if (null != col)
124-
// for (Class<?> type : col) {
125-
// if (isModule(type)) {
126-
// modules.add(type);
127-
// }
128-
// }
129-
// }
130-
//
131-
// // 扫描包,扫描出的类直接计入结果
132-
// if (ann.packages() != null && ann.packages().length > 0) {
133-
// for (String packageName : ann.packages()) {
134-
// scanModuleInPackage(modules, packageName);
135-
// }
136-
// }
137-
// }
138-
//
139-
// for (Class<?> type : forScans) {
140-
// // mawm 为了兼容maven,根据这个type来加载该type所在jar的加载
141-
// try {
142-
// URL location = type.getProtectionDomain().getCodeSource().getLocation();
143-
// if (log.isDebugEnabled())
144-
// log.debugf("module class location '%s'", location);
145-
// }
146-
// catch (NullPointerException e) {
147-
// // Android上无法拿到getProtectionDomain,just pass
148-
// }
149-
// Scans.me().registerLocation(type);
150-
// }
151-
//
152-
// // 执行扫描
153-
// for (Class<?> type : forScans) {
154-
// // 扫描子包
155-
// if (scan) {
156-
// scanModuleInPackage(modules, type.getPackage().getName());
157-
// }
158-
// // 仅仅加载自己
159-
// else {
160-
// if (isModule(type)) {
161-
// if (log.isDebugEnabled())
162-
// log.debugf(" > add '%s'", type.getName());
163-
// modules.add(type);
164-
// } else if (log.isTraceEnabled()) {
165-
// log.tracef(" > ignore '%s'", type.getName());
166-
// }
167-
// }
168-
// }
169-
// return modules;
170-
// }
171-
172-
// protected static void scanModuleInPackage(Set<Class<?>> modules, String
173-
// packageName) {
174-
// if (log.isDebugEnabled())
175-
// log.debugf(" > scan '%s'", packageName);
176-
//
177-
// List<Class<?>> subs = Scans.me().scanPackage(packageName);
178-
// checkModule(modules, subs);
179-
// }
180-
181-
// /**
182-
// * @param modules
183-
// * @param subs
184-
// */
185-
// private static void checkModule(Set<Class<?>> modules, List<Class<?>>
186-
// subs) {
187-
// for (Class<?> sub : subs) {
188-
// if (isModule(sub)) {
189-
// if (log.isDebugEnabled())
190-
// log.debugf(" >> add '%s'", sub.getName());
191-
// modules.add(sub);
192-
// } else if (log.isTraceEnabled()) {
193-
// log.tracef(" >> ignore '%s'", sub.getName());
194-
// }
195-
// }
196-
// }
197-
19884
public static void evalHttpMethod(ActionInfo ai, Method method, Execute execute, DefaultExecute de) {
19985
if (Mirror.getAnnotationDeep(method, GET.class) != null)
20086
ai.getHttpMethods().add("GET");
@@ -205,12 +91,12 @@ public static void evalHttpMethod(ActionInfo ai, Method method, Execute execute,
20591
if (Mirror.getAnnotationDeep(method, DELETE.class) != null)
20692
ai.getHttpMethods().add("DELETE");
20793

208-
if (execute != null){
94+
if (execute != null) {
20995
for (String m : execute.methods()) {
21096
ai.getHttpMethods().add(m.toUpperCase());
21197
}
21298
}
213-
if (de != null){
99+
if (de != null) {
214100
for (String m : de.methods()) {
215101
ai.getHttpMethods().add(m.toUpperCase());
216102
}
@@ -279,14 +165,20 @@ public static void evalModule(ActionInfo ai, Class<?> type) {
279165
}
280166

281167
@SuppressWarnings({ "unchecked", "rawtypes" })
282-
public static void evalActionFilters(ActionInfo ai, Filters filters) {
168+
public static void evalActionFilters(ActionInfo ai, Filters classFilters, Filters filters) {
169+
List<ObjectInfo<? extends ActionFilter>> list = new ArrayList<ObjectInfo<? extends ActionFilter>>();
170+
if (null != classFilters) {
171+
for (By by : classFilters.value()) {
172+
list.add(new ObjectInfo(by.type(), by.args()));
173+
}
174+
}
283175
if (null != filters) {
284-
List<ObjectInfo<? extends ActionFilter>> list = new ArrayList<ObjectInfo<? extends ActionFilter>>(filters.value().length);
285176
for (By by : filters.value()) {
286177
list.add(new ObjectInfo(by.type(), by.args()));
287178
}
288-
ai.setFilterInfos(list.toArray(new ObjectInfo[list.size()]));
289179
}
180+
ai.setFilterInfos(list.toArray(new ObjectInfo[list.size()]));
181+
290182
}
291183

292184
@SuppressWarnings({ "unchecked", "rawtypes" })
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.nlpcn.jcoder.run.mvc.processor;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import org.nutz.mvc.ActionContext;
7+
import org.nutz.mvc.ActionFilter;
8+
import org.nutz.mvc.ActionInfo;
9+
import org.nutz.mvc.NutConfig;
10+
import org.nutz.mvc.ObjectInfo;
11+
import org.nutz.mvc.Processor;
12+
import org.nutz.mvc.View;
13+
import org.nutz.mvc.impl.processor.AbstractProcessor;
14+
15+
/**
16+
*
17+
* @author zozoh(zozohtnt@gmail.com)
18+
* @author wendal(wendal1985@gmail.com)
19+
* @author ansj
20+
*
21+
*/
22+
public class ApiActionFiltersProcessor extends AbstractProcessor {
23+
24+
protected List<ActionFilter> filters = new ArrayList<ActionFilter>();
25+
26+
protected Processor proxyProcessor;
27+
28+
protected Processor lastProcessor;
29+
30+
public void init(NutConfig config, ActionInfo ai) throws Throwable {
31+
ObjectInfo<? extends ActionFilter>[] filterInfos = ai.getFilterInfos();
32+
if (null != filterInfos) {
33+
for (int i = 0; i < filterInfos.length; i++) {
34+
ActionFilter filter = evalObj(config, filterInfos[i]);
35+
filters.add(filter);
36+
if (filter instanceof Processor) {
37+
Processor processor = (Processor)filter;
38+
if (proxyProcessor == null) {
39+
proxyProcessor = processor;
40+
lastProcessor = processor;
41+
} else {
42+
processor.setNext(proxyProcessor);
43+
proxyProcessor = processor;
44+
}
45+
}
46+
}
47+
}
48+
49+
//取到类中的filter
50+
51+
}
52+
53+
public void process(ActionContext ac) throws Throwable {
54+
for (ActionFilter filter : filters) {
55+
View view = filter.match(ac);
56+
if (null != view) {
57+
ac.setMethodReturn(view);
58+
renderView(ac);
59+
return;
60+
}
61+
}
62+
if (proxyProcessor == null) {
63+
doNext(ac);
64+
} else {
65+
if (lastProcessor != null)
66+
lastProcessor.setNext(next);
67+
proxyProcessor.process(ac);
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)