From db32656c8adcbe3fe190bbb3b0eeed18461b6930 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sat, 27 Aug 2016 13:50:24 +0800 Subject: [PATCH] --- src/org/redkale/boot/ClassFilter.java | 88 +++++++++++++++++------- src/org/redkale/boot/NodeHttpServer.java | 48 +++++++------ src/org/redkale/boot/NodeServer.java | 26 +++++++ src/org/redkale/boot/NodeSncpServer.java | 4 +- 4 files changed, 116 insertions(+), 50 deletions(-) diff --git a/src/org/redkale/boot/ClassFilter.java b/src/org/redkale/boot/ClassFilter.java index 9be91d216..f264a2688 100644 --- a/src/org/redkale/boot/ClassFilter.java +++ b/src/org/redkale/boot/ClassFilter.java @@ -32,25 +32,29 @@ public final class ClassFilter { private static final boolean finer = logger.isLoggable(Level.FINER); - private final Set> entrys = new HashSet<>(); + private final Set> entrys = new HashSet<>(); //符合条件的结果 - private final Set> expectEntrys = new HashSet<>(); + private final Set> expectEntrys = new HashSet<>(); //准备符合条件的结果 - private boolean refused; + private boolean refused; //是否拒绝所有数据,设置true,则其他规则失效,都是拒绝. - private Class superClass; + private Class superClass; //符合的父类型。不为空时,扫描结果的class必须是superClass的子类 - private Class annotationClass; + private Class annotationClass;//符合的注解。不为空时,扫描结果的class必须包含该注解 - private Pattern[] includePatterns; + private Pattern[] includePatterns; //符合的classname正则表达式 - private Pattern[] excludePatterns; + private Pattern[] excludePatterns;//拒绝的classname正则表达式 - private List ors; + private Set privilegeIncludes; //特批符合条件的classname - private List ands; + private Set privilegeExcludes;//特批拒绝条件的classname - private AnyValue conf; + private List ors; //或关系的其他ClassFilter + + private List ands;//与关系的其他ClassFilter + + private AnyValue conf; //基本配置信息, 当符合条件时将conf的属性赋值到FilterEntry中去。 public ClassFilter(Class annotationClass, Class superClass) { this(annotationClass, superClass, null); @@ -62,6 +66,15 @@ public final class ClassFilter { this.conf = conf; } + public static ClassFilter create(String includeregs, String excluderegs, Set includeValues, Set excludeValues) { + ClassFilter filter = new ClassFilter(null, null); + filter.setIncludePatterns(includeregs == null ? null : includeregs.split(";")); + filter.setExcludePatterns(excluderegs == null ? null : excluderegs.split(";")); + filter.setPrivilegeIncludes(includeValues); + filter.setPrivilegeExcludes(excludeValues); + return filter; + } + public ClassFilter or(ClassFilter filter) { if (ors == null) ors = new ArrayList<>(); ors.add(filter); @@ -169,19 +182,15 @@ public final class ClassFilter { } } - public static Pattern[] toPattern(String[] regs) { - if (regs == null) return null; - int i = 0; - Pattern[] rs = new Pattern[regs.length]; - for (String reg : regs) { - if (reg == null || reg.trim().isEmpty()) continue; - rs[i++] = Pattern.compile(reg.trim()); - } - if (i == 0) return null; - if (i == rs.length) return rs; - Pattern[] ps = new Pattern[i]; - System.arraycopy(rs, 0, ps, 0, i); - return ps; + /** + * 判断class是否有效 + * + * @param classname String + * + * @return boolean + */ + public boolean accept(String classname) { + return accept(null, classname); } /** @@ -209,6 +218,8 @@ public final class ClassFilter { private boolean accept0(AnyValue property, String classname) { if (this.refused) return false; + if (this.privilegeIncludes != null && this.privilegeIncludes.contains(classname)) return true; + if (this.privilegeExcludes != null && this.privilegeExcludes.contains(classname)) return false; if (classname.startsWith("java.") || classname.startsWith("javax.")) return false; if (excludePatterns != null) { for (Pattern reg : excludePatterns) { @@ -239,6 +250,21 @@ public final class ClassFilter { return superClass == null || (clazz != superClass && superClass.isAssignableFrom(clazz)); } + public static Pattern[] toPattern(String[] regs) { + if (regs == null || regs.length == 0) return null; + int i = 0; + Pattern[] rs = new Pattern[regs.length]; + for (String reg : regs) { + if (reg == null || reg.trim().isEmpty()) continue; + rs[i++] = Pattern.compile(reg.trim()); + } + if (i == 0) return null; + if (i == rs.length) return rs; + Pattern[] ps = new Pattern[i]; + System.arraycopy(rs, 0, ps, 0, i); + return ps; + } + public void setSuperClass(Class superClass) { this.superClass = superClass; } @@ -279,6 +305,22 @@ public final class ClassFilter { this.refused = refused; } + public Set getPrivilegeIncludes() { + return privilegeIncludes; + } + + public void setPrivilegeIncludes(Set privilegeIncludes) { + this.privilegeIncludes = privilegeIncludes == null || privilegeIncludes.isEmpty() ? null : privilegeIncludes; + } + + public Set getPrivilegeExcludes() { + return privilegeExcludes; + } + + public void setPrivilegeExcludes(Set privilegeExcludes) { + this.privilegeExcludes = privilegeExcludes == null || privilegeExcludes.isEmpty() ? null : privilegeExcludes; + } + /** * 存放符合条件的class与class指定的属性项 * diff --git a/src/org/redkale/boot/NodeHttpServer.java b/src/org/redkale/boot/NodeHttpServer.java index 6738d02b2..4a936fd96 100644 --- a/src/org/redkale/boot/NodeHttpServer.java +++ b/src/org/redkale/boot/NodeHttpServer.java @@ -9,7 +9,6 @@ import java.lang.reflect.*; import java.net.InetSocketAddress; import java.util.*; import java.util.logging.Level; -import java.util.regex.Pattern; import javax.annotation.Resource; import org.redkale.boot.ClassFilter.FilterEntry; import org.redkale.net.*; @@ -28,13 +27,19 @@ import org.redkale.util.*; * @author zhangjx */ @NodeProtocol({"HTTP"}) -public final class NodeHttpServer extends NodeServer { +public class NodeHttpServer extends NodeServer { - private final HttpServer httpServer; + protected boolean rest; + + protected boolean sncp; + + protected final HttpServer httpServer; public NodeHttpServer(Application application, AnyValue serconf) { super(application, createServer(application, serconf)); this.httpServer = (HttpServer) server; + this.rest = serconf == null ? false : serconf.getAnyValue("rest") != null; + this.sncp = serconf == null ? false : serconf.getBoolValue("_$sncp", false); //SNCP服务以REST启动时会赋值_$sncp=true } private static Server createServer(Application application, AnyValue serconf) { @@ -137,10 +142,11 @@ public final class NodeHttpServer extends NodeServer { } } if (sb != null && sb.length() > 0) logger.log(Level.INFO, sb.toString()); - loadRestServlet(servletsConf); + if (rest) loadRestServlet(servletsConf); } protected void loadRestServlet(final AnyValue servletsConf) throws Exception { + if (!rest) return; final String prefix = servletsConf == null ? "" : servletsConf.getValue("path", ""); AnyValue restConf = serverConf == null ? null : serverConf.getAnyValue("rest"); if (restConf == null) return; //不存在REST服务 @@ -152,13 +158,19 @@ public final class NodeHttpServer extends NodeServer { final boolean autoload = restConf.getBoolValue("autoload", true); final boolean mustsign = restConf.getBoolValue("mustsign", true); //是否只加载标记@RestService的Service类 - final Pattern[] includes = ClassFilter.toPattern(restConf.getValue("includes", "").split(";")); - final Pattern[] excludes = ClassFilter.toPattern(restConf.getValue("excludes", "").split(";")); - final Set hasServices = new HashSet<>(); + + final Set includeValues = new HashSet<>(); + final Set excludeValues = new HashSet<>(); for (AnyValue item : restConf.getAnyValues("service")) { - hasServices.add(item.getValue("value", "")); + if (item.getBoolValue("ignore", false)) { + excludeValues.add(item.getValue("value", "")); + } else { + includeValues.add(item.getValue("value", "")); + } } - final boolean sncp = this.serverConf.getBoolValue("_$sncp", false); //SNCP服务以REST启动时会赋值_$sncp=true + + final ClassFilter restFilter = ClassFilter.create(restConf.getValue("includes", ""), restConf.getValue("excludes", ""), includeValues, excludeValues); + super.interceptorServiceWrappers.forEach((wrapper) -> { if (!wrapper.getName().isEmpty()) return; //只加载resourceName为空的service final Class stype = wrapper.getType(); @@ -168,22 +180,8 @@ public final class NodeHttpServer extends NodeServer { if (stype.getAnnotation(LocalService.class) != null && rs == null) return; final String stypename = stype.getName(); - if (!autoload && !hasServices.contains(stypename)) return; - if (excludes != null && !hasServices.contains(stypename)) { - for (Pattern reg : excludes) { - if (reg.matcher(stypename).matches()) return; - } - } - if (includes != null && !hasServices.contains(stypename)) { - boolean match = false; - for (Pattern reg : includes) { - if (reg.matcher(stypename).matches()) { - match = true; - break; - } - } - if (!match) return; - } + if (!autoload && !includeValues.contains(stypename)) return; + if (!restFilter.accept(stypename)) return; RestHttpServlet servlet = RestServletBuilder.createRestServlet(baseServletClass, wrapper.getName(), stype, sncp); if (servlet == null) return; diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index 5acc7bc7c..3788a5597 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -27,6 +27,32 @@ import org.redkale.service.*; import org.redkale.source.*; import org.redkale.util.AnyValue.DefaultAnyValue; import org.redkale.util.*; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; +import static java.lang.Class.forName; /** * Server节点的初始化配置类 diff --git a/src/org/redkale/boot/NodeSncpServer.java b/src/org/redkale/boot/NodeSncpServer.java index 38f52a9a0..84ba36bc2 100644 --- a/src/org/redkale/boot/NodeSncpServer.java +++ b/src/org/redkale/boot/NodeSncpServer.java @@ -20,9 +20,9 @@ import org.redkale.util.*; * @author zhangjx */ @NodeProtocol({"SNCP"}) -public final class NodeSncpServer extends NodeServer { +public class NodeSncpServer extends NodeServer { - private final SncpServer sncpServer; + protected final SncpServer sncpServer; private NodeSncpServer(Application application, AnyValue serconf) { super(application, createServer(application, serconf));