This commit is contained in:
@@ -113,7 +113,7 @@ public final class ApiDocsService {
|
|||||||
}
|
}
|
||||||
fieldmap.put("primary", !filter && (field.getAnnotation(Id.class) != null));
|
fieldmap.put("primary", !filter && (field.getAnnotation(Id.class) != null));
|
||||||
fieldmap.put("updatable", (filter || col == null || col.updatable()));
|
fieldmap.put("updatable", (filter || col == null || col.updatable()));
|
||||||
if (servlet.getClass().getAnnotation(Rest.RestDynamic.class) != null) {
|
if (servlet.getClass().getAnnotation(Rest.RestDyn.class) != null) {
|
||||||
if (field.getAnnotation(RestAddress.class) != null) continue;
|
if (field.getAnnotation(RestAddress.class) != null) continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,7 +162,7 @@ public final class ApiDocsService {
|
|||||||
fieldmap.put("primary", !filter && (field.getAnnotation(Id.class) != null));
|
fieldmap.put("primary", !filter && (field.getAnnotation(Id.class) != null));
|
||||||
fieldmap.put("updatable", (filter || col == null || col.updatable()));
|
fieldmap.put("updatable", (filter || col == null || col.updatable()));
|
||||||
|
|
||||||
if (servlet.getClass().getAnnotation(Rest.RestDynamic.class) != null) {
|
if (servlet.getClass().getAnnotation(Rest.RestDyn.class) != null) {
|
||||||
if (field.getAnnotation(RestAddress.class) != null) continue;
|
if (field.getAnnotation(RestAddress.class) != null) continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
restedObjects.add(service); //避免重复创建Rest对象
|
restedObjects.add(service); //避免重复创建Rest对象
|
||||||
HttpServlet servlet = httpServer.addRestServlet(name, stype, service, userType, baseServletType, prefix, (AnyValue) null);
|
HttpServlet servlet = httpServer.addRestServlet(service, userType, baseServletType, prefix);
|
||||||
if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
||||||
resourceFactory.inject(servlet, NodeHttpServer.this);
|
resourceFactory.inject(servlet, NodeHttpServer.this);
|
||||||
if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
|
if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import java.util.logging.*;
|
|||||||
import java.util.regex.*;
|
import java.util.regex.*;
|
||||||
import org.redkale.net.*;
|
import org.redkale.net.*;
|
||||||
import org.redkale.net.http.Rest.RestDynSourceType;
|
import org.redkale.net.http.Rest.RestDynSourceType;
|
||||||
|
import org.redkale.service.Service;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -96,35 +97,49 @@ public class HttpPrepareServlet extends PrepareServlet<String, HttpContext, Http
|
|||||||
return servlet;
|
return servlet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends HttpServlet> List<HttpServlet> removeHttpServlet(final Class<T> servletOrServiceOrWsType) {
|
public <T extends HttpServlet> HttpServlet removeHttpServlet(Service service) {
|
||||||
|
Predicate<MappingEntry> predicateEntry = (t) -> {
|
||||||
|
if (!Rest.isRestDyn(t.servlet)) return false;
|
||||||
|
Service s = Rest.getService(t.servlet);
|
||||||
|
if (s == service) return true;
|
||||||
|
if (s != null) return false;
|
||||||
|
Map<String, Service> map = Rest.getServiceMap(t.servlet);
|
||||||
|
if (map == null) return false;
|
||||||
|
boolean rs = map.values().contains(service);
|
||||||
|
if (rs && map.size() == 1) return true;
|
||||||
|
if (rs && map.size() > 1) {
|
||||||
|
String key = null;
|
||||||
|
for (Map.Entry<String, Service> en : map.entrySet()) {
|
||||||
|
if (en.getValue() == service) {
|
||||||
|
key = en.getKey();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (key != null) map.remove(key);
|
||||||
|
return false; //还有其他Resouce.name 的Service
|
||||||
|
}
|
||||||
|
return rs;
|
||||||
|
};
|
||||||
|
Predicate<Map.Entry<String, WebSocketServlet>> predicateFilter = null;
|
||||||
|
List<HttpServlet> list = removeHttpServlet(predicateEntry, predicateFilter);
|
||||||
|
return list == null || list.isEmpty() ? null : list.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends WebSocket> HttpServlet removeHttpServlet(Class<T> websocketOrServletType) {
|
||||||
Predicate<MappingEntry> predicateEntry = (t) -> {
|
Predicate<MappingEntry> predicateEntry = (t) -> {
|
||||||
Class type = t.servlet.getClass();
|
Class type = t.servlet.getClass();
|
||||||
if (type == servletOrServiceOrWsType) return true;
|
if (type == websocketOrServletType) return true;
|
||||||
RestDynSourceType rdt = (RestDynSourceType) type.getAnnotation(RestDynSourceType.class);
|
RestDynSourceType rdt = (RestDynSourceType) type.getAnnotation(RestDynSourceType.class);
|
||||||
return (rdt != null && rdt.value() == servletOrServiceOrWsType);
|
return (rdt != null && rdt.value() == websocketOrServletType);
|
||||||
};
|
};
|
||||||
Predicate<Map.Entry<String, WebSocketServlet>> predicateFilter = (t) -> {
|
Predicate<Map.Entry<String, WebSocketServlet>> predicateFilter = (t) -> {
|
||||||
Class type = t.getValue().getClass();
|
Class type = t.getValue().getClass();
|
||||||
if (type == servletOrServiceOrWsType) return true;
|
if (type == websocketOrServletType) return true;
|
||||||
RestDynSourceType rdt = (RestDynSourceType) type.getAnnotation(RestDynSourceType.class);
|
RestDynSourceType rdt = (RestDynSourceType) type.getAnnotation(RestDynSourceType.class);
|
||||||
return (rdt != null && rdt.value() == servletOrServiceOrWsType);
|
return (rdt != null && rdt.value() == websocketOrServletType);
|
||||||
};
|
};
|
||||||
return removeHttpServlet(predicateEntry, predicateFilter);
|
List<HttpServlet> list = removeHttpServlet(predicateEntry, predicateFilter);
|
||||||
}
|
return list == null || list.isEmpty() ? null : list.get(0);
|
||||||
|
|
||||||
public List<HttpServlet> removeHttpServlet(String mapping0) {
|
|
||||||
if (Utility.contains(mapping0, '.', '*', '{', '[', '(', '|', '^', '$', '+', '?', '\\')) { //是否是正则表达式))
|
|
||||||
if (mapping0.charAt(0) != '^') mapping0 = '^' + mapping0;
|
|
||||||
if (mapping0.endsWith("/*")) {
|
|
||||||
mapping0 = mapping0.substring(0, mapping0.length() - 1) + ".*";
|
|
||||||
} else {
|
|
||||||
mapping0 = mapping0 + "$";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
final String mapping = mapping0;
|
|
||||||
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) {
|
public boolean addForbidURIReg(final String urlreg) {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import java.nio.ByteBuffer;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import org.redkale.net.*;
|
import org.redkale.net.*;
|
||||||
|
import org.redkale.net.sncp.Sncp;
|
||||||
import org.redkale.service.Service;
|
import org.redkale.service.Service;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
|
|
||||||
@@ -60,34 +61,23 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
/**
|
/**
|
||||||
* 删除HttpServlet
|
* 删除HttpServlet
|
||||||
*
|
*
|
||||||
* @param servlet HttpServlet
|
* @param service Service
|
||||||
*
|
*
|
||||||
* @return HttpServlet
|
* @return HttpServlet
|
||||||
*/
|
*/
|
||||||
public HttpServlet removeHttpServlet(HttpServlet servlet) {
|
public HttpServlet removeHttpServlet(Service service) {
|
||||||
return ((HttpPrepareServlet) this.prepare).removeHttpServlet(servlet);
|
return ((HttpPrepareServlet) this.prepare).removeHttpServlet(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除HttpServlet
|
* 删除HttpServlet
|
||||||
*
|
*
|
||||||
* @param servletOrServiceOrWsType Class
|
* @param websocketOrServletType Class
|
||||||
*
|
*
|
||||||
* @return HttpServlet
|
* @return HttpServlet
|
||||||
*/
|
*/
|
||||||
public List<HttpServlet> removeHttpServlet(Class servletOrServiceOrWsType) {
|
public <T extends WebSocket> HttpServlet removeHttpServlet(Class<T> websocketOrServletType) {
|
||||||
return ((HttpPrepareServlet) this.prepare).removeHttpServlet(servletOrServiceOrWsType);
|
return ((HttpPrepareServlet) this.prepare).removeHttpServlet(websocketOrServletType);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除HttpServlet
|
|
||||||
*
|
|
||||||
* @param mapping String
|
|
||||||
*
|
|
||||||
* @return HttpServlet
|
|
||||||
*/
|
|
||||||
public List<HttpServlet> removeHttpServlet(String mapping) {
|
|
||||||
return ((HttpPrepareServlet) this.prepare).removeHttpServlet(mapping);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -179,41 +169,6 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 添加RestServlet
|
|
||||||
*
|
|
||||||
* @param <S> Service
|
|
||||||
* @param <T> RestServlet
|
|
||||||
* @param name Service的资源名
|
|
||||||
* @param serviceType Service的类型
|
|
||||||
* @param service Service对象
|
|
||||||
* @param baseServletClass RestServlet基类
|
|
||||||
* @param prefix url前缀
|
|
||||||
*
|
|
||||||
* @return RestServlet
|
|
||||||
*/
|
|
||||||
public <S extends Service, T extends HttpServlet> T addRestServlet(String name, Class<S> serviceType, S service, Class<T> baseServletClass, String prefix) {
|
|
||||||
return addRestServlet(name, serviceType, service, null, baseServletClass, prefix, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 添加RestServlet
|
|
||||||
*
|
|
||||||
* @param <S> Service
|
|
||||||
* @param <T> RestServlet
|
|
||||||
* @param name Service的资源名
|
|
||||||
* @param serviceType Service的类型
|
|
||||||
* @param service Service对象
|
|
||||||
* @param userType 用户数据类型
|
|
||||||
* @param baseServletClass RestServlet基类
|
|
||||||
* @param prefix url前缀
|
|
||||||
*
|
|
||||||
* @return RestServlet
|
|
||||||
*/
|
|
||||||
public <S extends Service, T extends HttpServlet> T addRestServlet(String name, Class<S> serviceType, S service, final Class userType, Class<T> baseServletClass, String prefix) {
|
|
||||||
return addRestServlet(name, serviceType, service, userType, baseServletClass, prefix, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加WebSocketServlet
|
* 添加WebSocketServlet
|
||||||
*
|
*
|
||||||
@@ -236,22 +191,38 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
*
|
*
|
||||||
* @param <S> Service
|
* @param <S> Service
|
||||||
* @param <T> HttpServlet
|
* @param <T> HttpServlet
|
||||||
* @param name Service的资源名
|
|
||||||
* @param serviceType Service的类型
|
|
||||||
* @param service Service对象
|
* @param service Service对象
|
||||||
* @param userType 用户数据类型
|
* @param userType 用户数据类型
|
||||||
* @param baseServletType RestServlet基类
|
* @param baseServletType RestServlet基类
|
||||||
* @param prefix url前缀
|
* @param prefix url前缀
|
||||||
* @param conf 配置信息
|
|
||||||
*
|
*
|
||||||
* @return RestServlet
|
* @return RestServlet
|
||||||
*/
|
*/
|
||||||
public <S extends Service, T extends HttpServlet> T addRestServlet(final String name, final Class<S> serviceType,
|
public <S extends Service, T extends HttpServlet> T addRestServlet(final S service, final Class userType, final Class<T> baseServletType, final String prefix) {
|
||||||
final S service, final Class userType, final Class<T> baseServletType, final String prefix, final AnyValue conf) {
|
return addRestServlet(null, service, userType, baseServletType, prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加RestServlet
|
||||||
|
*
|
||||||
|
* @param <S> Service
|
||||||
|
* @param <T> HttpServlet
|
||||||
|
* @param name 资源名
|
||||||
|
* @param service Service对象
|
||||||
|
* @param userType 用户数据类型
|
||||||
|
* @param baseServletType RestServlet基类
|
||||||
|
* @param prefix url前缀
|
||||||
|
*
|
||||||
|
* @return RestServlet
|
||||||
|
*/
|
||||||
|
public <S extends Service, T extends HttpServlet> T addRestServlet(final String name, final S service, final Class userType, final Class<T> baseServletType, final String prefix) {
|
||||||
T servlet = null;
|
T servlet = null;
|
||||||
|
final boolean sncp = Sncp.isSncpDyn(service);
|
||||||
|
final String resname = name == null ? (sncp ? Sncp.getResourceName(service) : "") : name;
|
||||||
|
final Class<S> serviceType = Sncp.getServiceType(service);
|
||||||
for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) {
|
for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) {
|
||||||
if (!(item instanceof HttpServlet)) continue;
|
if (!(item instanceof HttpServlet)) continue;
|
||||||
if (item.getClass().getAnnotation(Rest.RestDynamic.class) == null) continue;
|
if (item.getClass().getAnnotation(Rest.RestDyn.class) == null) continue;
|
||||||
try {
|
try {
|
||||||
Field field = item.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);
|
Field field = item.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);
|
||||||
if (serviceType.equals(field.getType())) {
|
if (serviceType.equals(field.getType())) {
|
||||||
@@ -274,21 +245,21 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
mapfield.setAccessible(true);
|
mapfield.setAccessible(true);
|
||||||
|
|
||||||
Service firstService = (Service) field.get(servlet);
|
Service firstService = (Service) field.get(servlet);
|
||||||
if (name.isEmpty()) {
|
if (resname.isEmpty()) {
|
||||||
field.set(servlet, service);
|
field.set(servlet, service);
|
||||||
firstService = service;
|
firstService = service;
|
||||||
}
|
}
|
||||||
Map map = (Map) mapfield.get(servlet);
|
Map map = (Map) mapfield.get(servlet);
|
||||||
if (map == null && !name.isEmpty()) map = new HashMap();
|
if (map == null && !resname.isEmpty()) map = new HashMap();
|
||||||
if (map != null) {
|
if (map != null) {
|
||||||
map.put(name, service);
|
map.put(resname, service);
|
||||||
if (firstService != null) map.put("", firstService);
|
if (firstService != null) map.put("", firstService);
|
||||||
}
|
}
|
||||||
mapfield.set(servlet, map);
|
mapfield.set(servlet, map);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(serviceType + " generate rest servlet error", e);
|
throw new RuntimeException(serviceType + " generate rest servlet error", e);
|
||||||
}
|
}
|
||||||
if (first) this.prepare.addServlet(servlet, prefix, conf);
|
if (first) this.prepare.addServlet(servlet, prefix, sncp ? Sncp.getConf(service) : null);
|
||||||
return servlet;
|
return servlet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,11 +33,11 @@ public final class Rest {
|
|||||||
|
|
||||||
public static final String REST_HEADER_RESOURCE_NAME = "rest-resource-name";
|
public static final String REST_HEADER_RESOURCE_NAME = "rest-resource-name";
|
||||||
|
|
||||||
static final String REST_SERVICE_FIELD_NAME = "_service";
|
static final String REST_SERVICE_FIELD_NAME = "_redkale_service";
|
||||||
|
|
||||||
static final String REST_SERVICEMAP_FIELD_NAME = "_servicemap"; //如果只有name=""的Service资源,则实例中_servicemap必须为null
|
static final String REST_SERVICEMAP_FIELD_NAME = "_redkale_servicemap"; //如果只有name=""的Service资源,则实例中_servicemap必须为null
|
||||||
|
|
||||||
private static final String REST_PARAMTYPES_FIELD_NAME = "_paramtypes"; //存在泛型的参数数组 Type[][] 第1维度是方法的下标, 第二维度是参数的下标
|
private static final String REST_PARAMTYPES_FIELD_NAME = "_redkale_paramtypes"; //存在泛型的参数数组 Type[][] 第1维度是方法的下标, 第二维度是参数的下标
|
||||||
|
|
||||||
private static final Set<String> EXCLUDERMETHODS = new HashSet<>();
|
private static final Set<String> EXCLUDERMETHODS = new HashSet<>();
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ public final class Rest {
|
|||||||
@Documented
|
@Documented
|
||||||
@Target({TYPE})
|
@Target({TYPE})
|
||||||
@Retention(RUNTIME)
|
@Retention(RUNTIME)
|
||||||
public static @interface RestDynamic {
|
public static @interface RestDyn {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,6 +116,32 @@ public final class Rest {
|
|||||||
return (!controller.name().isEmpty()) ? controller.name() : serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase();
|
return (!controller.name().isEmpty()) ? controller.name() : serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static boolean isRestDyn(HttpServlet servlet) {
|
||||||
|
return servlet.getClass().getAnnotation(RestDyn.class) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Service getService(HttpServlet servlet) {
|
||||||
|
if (servlet == null) return null;
|
||||||
|
try {
|
||||||
|
Field ts = servlet.getClass().getDeclaredField(REST_SERVICE_FIELD_NAME);
|
||||||
|
ts.setAccessible(true);
|
||||||
|
return (Service) ts.get(servlet);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, Service> getServiceMap(HttpServlet servlet) {
|
||||||
|
if (servlet == null) return null;
|
||||||
|
try {
|
||||||
|
Field ts = servlet.getClass().getDeclaredField(REST_SERVICEMAP_FIELD_NAME);
|
||||||
|
ts.setAccessible(true);
|
||||||
|
return (Map) ts.get(servlet);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static <T extends HttpServlet> T createRestWebSocketServlet(final Class<? extends WebSocket> webSocketType) {
|
static <T extends HttpServlet> T createRestWebSocketServlet(final Class<? extends WebSocket> webSocketType) {
|
||||||
if (webSocketType == null) throw new RuntimeException("Rest WebSocket Class is null on createRestWebSocketServlet");
|
if (webSocketType == null) throw new RuntimeException("Rest WebSocket Class is null on createRestWebSocketServlet");
|
||||||
if (Modifier.isAbstract(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot abstract on createRestWebSocketServlet");
|
if (Modifier.isAbstract(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot abstract on createRestWebSocketServlet");
|
||||||
@@ -537,8 +563,8 @@ public final class Rest {
|
|||||||
List<Map<String, Object>> mappingMaps = new ArrayList<>();
|
List<Map<String, Object>> mappingMaps = new ArrayList<>();
|
||||||
cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, supDynName, null);
|
cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, supDynName, null);
|
||||||
|
|
||||||
{ //RestDynamic
|
{ //RestDyn
|
||||||
av0 = cw.visitAnnotation(Type.getDescriptor(RestDynamic.class), true);
|
av0 = cw.visitAnnotation(Type.getDescriptor(RestDyn.class), true);
|
||||||
av0.visitEnd();
|
av0.visitEnd();
|
||||||
}
|
}
|
||||||
{ //RestDynSourceType
|
{ //RestDynSourceType
|
||||||
@@ -565,7 +591,7 @@ public final class Rest {
|
|||||||
classMap.put("url", urlpath);
|
classMap.put("url", urlpath);
|
||||||
classMap.put("moduleid", moduleid);
|
classMap.put("moduleid", moduleid);
|
||||||
classMap.put("repair", repair);
|
classMap.put("repair", repair);
|
||||||
classMap.put("comment", comment);
|
//classMap.put("comment", comment); //不显示太多信息
|
||||||
}
|
}
|
||||||
|
|
||||||
{ //注入 @Resource private XXXService _service;
|
{ //注入 @Resource private XXXService _service;
|
||||||
@@ -1502,8 +1528,7 @@ public final class Rest {
|
|||||||
fv.visitEnd();
|
fv.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
classMap.put("mappings", mappingMaps);
|
//classMap.put("mappings", mappingMaps); //不显示太多信息
|
||||||
|
|
||||||
{ //toString函数
|
{ //toString函数
|
||||||
mv = new AsmMethodVisitor(cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null));
|
mv = new AsmMethodVisitor(cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null));
|
||||||
//mv.setDebug(true);
|
//mv.setDebug(true);
|
||||||
|
|||||||
@@ -89,6 +89,10 @@ public abstract class Sncp {
|
|||||||
return dyn != null && dyn.remote();
|
return dyn != null && dyn.remote();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isSncpDyn(Service service) {
|
||||||
|
return service.getClass().getAnnotation(SncpDyn.class) != null;
|
||||||
|
}
|
||||||
|
|
||||||
public static String getResourceName(Service service) {
|
public static String getResourceName(Service service) {
|
||||||
if (service == null) return null;
|
if (service == null) return null;
|
||||||
Resource res = service.getClass().getAnnotation(Resource.class);
|
Resource res = service.getClass().getAnnotation(Resource.class);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import org.redkale.util.AnyValue;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import org.redkale.service.Service;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -21,30 +22,35 @@ import org.redkale.util.*;
|
|||||||
*/
|
*/
|
||||||
public class SncpPrepareServlet extends PrepareServlet<DLong, SncpContext, SncpRequest, SncpResponse, SncpServlet> {
|
public class SncpPrepareServlet extends PrepareServlet<DLong, SncpContext, SncpRequest, SncpResponse, SncpServlet> {
|
||||||
|
|
||||||
|
private final Object sncplock = new Object();
|
||||||
|
|
||||||
private static final ByteBuffer pongBuffer = ByteBuffer.wrap("PONG".getBytes()).asReadOnlyBuffer();
|
private static final ByteBuffer pongBuffer = ByteBuffer.wrap("PONG".getBytes()).asReadOnlyBuffer();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addServlet(SncpServlet servlet, Object attachment, AnyValue conf, DLong... mappings) {
|
public void addServlet(SncpServlet servlet, Object attachment, AnyValue conf, DLong... mappings) {
|
||||||
addSncpServlet((SncpServlet) servlet, conf);
|
synchronized (sncplock) {
|
||||||
}
|
for (SncpServlet s : getServlets()) {
|
||||||
|
if (s.service == servlet.service) throw new RuntimeException(s.service + " repeat addSncpServlet");
|
||||||
public void addSncpServlet(SncpServlet servlet, AnyValue conf) {
|
|
||||||
setServletConf(servlet, conf);
|
|
||||||
putMapping(servlet.getServiceid(), servlet);
|
|
||||||
putServlet(servlet);
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T> SncpServlet removeSncpServlet(String name, Class<T> type) {
|
|
||||||
SncpServlet rs = null;
|
|
||||||
for (SncpServlet servlet : getServlets()) {
|
|
||||||
if (servlet.serviceName.equals(name) && servlet.type.equals(type)) {
|
|
||||||
rs = servlet;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
setServletConf(servlet, conf);
|
||||||
|
putMapping(servlet.getServiceid(), servlet);
|
||||||
|
putServlet(servlet);
|
||||||
}
|
}
|
||||||
if (rs != null) {
|
}
|
||||||
removeMapping(rs);
|
|
||||||
removeServlet(rs);
|
public <T> SncpServlet removeSncpServlet(Service service) {
|
||||||
|
SncpServlet rs = null;
|
||||||
|
synchronized (sncplock) {
|
||||||
|
for (SncpServlet servlet : getServlets()) {
|
||||||
|
if (servlet.service == service) {
|
||||||
|
rs = servlet;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rs != null) {
|
||||||
|
removeMapping(rs);
|
||||||
|
removeServlet(rs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,19 +73,6 @@ public class SncpServer extends Server<DLong, SncpContext, SncpRequest, SncpResp
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除SncpServlet
|
|
||||||
*
|
|
||||||
* @param <T> 泛型
|
|
||||||
* @param resname String
|
|
||||||
* @param type Class
|
|
||||||
*
|
|
||||||
* @return SncpServlet
|
|
||||||
*/
|
|
||||||
public <T extends Service> SncpServlet removeSncpServlet(String resname, Class<T> type) {
|
|
||||||
return ((SncpPrepareServlet) this.prepare).removeSncpServlet(resname, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除SncpServlet
|
* 删除SncpServlet
|
||||||
*
|
*
|
||||||
@@ -94,20 +81,14 @@ public class SncpServer extends Server<DLong, SncpContext, SncpRequest, SncpResp
|
|||||||
* @return SncpServlet
|
* @return SncpServlet
|
||||||
*/
|
*/
|
||||||
public SncpServlet removeSncpServlet(Service sncpService) {
|
public SncpServlet removeSncpServlet(Service sncpService) {
|
||||||
String resname = Sncp.getResourceName(sncpService);
|
return ((SncpPrepareServlet) this.prepare).removeSncpServlet(sncpService);
|
||||||
return ((SncpPrepareServlet) this.prepare).removeSncpServlet(resname, Sncp.getResourceType(sncpService));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSncpServlet(Service sncpService) {
|
public void addSncpServlet(Service sncpService) {
|
||||||
SncpDynServlet sds = new SncpDynServlet(BsonFactory.root().getConvert(), Sncp.getResourceName(sncpService), Sncp.getResourceType(sncpService), sncpService);
|
SncpDynServlet sds = new SncpDynServlet(BsonFactory.root().getConvert(), Sncp.getResourceName(sncpService), Sncp.getResourceType(sncpService), sncpService);
|
||||||
this.prepare.addServlet(sds, null, Sncp.getConf(sncpService));
|
this.prepare.addServlet(sds, null, Sncp.getConf(sncpService));
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends Service> void addSncpServlet(Class<T> serviceTypeClass, String name, T service, AnyValue conf) {
|
|
||||||
SncpDynServlet sds = new SncpDynServlet(BsonFactory.root().getConvert(), name, serviceTypeClass, service);
|
|
||||||
this.prepare.addServlet(sds, null, conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<SncpServlet> getSncpServlets() {
|
public List<SncpServlet> getSncpServlets() {
|
||||||
return ((SncpPrepareServlet) this.prepare).getSncpServlets();
|
return ((SncpPrepareServlet) this.prepare).getSncpServlets();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ public class _DynHelloRestServlet1 extends SimpleRestServlet {
|
|||||||
HelloService service = new HelloService();
|
HelloService service = new HelloService();
|
||||||
HttpServer server = new HttpServer();
|
HttpServer server = new HttpServer();
|
||||||
|
|
||||||
System.out.println(server.addRestServlet("", HelloService.class, service, SimpleRestServlet.class, "/pipes"));
|
System.out.println(server.addRestServlet(service, null, SimpleRestServlet.class, "/pipes"));
|
||||||
System.out.println(server.addRestServlet("my-res", HelloService.class, new HelloService(3), SimpleRestServlet.class, "/pipes"));
|
System.out.println(server.addRestServlet(new HelloService(3), null, SimpleRestServlet.class, "/pipes"));
|
||||||
|
|
||||||
DefaultAnyValue conf = DefaultAnyValue.create("port", "" + port);
|
DefaultAnyValue conf = DefaultAnyValue.create("port", "" + port);
|
||||||
server.init(conf);
|
server.init(conf);
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class ABMainService implements Service {
|
|||||||
HttpServer server = new HttpServer();
|
HttpServer server = new HttpServer();
|
||||||
server.getLogger().setLevel(Level.WARNING);
|
server.getLogger().setLevel(Level.WARNING);
|
||||||
|
|
||||||
server.addRestServlet("", ABMainService.class, service, HttpServlet.class, "/pipes");
|
server.addRestServlet(service, null, HttpServlet.class, "/pipes");
|
||||||
|
|
||||||
resFactory.inject(cservice);
|
resFactory.inject(cservice);
|
||||||
resFactory.inject(bcservice);
|
resFactory.inject(bcservice);
|
||||||
@@ -114,7 +114,7 @@ public class ABMainService implements Service {
|
|||||||
HttpServer server = new HttpServer();
|
HttpServer server = new HttpServer();
|
||||||
server.getLogger().setLevel(Level.WARNING);
|
server.getLogger().setLevel(Level.WARNING);
|
||||||
|
|
||||||
server.addRestServlet("", ABMainService.class, service, HttpServlet.class, "/pipes");
|
server.addRestServlet(service, null, HttpServlet.class, "/pipes");
|
||||||
|
|
||||||
server.init(DefaultAnyValue.create("port", "" + abport));
|
server.init(DefaultAnyValue.create("port", "" + abport));
|
||||||
server.start();
|
server.start();
|
||||||
|
|||||||
Reference in New Issue
Block a user