This commit is contained in:
Redkale
2017-05-27 21:41:24 +08:00
parent 73a973e0ed
commit 7ef5ddfd46
4 changed files with 100 additions and 27 deletions

View File

@@ -73,9 +73,11 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
protected void removeMapping(K key) {
synchronized (lock2) {
Map<K, S> newmappings = new HashMap<>(mappings);
newmappings.remove(key);
this.mappings = newmappings;
if (mappings.containsKey(key)) {
Map<K, S> newmappings = new HashMap<>(mappings);
newmappings.remove(key);
this.mappings = newmappings;
}
}
}

View File

@@ -12,6 +12,7 @@ import java.util.function.*;
import java.util.logging.*;
import java.util.regex.*;
import org.redkale.net.*;
import org.redkale.net.http.Rest.RestDynSourceType;
import org.redkale.util.*;
/**
@@ -27,14 +28,14 @@ public class HttpPrepareServlet extends PrepareServlet<String, HttpContext, Http
protected final Logger logger = Logger.getLogger(this.getClass().getSimpleName());
protected HttpServlet resourceHttpServlet = new HttpResourceServlet();
protected MappingEntry[] regArray = null; //regArray 包含 regWsArray
protected MappingEntry[] regWsArray = null;
protected Map<String, WebSocketServlet> wsmappings = new HashMap<>(); //super.mappings 包含 wsmappings
protected HttpServlet resourceHttpServlet = new HttpResourceServlet();
protected final Map<String, Class> allMapStrings = new HashMap<>();
private final Object excludeLock = new Object();
@@ -43,28 +44,78 @@ public class HttpPrepareServlet extends PrepareServlet<String, HttpContext, Http
private BiPredicate<String, String>[] forbidURIPredicates; //禁用的URL的Predicate, 必须与 forbidURIMaps 保持一致
public HttpServlet removeHttpServlet(HttpServlet servlet) {
HttpServlet rs = null;
private List<HttpServlet> removeHttpServlet(final Predicate<MappingEntry> predicateEntry, final Predicate<Map.Entry<String, WebSocketServlet>> predicateFilter) {
List<HttpServlet> servlets = new ArrayList<>();
synchronized (allMapStrings) {
//待开发
List<String> keys = new ArrayList<>();
if (regArray != null) {
for (MappingEntry me : regArray) {
if (predicateEntry.test(me)) {
servlets.add(me.servlet);
keys.add(me.mapping);
}
}
}
if (regWsArray != null) {
for (MappingEntry me : regWsArray) {
if (predicateEntry.test(me)) {
servlets.add(me.servlet);
keys.add(me.mapping);
}
}
}
Map<String, WebSocketServlet> newwsmappings = new HashMap<>();
for (Map.Entry<String, WebSocketServlet> en : wsmappings.entrySet()) {
if (predicateFilter.test(en)) {
servlets.add(en.getValue());
keys.add(en.getKey());
} else {
newwsmappings.put(en.getKey(), en.getValue());
}
}
if (newwsmappings.size() != wsmappings.size()) this.wsmappings = newwsmappings;
if (!keys.isEmpty()) {
this.regArray = Utility.remove(this.regArray, predicateEntry);
this.regWsArray = Utility.remove(this.regWsArray, predicateEntry);
for (HttpServlet rs : servlets) {
super.removeServlet(rs);
}
for (String key : keys) {
super.removeMapping(key);
allMapStrings.remove(key);
}
}
}
return rs;
return servlets;
}
public <T extends HttpServlet> HttpServlet removeHttpServlet(Class<T> servletType) {
HttpServlet rs = null;
synchronized (allMapStrings) {
//待开发
}
return rs;
public HttpServlet removeHttpServlet(final HttpServlet servlet) {
Predicate<MappingEntry> predicateEntry = (t) -> t.servlet == servlet;
Predicate<Map.Entry<String, WebSocketServlet>> predicateFilter = (t) -> t.getValue() == servlet;
removeHttpServlet(predicateEntry, predicateFilter);
return servlet;
}
public HttpServlet removeHttpServlet(String mapping) {
HttpServlet rs = null;
synchronized (allMapStrings) {
//待开发
}
return rs;
public <T extends HttpServlet> List<HttpServlet> removeHttpServlet(final Class<T> servletOrServiceOrWsType) {
Predicate<MappingEntry> predicateEntry = (t) -> {
Class type = t.servlet.getClass();
if (type == servletOrServiceOrWsType) return true;
RestDynSourceType rdt = (RestDynSourceType) type.getAnnotation(RestDynSourceType.class);
return (rdt != null && rdt.value() == servletOrServiceOrWsType);
};
Predicate<Map.Entry<String, WebSocketServlet>> predicateFilter = (t) -> {
Class type = t.getValue().getClass();
if (type == servletOrServiceOrWsType) return true;
RestDynSourceType rdt = (RestDynSourceType) type.getAnnotation(RestDynSourceType.class);
return (rdt != null && rdt.value() == servletOrServiceOrWsType);
};
return removeHttpServlet(predicateEntry, predicateFilter);
}
public List<HttpServlet> removeHttpServlet(final String mapping) {
Predicate<MappingEntry> predicateEntry = (t) -> t.mapping.equals(mapping);
Predicate<Map.Entry<String, WebSocketServlet>> predicateFilter = (t) -> t.getKey().equals(mapping);
return removeHttpServlet(predicateEntry, predicateFilter);
}
public boolean addForbidURIReg(final String urlreg) {

View File

@@ -71,13 +71,12 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
/**
* 删除HttpServlet
*
* @param <T> 泛型
* @param servletType Class
* @param servletOrServiceOrWsType Class
*
* @return HttpServlet
*/
public <T extends HttpServlet> HttpServlet removeHttpServlet(Class<T> servletType) {
return ((HttpPrepareServlet) this.prepare).removeHttpServlet(servletType);
public List<HttpServlet> removeHttpServlet(Class servletOrServiceOrWsType) {
return ((HttpPrepareServlet) this.prepare).removeHttpServlet(servletOrServiceOrWsType);
}
/**
@@ -87,7 +86,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
*
* @return HttpServlet
*/
public HttpServlet removeHttpServlet(String mapping) {
public List<HttpServlet> removeHttpServlet(String mapping) {
return ((HttpPrepareServlet) this.prepare).removeHttpServlet(mapping);
}

View File

@@ -58,6 +58,18 @@ public final class Rest {
}
/**
* 用于标记由Rest.createRestServlet 方法创建的RestServlet
*/
@Inherited
@Documented
@Target({TYPE})
@Retention(RUNTIME)
public static @interface RestDynSourceType {
Class value();
}
private Rest() {
}
@@ -186,6 +198,11 @@ public final class Rest {
AnnotationVisitor av0;
cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, supDynName, null);
{ //RestDynSourceType
av0 = cw.visitAnnotation(Type.getDescriptor(RestDynSourceType.class), true);
av0.visit("value", Type.getType(Type.getDescriptor(webSocketType)));
av0.visitEnd();
}
{ //注入 @WebServlet 注解
String urlpath = (rws.catalog().isEmpty() ? "/" : ("/" + rws.catalog() + "/")) + rws.name();
av0 = cw.visitAnnotation(webServletDesc, true);
@@ -521,7 +538,11 @@ public final class Rest {
av0 = cw.visitAnnotation(Type.getDescriptor(RestDynamic.class), true);
av0.visitEnd();
}
{ //RestDynSourceType
av0 = cw.visitAnnotation(Type.getDescriptor(RestDynSourceType.class), true);
av0.visit("value", Type.getType(Type.getDescriptor(serviceType)));
av0.visitEnd();
}
{ //注入 @WebServlet 注解
String urlpath = (catalog.isEmpty() ? "/" : ("/" + catalog + "/")) + defmodulename + "/*";
int moduleid = controller == null ? 0 : controller.moduleid();