From 358a50ecc7ae02a3bdd06da498c079549eb35328 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Fri, 19 May 2017 12:53:28 +0800 Subject: [PATCH] --- src/org/redkale/net/PrepareServlet.java | 67 ++++++++++++++++++------ src/org/redkale/net/http/HttpServer.java | 27 +++++++++- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index eb0795d28..0a53ea50a 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -10,6 +10,7 @@ import java.nio.*; import java.nio.channels.*; import java.util.*; import java.util.concurrent.atomic.*; +import java.util.function.Predicate; import java.util.logging.*; import org.redkale.util.*; @@ -42,7 +43,7 @@ public abstract class PrepareServlet mappings = new HashMap<>(); - private List> filters = new ArrayList<>(); + private final List> filters = new ArrayList<>(); protected Filter headFilter; @@ -68,32 +69,68 @@ public abstract class PrepareServlet filter : filters) { - filter.init(context, config); - } - this.headFilter = filters.get(0); - Filter filter = this.headFilter; - for (int i = 1; i < filters.size(); i++) { - filter._next = filters.get(i); - filter = filter._next; + synchronized (filters) { + if (!filters.isEmpty()) { + Collections.sort(filters); + for (Filter filter : filters) { + filter.init(context, config); + } + this.headFilter = filters.get(0); + Filter filter = this.headFilter; + for (int i = 1; i < filters.size(); i++) { + filter._next = filters.get(i); + filter = filter._next; + } } } } @Override public void destroy(C context, AnyValue config) { - if (filters != null && !filters.isEmpty()) { - for (Filter filter : filters) { - filter.destroy(context, config); + synchronized (filters) { + if (!filters.isEmpty()) { + for (Filter filter : filters) { + filter.destroy(context, config); + } } } } public void addFilter(Filter filter, AnyValue conf) { filter._conf = conf; - this.filters.add(filter); + synchronized (filters) { + this.filters.add(filter); + } + } + + public Filter removeFilter(Class> filterClass) { + return removeFilter(f -> filterClass.equals(f.getClass())); + } + + public Filter removeFilter(String filterName) { + return removeFilter(f -> filterName.equals(f.resourceName())); + } + + public Filter removeFilter(Predicate> predicate) { + if (this.headFilter == null || predicate == null) return null; + synchronized (filters) { + Filter filter = this.headFilter; + Filter prev = null; + do { + if (predicate.test(filter)) break; + prev = filter; + } while ((filter = filter._next) != null); + if (filter != null) { + if (prev == null) { + this.headFilter = filter._next; + } else { + prev._next = filter._next; + } + filter._next = null; + this.filters.remove(filter); + } + return filter; + } } public abstract void addServlet(S servlet, Object attachment, AnyValue conf, K... mappings); diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index f8e46e108..75ec70eb6 100644 --- a/src/org/redkale/net/http/HttpServer.java +++ b/src/org/redkale/net/http/HttpServer.java @@ -46,6 +46,29 @@ public class HttpServer extends Server 泛型 + * @param filterClass HttpFilter类 + * + * @return HttpFilter + */ + public T removeFilter(Class filterClass) { + return (T) this.prepare.removeFilter(filterClass); + } + /** * 添加HttpFilter * @@ -100,7 +123,7 @@ public class HttpServer extends Server RestServlet * @param name Service的资源名 * @param serviceType Service的类型 - * @param service Service对象 + * @param service Service对象 * @param baseServletClass RestServlet基类 * @param prefix url前缀 *