From 7ef5ddfd46d43541a1b23e3a8d64597095f2a6a4 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sat, 27 May 2017 21:41:24 +0800 Subject: [PATCH] --- src/org/redkale/net/PrepareServlet.java | 8 +- .../redkale/net/http/HttpPrepareServlet.java | 87 +++++++++++++++---- src/org/redkale/net/http/HttpServer.java | 9 +- src/org/redkale/net/http/Rest.java | 23 ++++- 4 files changed, 100 insertions(+), 27 deletions(-) diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index db9516aa9..cd786f4e0 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -73,9 +73,11 @@ public abstract class PrepareServlet newmappings = new HashMap<>(mappings); - newmappings.remove(key); - this.mappings = newmappings; + if (mappings.containsKey(key)) { + Map newmappings = new HashMap<>(mappings); + newmappings.remove(key); + this.mappings = newmappings; + } } } diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index ed0ad88dc..af0a2f60d 100644 --- a/src/org/redkale/net/http/HttpPrepareServlet.java +++ b/src/org/redkale/net/http/HttpPrepareServlet.java @@ -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 wsmappings = new HashMap<>(); //super.mappings 包含 wsmappings - protected HttpServlet resourceHttpServlet = new HttpResourceServlet(); - protected final Map allMapStrings = new HashMap<>(); private final Object excludeLock = new Object(); @@ -43,28 +44,78 @@ public class HttpPrepareServlet extends PrepareServlet[] forbidURIPredicates; //禁用的URL的Predicate, 必须与 forbidURIMaps 保持一致 - public HttpServlet removeHttpServlet(HttpServlet servlet) { - HttpServlet rs = null; + private List removeHttpServlet(final Predicate predicateEntry, final Predicate> predicateFilter) { + List servlets = new ArrayList<>(); synchronized (allMapStrings) { - //待开发 + List 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 newwsmappings = new HashMap<>(); + for (Map.Entry 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 HttpServlet removeHttpServlet(Class servletType) { - HttpServlet rs = null; - synchronized (allMapStrings) { - //待开发 - } - return rs; + public HttpServlet removeHttpServlet(final HttpServlet servlet) { + Predicate predicateEntry = (t) -> t.servlet == servlet; + Predicate> predicateFilter = (t) -> t.getValue() == servlet; + removeHttpServlet(predicateEntry, predicateFilter); + return servlet; } - public HttpServlet removeHttpServlet(String mapping) { - HttpServlet rs = null; - synchronized (allMapStrings) { - //待开发 - } - return rs; + public List removeHttpServlet(final Class servletOrServiceOrWsType) { + Predicate 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> 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 removeHttpServlet(final String mapping) { + Predicate predicateEntry = (t) -> t.mapping.equals(mapping); + Predicate> predicateFilter = (t) -> t.getKey().equals(mapping); + return removeHttpServlet(predicateEntry, predicateFilter); } public boolean addForbidURIReg(final String urlreg) { diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index e62eb459c..ce838f955 100644 --- a/src/org/redkale/net/http/HttpServer.java +++ b/src/org/redkale/net/http/HttpServer.java @@ -71,13 +71,12 @@ public class HttpServer extends Server 泛型 - * @param servletType Class + * @param servletOrServiceOrWsType Class * * @return HttpServlet */ - public HttpServlet removeHttpServlet(Class servletType) { - return ((HttpPrepareServlet) this.prepare).removeHttpServlet(servletType); + public List removeHttpServlet(Class servletOrServiceOrWsType) { + return ((HttpPrepareServlet) this.prepare).removeHttpServlet(servletOrServiceOrWsType); } /** @@ -87,7 +86,7 @@ public class HttpServer extends Server removeHttpServlet(String mapping) { return ((HttpPrepareServlet) this.prepare).removeHttpServlet(mapping); } diff --git a/src/org/redkale/net/http/Rest.java b/src/org/redkale/net/http/Rest.java index 4485ada8e..110321edb 100644 --- a/src/org/redkale/net/http/Rest.java +++ b/src/org/redkale/net/http/Rest.java @@ -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();