This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user