Skip to content

Commit

Permalink
add swagger
Browse files Browse the repository at this point in the history
  • Loading branch information
yydf committed Sep 23, 2019
1 parent 70193ba commit 458750b
Show file tree
Hide file tree
Showing 13 changed files with 335 additions and 107 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/cn.4coder/struts/badge.svg)](https://maven-badges.herokuapp.com/maven-central/cn.4coder/struts/)
[![GitHub release](https://img.shields.io/github/release/yydf/struts.svg)](https://github.com/yydf/struts/releases)
[![license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://raw.githubusercontent.com/yydf/struts/master/LICENSE)
![Jar Size](https://img.shields.io/badge/jar--size-63.2k-blue.svg)
![Jar Size](https://img.shields.io/badge/jar--size-71.2k-blue.svg)

特性
-------------------------
Expand All @@ -25,7 +25,7 @@
<dependency>
<groupId>cn.4coder</groupId>
<artifactId>struts</artifactId>
<version>0.0.7</version>
<version>0.0.8</version>
</dependency>
```

Expand Down
11 changes: 11 additions & 0 deletions src/main/java/cn/coder/struts/StrutsFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import cn.coder.struts.core.ActionHandler;
import cn.coder.struts.core.StrutsContextResolver;
import cn.coder.struts.core.ViewHandler;
import cn.coder.struts.wrapper.SwaggerWrapper;

/**
* 核心分发请求类 负责处理所有请求,返回相应的结果
Expand All @@ -32,6 +33,7 @@ public final class StrutsFilter implements Filter {
private ActionHandler actionHandler;
private StrutsContextResolver resolver;
private ViewHandler viewHandler;
private SwaggerWrapper swaggerWrapper;

@Override
public void init(FilterConfig filterConfig) throws ServletException {
Expand All @@ -41,6 +43,7 @@ public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = resolver.getEncoding();
this.actionHandler = resolver.getHandler();
this.viewHandler = resolver.getViewHandler();
this.swaggerWrapper = resolver.getSwaggerWrapper();
if (logger.isDebugEnabled()) {
long start = (long) filterConfig.getServletContext().getAttribute("__start");
logger.debug("Struts framework started with {}ms", (System.currentTimeMillis() - start));
Expand All @@ -49,6 +52,9 @@ public void init(FilterConfig filterConfig) throws ServletException {
sb.append("\nstruts.encoding ").append(this.encoding);
sb.append("\nstruts.loaders ").append(resolver.getLoaderNum());
sb.append("\nstruts.actions ").append(this.actionHandler.getActionNum());
if (this.swaggerWrapper != null) {
sb.append("\nstruts.swagger ").append(this.swaggerWrapper.getRequestUrl());
}
sb.append("\nstruts.interceptors ").append(resolver.getInterceptorNum());
logger.debug(sb.toString());
}
Expand All @@ -64,6 +70,11 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
res.setCharacterEncoding(this.encoding);

String path = req.getServletPath();
if (this.swaggerWrapper != null && this.swaggerWrapper.isSwaggerPath(path)) {
res.addHeader("Access-Control-Allow-Origin", "*");
this.viewHandler.handle(this.swaggerWrapper.jsonResult(), req, res);
return;
}
Action action = this.actionHandler.getAction(path);
if (action != null) {
Object result = this.actionHandler.handle(action, req, res);
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/cn/coder/struts/core/Action.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,8 @@ public boolean sameMethod(String method) {
return false;
}

public HttpMethod[] getAllowMethods() {
return this.httpMethods;
}

}
17 changes: 16 additions & 1 deletion src/main/java/cn/coder/struts/core/ActionHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,11 @@
public final class ActionHandler {
private static final Logger logger = LoggerFactory.getLogger(ActionHandler.class);

private Class<?>[] controllers;
private HashMap<String, Action> mappings = new HashMap<>();

public synchronized void init(Class<?>[] controllers, Class<?>[] interceptors, FilterRegistration registration) {
this.controllers = controllers;
// 增加全局Filter
EnumSet<DispatcherType> dispatcherTypes = EnumSet.allOf(DispatcherType.class);
dispatcherTypes.add(DispatcherType.REQUEST);
Expand Down Expand Up @@ -95,7 +97,20 @@ private static void buildInterceptors(Action action, Class<?> controller, Class<
}
}

public Action getAction(String path) {
public void bindSwagger(FilterRegistration registration, String requestUrl) {
// 将swagger的链接,注册到filter
registration.addMappingForUrlPatterns(null, false, requestUrl);
}

public Class<?>[] getControllers() {
return this.controllers;
}

public HashMap<String, Action> getActions() {
return this.mappings;
}

public final Action getAction(String path) {
return mappings.get(path);
}

Expand Down
14 changes: 12 additions & 2 deletions src/main/java/cn/coder/struts/core/StrutsContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,18 @@
import cn.coder.struts.support.ActionSupport;
import cn.coder.struts.support.Interceptor;
import cn.coder.struts.support.StrutsLoader;
import cn.coder.struts.support.SwaggerSupport;
import cn.coder.struts.util.BeanUtils;
import cn.coder.struts.util.ContextUtils;
import cn.coder.struts.wrapper.OrderWrapper;

public final class StrutsContext {

private ServletContext servletContext;
private final List<Class<?>> loaderClasses = new ArrayList<>();
private final List<Class<?>> allClasses = new ArrayList<>();
private final List<Class<?>> interceptors = new ArrayList<>();
private final List<Class<?>> controllers = new ArrayList<>();
private final List<Class<?>> swaggers = new ArrayList<>();

public StrutsContext(ServletContext ctx) {
this.servletContext = ctx;
Expand All @@ -29,7 +30,7 @@ public StrutsContext(ServletContext ctx) {
public void scanPaths(String parent) {
ContextUtils.scanPaths(this, parent);
}

public Set<String> getResourcePaths(String path) {
return this.servletContext.getResourcePaths(path);
}
Expand All @@ -42,6 +43,8 @@ else if (Interceptor.class.isAssignableFrom(clazz))
addClass(interceptors, clazz);
else if (ActionSupport.class.isAssignableFrom(clazz))
addClass(controllers, clazz);
else if (SwaggerSupport.class.isAssignableFrom(clazz))
addClass(swaggers, clazz);
else {

}
Expand Down Expand Up @@ -75,6 +78,13 @@ public Class<?>[] getControllers() {
return BeanUtils.toArray(this.controllers);
}

public Class<?> getSwagger() {
Class<?>[] arr = BeanUtils.toArray(this.swaggers);
if (arr.length > 0)
return arr[0];
return null;
}

public synchronized void clear() {
Aop.clear();
this.servletContext = null;
Expand Down
45 changes: 26 additions & 19 deletions src/main/java/cn/coder/struts/core/StrutsContextResolver.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,28 @@
package cn.coder.struts.core;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.coder.struts.aop.Aop;
import cn.coder.struts.aop.AopFactory;
import cn.coder.struts.support.StrutsLoader;
import cn.coder.struts.util.Streams;
import cn.coder.struts.wrapper.SwaggerWrapper;

public final class StrutsContextResolver {
private static final Logger logger = LoggerFactory.getLogger(StrutsContextResolver.class);

private String encoding = "utf-8";
private StrutsContext context;
private ServletContext servletContext;
private List<StrutsLoader> loaders;
private Class<?>[] interceptors;
private FilterRegistration registration;
private ActionHandler handler;
private ViewHandler viewHandler;
private SwaggerWrapper swaggerWrapper;

public StrutsContextResolver(ServletContext ctx) {
this.servletContext = ctx;
Expand All @@ -38,20 +35,12 @@ public synchronized void init() {
initLoader();
initInterceptor();
initHandler();
initSwagger();
}

private void initConfig() {
try {
InputStream input = StrutsContextResolver.class.getClassLoader().getResourceAsStream("struts.properties");
if (input != null) {
Properties p = new Properties();
p.load(input);
input.close();
this.encoding = p.getProperty("encoding", "utf-8");
}
} catch (IOException e) {
logger.error("Load struts.properties faild", e);
}
Properties p = Streams.loadProperties("struts.properties");
this.encoding = p.getProperty("encoding", "utf-8");
}

private void initAop() {
Expand All @@ -73,14 +62,23 @@ private void initInterceptor() {
}

private void initHandler() {
FilterRegistration registration = servletContext.getFilterRegistration("StrutsFilter");
this.registration = servletContext.getFilterRegistration("StrutsFilter");
Class<?>[] controllers = context.getControllers();
this.handler = new ActionHandler();
this.handler.init(controllers, this.interceptors, registration);

this.viewHandler = new ViewHandler(this.encoding);
}

private void initSwagger() {
Class<?> swaggerClazz = context.getSwagger();
if (swaggerClazz != null) {
String templete = Streams.asString("swagger.tpl");
this.swaggerWrapper = new SwaggerWrapper(swaggerClazz, templete, this.handler);
this.handler.bindSwagger(registration, swaggerWrapper.getRequestUrl());
}
}

public synchronized void start() {
if (loaders != null) {
for (StrutsLoader loader : loaders) {
Expand Down Expand Up @@ -109,11 +107,20 @@ public ViewHandler getViewHandler() {
return this.viewHandler;
}

public SwaggerWrapper getSwaggerWrapper() {
return this.swaggerWrapper;
}

public synchronized void destroy() {
this.encoding = null;
this.servletContext = null;
this.interceptors = null;
this.registration = null;
this.handler.clear();
if (this.swaggerWrapper != null) {
this.swaggerWrapper.clear();
this.swaggerWrapper = null;
}
this.viewHandler = null;
if (this.loaders != null) {
for (StrutsLoader loader : loaders) {
Expand Down
1 change: 0 additions & 1 deletion src/main/java/cn/coder/struts/core/ViewHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ public void handle(Object result, HttpServletRequest req, HttpServletResponse re
if (!StringUtils.isEmpty(callback))
json = callback + "(" + json + ")";
renderText(json, this.encoding, supportGzip, res);
((JSONMap) result).clear();
if (logger.isDebugEnabled()) {
if (json.length() > LOG_LIMIIT)
logger.debug("[JSON]" + json.substring(0, LOG_LIMIIT) + "...");
Expand Down
1 change: 1 addition & 0 deletions src/main/java/cn/coder/struts/support/ActionSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public void init(HttpServletRequest req, HttpServletResponse res) {
}
}

@Override
public abstract String processMultipartFile(MultipartFile file);

protected HttpSession getSession() {
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/cn/coder/struts/support/SwaggerSupport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package cn.coder.struts.support;

public interface SwaggerSupport {

String getUrl();

String getHost();

}
Loading

0 comments on commit 458750b

Please sign in to comment.