This commit is contained in:
@@ -32,25 +32,29 @@ public final class ClassFilter<T> {
|
|||||||
|
|
||||||
private static final boolean finer = logger.isLoggable(Level.FINER);
|
private static final boolean finer = logger.isLoggable(Level.FINER);
|
||||||
|
|
||||||
private final Set<FilterEntry<T>> entrys = new HashSet<>();
|
private final Set<FilterEntry<T>> entrys = new HashSet<>(); //符合条件的结果
|
||||||
|
|
||||||
private final Set<FilterEntry<T>> expectEntrys = new HashSet<>();
|
private final Set<FilterEntry<T>> expectEntrys = new HashSet<>(); //准备符合条件的结果
|
||||||
|
|
||||||
private boolean refused;
|
private boolean refused; //是否拒绝所有数据,设置true,则其他规则失效,都是拒绝.
|
||||||
|
|
||||||
private Class superClass;
|
private Class superClass; //符合的父类型。不为空时,扫描结果的class必须是superClass的子类
|
||||||
|
|
||||||
private Class<? extends Annotation> annotationClass;
|
private Class<? extends Annotation> annotationClass;//符合的注解。不为空时,扫描结果的class必须包含该注解
|
||||||
|
|
||||||
private Pattern[] includePatterns;
|
private Pattern[] includePatterns; //符合的classname正则表达式
|
||||||
|
|
||||||
private Pattern[] excludePatterns;
|
private Pattern[] excludePatterns;//拒绝的classname正则表达式
|
||||||
|
|
||||||
private List<ClassFilter> ors;
|
private Set<String> privilegeIncludes; //特批符合条件的classname
|
||||||
|
|
||||||
private List<ClassFilter> ands;
|
private Set<String> privilegeExcludes;//特批拒绝条件的classname
|
||||||
|
|
||||||
private AnyValue conf;
|
private List<ClassFilter> ors; //或关系的其他ClassFilter
|
||||||
|
|
||||||
|
private List<ClassFilter> ands;//与关系的其他ClassFilter
|
||||||
|
|
||||||
|
private AnyValue conf; //基本配置信息, 当符合条件时将conf的属性赋值到FilterEntry中去。
|
||||||
|
|
||||||
public ClassFilter(Class<? extends Annotation> annotationClass, Class superClass) {
|
public ClassFilter(Class<? extends Annotation> annotationClass, Class superClass) {
|
||||||
this(annotationClass, superClass, null);
|
this(annotationClass, superClass, null);
|
||||||
@@ -62,6 +66,15 @@ public final class ClassFilter<T> {
|
|||||||
this.conf = conf;
|
this.conf = conf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ClassFilter create(String includeregs, String excluderegs, Set<String> includeValues, Set<String> 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<T> or(ClassFilter<T> filter) {
|
public ClassFilter<T> or(ClassFilter<T> filter) {
|
||||||
if (ors == null) ors = new ArrayList<>();
|
if (ors == null) ors = new ArrayList<>();
|
||||||
ors.add(filter);
|
ors.add(filter);
|
||||||
@@ -169,19 +182,15 @@ public final class ClassFilter<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Pattern[] toPattern(String[] regs) {
|
/**
|
||||||
if (regs == null) return null;
|
* 判断class是否有效
|
||||||
int i = 0;
|
*
|
||||||
Pattern[] rs = new Pattern[regs.length];
|
* @param classname String
|
||||||
for (String reg : regs) {
|
*
|
||||||
if (reg == null || reg.trim().isEmpty()) continue;
|
* @return boolean
|
||||||
rs[i++] = Pattern.compile(reg.trim());
|
*/
|
||||||
}
|
public boolean accept(String classname) {
|
||||||
if (i == 0) return null;
|
return accept(null, classname);
|
||||||
if (i == rs.length) return rs;
|
|
||||||
Pattern[] ps = new Pattern[i];
|
|
||||||
System.arraycopy(rs, 0, ps, 0, i);
|
|
||||||
return ps;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -209,6 +218,8 @@ public final class ClassFilter<T> {
|
|||||||
|
|
||||||
private boolean accept0(AnyValue property, String classname) {
|
private boolean accept0(AnyValue property, String classname) {
|
||||||
if (this.refused) return false;
|
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 (classname.startsWith("java.") || classname.startsWith("javax.")) return false;
|
||||||
if (excludePatterns != null) {
|
if (excludePatterns != null) {
|
||||||
for (Pattern reg : excludePatterns) {
|
for (Pattern reg : excludePatterns) {
|
||||||
@@ -239,6 +250,21 @@ public final class ClassFilter<T> {
|
|||||||
return superClass == null || (clazz != superClass && superClass.isAssignableFrom(clazz));
|
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) {
|
public void setSuperClass(Class superClass) {
|
||||||
this.superClass = superClass;
|
this.superClass = superClass;
|
||||||
}
|
}
|
||||||
@@ -279,6 +305,22 @@ public final class ClassFilter<T> {
|
|||||||
this.refused = refused;
|
this.refused = refused;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<String> getPrivilegeIncludes() {
|
||||||
|
return privilegeIncludes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrivilegeIncludes(Set<String> privilegeIncludes) {
|
||||||
|
this.privilegeIncludes = privilegeIncludes == null || privilegeIncludes.isEmpty() ? null : privilegeIncludes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getPrivilegeExcludes() {
|
||||||
|
return privilegeExcludes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrivilegeExcludes(Set<String> privilegeExcludes) {
|
||||||
|
this.privilegeExcludes = privilegeExcludes == null || privilegeExcludes.isEmpty() ? null : privilegeExcludes;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 存放符合条件的class与class指定的属性项
|
* 存放符合条件的class与class指定的属性项
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import java.lang.reflect.*;
|
|||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import org.redkale.boot.ClassFilter.FilterEntry;
|
import org.redkale.boot.ClassFilter.FilterEntry;
|
||||||
import org.redkale.net.*;
|
import org.redkale.net.*;
|
||||||
@@ -28,13 +27,19 @@ import org.redkale.util.*;
|
|||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
@NodeProtocol({"HTTP"})
|
@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) {
|
public NodeHttpServer(Application application, AnyValue serconf) {
|
||||||
super(application, createServer(application, serconf));
|
super(application, createServer(application, serconf));
|
||||||
this.httpServer = (HttpServer) server;
|
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) {
|
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());
|
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 {
|
protected void loadRestServlet(final AnyValue servletsConf) throws Exception {
|
||||||
|
if (!rest) return;
|
||||||
final String prefix = servletsConf == null ? "" : servletsConf.getValue("path", "");
|
final String prefix = servletsConf == null ? "" : servletsConf.getValue("path", "");
|
||||||
AnyValue restConf = serverConf == null ? null : serverConf.getAnyValue("rest");
|
AnyValue restConf = serverConf == null ? null : serverConf.getAnyValue("rest");
|
||||||
if (restConf == null) return; //不存在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 autoload = restConf.getBoolValue("autoload", true);
|
||||||
final boolean mustsign = restConf.getBoolValue("mustsign", true); //是否只加载标记@RestService的Service类
|
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<String> includeValues = new HashSet<>();
|
||||||
final Set<String> hasServices = new HashSet<>();
|
final Set<String> excludeValues = new HashSet<>();
|
||||||
for (AnyValue item : restConf.getAnyValues("service")) {
|
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) -> {
|
super.interceptorServiceWrappers.forEach((wrapper) -> {
|
||||||
if (!wrapper.getName().isEmpty()) return; //只加载resourceName为空的service
|
if (!wrapper.getName().isEmpty()) return; //只加载resourceName为空的service
|
||||||
final Class stype = wrapper.getType();
|
final Class stype = wrapper.getType();
|
||||||
@@ -168,22 +180,8 @@ public final class NodeHttpServer extends NodeServer {
|
|||||||
if (stype.getAnnotation(LocalService.class) != null && rs == null) return;
|
if (stype.getAnnotation(LocalService.class) != null && rs == null) return;
|
||||||
|
|
||||||
final String stypename = stype.getName();
|
final String stypename = stype.getName();
|
||||||
if (!autoload && !hasServices.contains(stypename)) return;
|
if (!autoload && !includeValues.contains(stypename)) return;
|
||||||
if (excludes != null && !hasServices.contains(stypename)) {
|
if (!restFilter.accept(stypename)) return;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
RestHttpServlet servlet = RestServletBuilder.createRestServlet(baseServletClass, wrapper.getName(), stype, sncp);
|
RestHttpServlet servlet = RestServletBuilder.createRestServlet(baseServletClass, wrapper.getName(), stype, sncp);
|
||||||
if (servlet == null) return;
|
if (servlet == null) return;
|
||||||
|
|||||||
@@ -27,6 +27,32 @@ import org.redkale.service.*;
|
|||||||
import org.redkale.source.*;
|
import org.redkale.source.*;
|
||||||
import org.redkale.util.AnyValue.DefaultAnyValue;
|
import org.redkale.util.AnyValue.DefaultAnyValue;
|
||||||
import org.redkale.util.*;
|
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节点的初始化配置类
|
* Server节点的初始化配置类
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ import org.redkale.util.*;
|
|||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
@NodeProtocol({"SNCP"})
|
@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) {
|
private NodeSncpServer(Application application, AnyValue serconf) {
|
||||||
super(application, createServer(application, serconf));
|
super(application, createServer(application, serconf));
|
||||||
|
|||||||
Reference in New Issue
Block a user