This commit is contained in:
@@ -10,6 +10,7 @@ import java.nio.*;
|
|||||||
import java.nio.channels.*;
|
import java.nio.channels.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.atomic.*;
|
import java.util.concurrent.atomic.*;
|
||||||
|
import java.util.function.Predicate;
|
||||||
import java.util.logging.*;
|
import java.util.logging.*;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
|
|
||||||
@@ -42,7 +43,7 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
|
|||||||
|
|
||||||
private Map<K, S> mappings = new HashMap<>();
|
private Map<K, S> mappings = new HashMap<>();
|
||||||
|
|
||||||
private List<Filter<C, R, P>> filters = new ArrayList<>();
|
private final List<Filter<C, R, P>> filters = new ArrayList<>();
|
||||||
|
|
||||||
protected Filter<C, R, P> headFilter;
|
protected Filter<C, R, P> headFilter;
|
||||||
|
|
||||||
@@ -68,32 +69,68 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(C context, AnyValue config) {
|
public void init(C context, AnyValue config) {
|
||||||
if (filters != null && !filters.isEmpty()) {
|
synchronized (filters) {
|
||||||
Collections.sort(filters);
|
if (!filters.isEmpty()) {
|
||||||
for (Filter<C, R, P> filter : filters) {
|
Collections.sort(filters);
|
||||||
filter.init(context, config);
|
for (Filter<C, R, P> filter : filters) {
|
||||||
}
|
filter.init(context, config);
|
||||||
this.headFilter = filters.get(0);
|
}
|
||||||
Filter<C, R, P> filter = this.headFilter;
|
this.headFilter = filters.get(0);
|
||||||
for (int i = 1; i < filters.size(); i++) {
|
Filter<C, R, P> filter = this.headFilter;
|
||||||
filter._next = filters.get(i);
|
for (int i = 1; i < filters.size(); i++) {
|
||||||
filter = filter._next;
|
filter._next = filters.get(i);
|
||||||
|
filter = filter._next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroy(C context, AnyValue config) {
|
public void destroy(C context, AnyValue config) {
|
||||||
if (filters != null && !filters.isEmpty()) {
|
synchronized (filters) {
|
||||||
for (Filter filter : filters) {
|
if (!filters.isEmpty()) {
|
||||||
filter.destroy(context, config);
|
for (Filter filter : filters) {
|
||||||
|
filter.destroy(context, config);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addFilter(Filter<C, R, P> filter, AnyValue conf) {
|
public void addFilter(Filter<C, R, P> filter, AnyValue conf) {
|
||||||
filter._conf = conf;
|
filter._conf = conf;
|
||||||
this.filters.add(filter);
|
synchronized (filters) {
|
||||||
|
this.filters.add(filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Filter<C, R, P> removeFilter(Class<? extends Filter<C, R, P>> filterClass) {
|
||||||
|
return removeFilter(f -> filterClass.equals(f.getClass()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Filter<C, R, P> removeFilter(String filterName) {
|
||||||
|
return removeFilter(f -> filterName.equals(f.resourceName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Filter<C, R, P> removeFilter(Predicate<Filter<C, R, P>> 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);
|
public abstract void addServlet(S servlet, Object attachment, AnyValue conf, K... mappings);
|
||||||
|
|||||||
@@ -46,6 +46,29 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
return ((HttpPrepareServlet) this.prepare).resourceHttpServlet;
|
return ((HttpPrepareServlet) this.prepare).resourceHttpServlet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除HttpFilter
|
||||||
|
*
|
||||||
|
* @param filterName HttpFilter名称
|
||||||
|
*
|
||||||
|
* @return HttpFilter
|
||||||
|
*/
|
||||||
|
public HttpFilter removeFilter(String filterName) {
|
||||||
|
return (HttpFilter) this.prepare.removeFilter(filterName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除HttpFilter
|
||||||
|
*
|
||||||
|
* @param <T> 泛型
|
||||||
|
* @param filterClass HttpFilter类
|
||||||
|
*
|
||||||
|
* @return HttpFilter
|
||||||
|
*/
|
||||||
|
public <T extends HttpFilter> T removeFilter(Class<T> filterClass) {
|
||||||
|
return (T) this.prepare.removeFilter(filterClass);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加HttpFilter
|
* 添加HttpFilter
|
||||||
*
|
*
|
||||||
@@ -100,7 +123,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
this.prepare.addServlet(servlet, prefix, conf, mappings);
|
this.prepare.addServlet(servlet, prefix, conf, mappings);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加RestServlet
|
* 添加RestServlet
|
||||||
*
|
*
|
||||||
@@ -108,7 +131,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
* @param <T> RestServlet
|
* @param <T> RestServlet
|
||||||
* @param name Service的资源名
|
* @param name Service的资源名
|
||||||
* @param serviceType Service的类型
|
* @param serviceType Service的类型
|
||||||
* @param service Service对象
|
* @param service Service对象
|
||||||
* @param baseServletClass RestServlet基类
|
* @param baseServletClass RestServlet基类
|
||||||
* @param prefix url前缀
|
* @param prefix url前缀
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user