From 5b165de39f011b374fa3480a377f9c6584572c08 Mon Sep 17 00:00:00 2001 From: zhaochengke Date: Tue, 9 May 2023 17:33:47 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/nsgk/agentcentersdk/NSMain.java | 38 ++++- .../nsgk/agentcentersdk/api/NSApiResult.java | 39 ++++- .../nsgk/agentcentersdk/api/NSSDKClient.java | 38 ++++- .../nsgk/agentcentersdk/api/NSSDKServer.java | 35 ++++- .../nsgk/agentcentersdk/core/NSProtocol.java | 5 + .../agentcentersdk/core/NSReportObject.java | 25 ++- .../agentcentersdk/entity/NSEntityBase.java | 47 +++++- .../com/nsgk/agentcentersdk/err/NSAssert.java | 28 ++++ .../nsgk/agentcentersdk/err/NSErrGlobal.java | 98 ++++++++++++ .../com/nsgk/agentcentersdk/err/NSErrno.java | 43 ++++++ .../nsgk/agentcentersdk/err/NSException.java | 21 +++ .../network/NSNetworkRequest.java | 12 -- .../network/NSNetworkTransport.java | 5 +- .../nsgk/agentcentersdk/utility/NSArr.java | 27 +++- .../agentcentersdk/utility/NSReflect.java | 144 ++++++++++++++++++ .../agentcentersdk/utility/NSSignTool.java | 2 +- .../agentcenter/AgentCenterController.java | 42 ++++- .../listener/ContractionListener.java | 26 ++++ .../agentcenter/listener/TestListener.java | 7 +- .../object/ContractionMessage.java | 11 ++ .../com/ruoyi/agentcenter/object/Message.java | 31 ++++ .../java/com/ruoyi/common/object/Message.java | 14 -- 22 files changed, 679 insertions(+), 59 deletions(-) create mode 100644 agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSAssert.java create mode 100644 agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSErrGlobal.java create mode 100644 agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSErrno.java create mode 100644 agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSException.java create mode 100644 agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSReflect.java create mode 100644 ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/ContractionListener.java create mode 100644 ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/ContractionMessage.java create mode 100644 ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Message.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/object/Message.java diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java index 112e98a..01512ed 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java @@ -5,10 +5,39 @@ import com.nsgk.agentcentersdk.api.NSSDK; import com.nsgk.agentcentersdk.api.NSSDKClient; import com.nsgk.agentcentersdk.core.NSProtocol; import com.nsgk.agentcentersdk.entity.NSContractionEntity; +import com.nsgk.agentcentersdk.utility.NSReflect; public final class NSMain { - public static void main(String[] args) + public static void main(String[] args) throws Exception + { + //Test(); + Test_reflect(); + } + + public static void Test_reflect() throws InstantiationException, IllegalAccessException + { + Class NSContractionEntity_class = NSReflect.Class("com.nsgk.agentcentersdk.entity.NSContractionEntity"); + Class NSSDK_class = NSReflect.Class("com.nsgk.agentcentersdk.api.NSSDK"); + Object client; + Object entity; + Object result; + + NSReflect.CallStatic_s(NSSDK_class, "InitClient", String.class, "http://localhost", short.class, (short) 8081, String.class, "test", String.class, "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=="); + client = NSReflect.CallStatic(NSSDK_class, "InstanceClient"); + + entity = NSContractionEntity_class.newInstance(); + NSReflect.Call(entity, "setBuildingTime", "2000-12-23"); + NSReflect.Call(entity, "setName", "测试合同"); + NSReflect.Call(entity, "setDeptId", 187L); + NSReflect.Call(entity, "setBookId", 166L); + NSReflect.Call(entity, "setOutId", 250L); + + result = NSReflect.Call_s(client, "Send", int.class, NSProtocol.NS_PROTOCOL_CONTRACTION, NSReflect.Class("com.nsgk.agentcentersdk.entity.NSEntityBase"), entity); + System.err.println(result); + } + + public static void Test() { NSSDKClient client; NSContractionEntity entity; @@ -19,9 +48,10 @@ public final class NSMain entity = new NSContractionEntity(); entity.setBuildingTime("2000-12-23") - .setName("测试合同") - .setDeptId(187L) - .setBookId(166L) + .setName("测试合同") + .setDeptId(187L) + .setBookId(166L) + .setOutId(999L) ; result = client.Send(NSProtocol.NS_PROTOCOL_CONTRACTION, entity); System.err.println(result); diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java index f55a99f..919dfd0 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java @@ -2,22 +2,49 @@ package com.nsgk.agentcentersdk.api; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.nsgk.agentcentersdk.err.NSErrno; import lombok.Data; // 服务端返回对象 @Data -public class NSApiResult +public final class NSApiResult { + public static final int NS_RESULT_SUCCESS = 200; + public static final int NS_RESULT_ERROR = 500; + public final int code; public final String msg; public final Object data; - public final long timestamp = System.currentTimeMillis(); + public final Long timestamp; + public final int errno; NSApiResult(int code, String msg, Object data) + { + this(code, msg, data, NSErrno.ERRNO_OK); + } + + NSApiResult(int code, String msg, Object data, int errno) + { + this(code, msg, data, System.currentTimeMillis(), errno); + } + + NSApiResult(int code, String msg, Object data, Long timestamp, int errno) { this.code = code; this.msg = msg; this.data = data; + this.timestamp = timestamp; + this.errno = errno; + } + + static NSApiResult Success(String msg, Object data) + { + return new NSApiResult(NS_RESULT_SUCCESS, msg, data); + } + + static NSApiResult Error(int errno, String msg, Object data) + { + return new NSApiResult(NS_RESULT_ERROR, msg, data, errno); } static NSApiResult FromJSON(String str) @@ -25,6 +52,12 @@ public class NSApiResult JSONObject jsonObject; jsonObject = JSON.parseObject(str); - return new NSApiResult(jsonObject.getInteger("code"), jsonObject.getString("msg"), jsonObject.get("data")); + return new NSApiResult( + jsonObject.getInteger("code"), + jsonObject.getString("msg"), + jsonObject.containsKey("data") ? jsonObject.get("data") : null, + jsonObject.containsKey("data") ? jsonObject.getLong("timestamp") : null, + jsonObject.containsKey("errno") ? jsonObject.getInteger("errno") : null + ); } } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java index 4aa0ae4..203b055 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java @@ -1,11 +1,19 @@ package com.nsgk.agentcentersdk.api; import cn.hutool.core.util.URLUtil; +import com.nsgk.agentcentersdk.core.NSProtocol; import com.nsgk.agentcentersdk.core.NSReportObject; import com.nsgk.agentcentersdk.entity.NSEntityBase; +import com.nsgk.agentcentersdk.err.NSAssert; +import com.nsgk.agentcentersdk.err.NSErrGlobal; +import com.nsgk.agentcentersdk.err.NSErrno; import com.nsgk.agentcentersdk.network.NSNetworkManager; import com.nsgk.agentcentersdk.network.NSNetworkRequest; import com.nsgk.agentcentersdk.network.NSNetworkResponse; +import com.nsgk.agentcentersdk.utility.NSCrypto; +import com.nsgk.agentcentersdk.utility.NSStr; + +import java.util.Objects; // SDK客户端 /* @@ -42,12 +50,16 @@ public final class NSSDKClient NSReportObject reportObject; NSNetworkRequest request; + NSAssert.NotNull(object, NSErrno.ERRNO_CLI_DATA_MISSING); + NSAssert.NotEmpty(identifier, NSErrno.ERRNO_CLI_PARAMETER_MISSING); + NSErrGlobal.ASSERT(NSProtocol.IsValid(protocol), NSErrno.ERRNO_SYS_INVALID_PROTOCOL); url = NSApi.NS_API_REPORT; reportObject = new NSReportObject<>(identifier, protocol, object); request = new NSNetworkRequest(); request.setUrl(BuildUrl(url)); - request.WriteDataObject(reportObject, publicKey); + WriteDataObject(request, reportObject); NSNetworkResponse response = NSNetworkManager.Post(request); + NSErrGlobal.ASSERT(response.IsSuccess(), NSErrno.ERRNO_SYS_HTTP); String json = response.getData(); return NSApiResult.FromJSON(json); } @@ -56,4 +68,28 @@ public final class NSSDKClient { return URLUtil.completeUrl(host + ":" + port, url); } + + private void WriteDataObject(NSNetworkRequest request, NSReportObject object) + { + String dataStr; + + request.ClearHeaders().AddHeader("sign", object.getSign()); + request.ClearQueries().AddQuery("identifier", object.getIdentifier()) + .AddQuery("protocol", object.getProtocol()) + .AddQuery("timestamp", object.getTimestamp()) + ; + dataStr = object.getDataStr(); + try + { + dataStr = NSCrypto.RSAEncrypt(dataStr, publicKey); + NSAssert.NotEmpty(dataStr, NSErrno.ERRNO_SYS_ENCRYPT_FAIL); + } + catch(Exception e) + { + e.printStackTrace(); + NSErrGlobal.Throw(NSErrno.ERRNO_SYS_ENCRYPT_FAIL); + return; + } + request.setData(dataStr); + } } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java index 600c8e4..29b873d 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java @@ -2,12 +2,14 @@ package com.nsgk.agentcentersdk.api; import com.nsgk.agentcentersdk.core.NSReportObject; import com.nsgk.agentcentersdk.entity.NSEntityBase; +import com.nsgk.agentcentersdk.err.NSAssert; +import com.nsgk.agentcentersdk.err.NSErrGlobal; +import com.nsgk.agentcentersdk.err.NSErrno; import com.nsgk.agentcentersdk.utility.NSArr; import com.nsgk.agentcentersdk.utility.NSCrypto; import com.nsgk.agentcentersdk.utility.NSHttp; import javax.servlet.http.HttpServletRequest; -import java.util.Map; // SDK服务端 public final class NSSDKServer @@ -27,24 +29,47 @@ public final class NSSDKServer String data; sign = request.getHeader("sign"); + NSAssert.NotEmpty(sign, NSErrno.ERRNO_CLI_SIGN_MISSING); data = NSHttp.GetRequestBody(request); + NSAssert.NotEmpty(data, NSErrno.ERRNO_CLI_DATA_MISSING); res = new NSReportObject<>(); res.SetTimestampStr(request.getParameter("timestamp")) .setIdentifier(request.getParameter("identifier")) .SetProtocolStr(request.getParameter("protocol")) - .SetDataStr(NSCrypto.RSADecrypt(data, privateKey), clazz) ; + try + { + data = NSCrypto.RSADecrypt(data, privateKey); + NSAssert.NotEmpty(data, NSErrno.ERRNO_SYS_DECRYPT_FAIL); + res.SetDataStr(data, clazz); + } + catch(Exception e) + { + e.printStackTrace(); + return NSErrGlobal.ThrowAndReturnNull(NSErrno.ERRNO_SYS_DECRYPT_FAIL); + } if(!res.CheckSign(sign)) { - return null; + return NSErrGlobal.ThrowAndReturn(NSErrno.ERRNO_SYS_INVALID_SIGN, null); } res.setSign(sign); return res; } // 响应客户端 - public NSApiResult Resp(int code, String msg, Object...data) + public static NSApiResult Resp(int code, String msg, Object...data) { - return new NSApiResult(code, msg, NSArr.DefParms(data)); + return new NSApiResult(code, msg, NSArr.DefParm(data)); } + + public static NSApiResult Success(String msg, Object...data) + { + return NSApiResult.Success(msg, NSArr.DefParm(data)); + } + + public static NSApiResult Fail(int errno, String msg, Object...data) + { + return NSApiResult.Error(errno, msg, NSArr.DefParm(data)); + } + } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSProtocol.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSProtocol.java index 40be408..76da420 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSProtocol.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSProtocol.java @@ -13,5 +13,10 @@ public final class NSProtocol return Math.abs(i); } + public static boolean IsValid(int protocol) + { + return protocol > 0; // TODO: full check + } + private NSProtocol() {} } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSReportObject.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSReportObject.java index 4d080fd..51b1989 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSReportObject.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSReportObject.java @@ -2,6 +2,8 @@ package com.nsgk.agentcentersdk.core; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson2.JSON; +import com.nsgk.agentcentersdk.err.NSErrGlobal; +import com.nsgk.agentcentersdk.err.NSErrno; import com.nsgk.agentcentersdk.utility.NSSignTool; import com.nsgk.agentcentersdk.utility.NSStr; import lombok.Data; @@ -14,11 +16,12 @@ import java.util.Map; @Accessors(chain = true) public class NSReportObject { - protected static final String[] SIGN_FIELDS = { - "identifier", "protocol", "timestamp", "dataLength", + protected static final String[] SIGN_FIELDS = { // 字母顺序 + "identifier", "protocol", "timestamp", "length", }; private String identifier; // 识别ID private String sign; // 签名 + // md5(identifier=<客户端身份标识ID>&length=&protocol=<协议>×tamp=<毫秒时间戳>) private int protocol = NSProtocol.NS_PROTOCOL_INVALID; // 协议 private Long timestamp; // 客户端时间戳 private T data; @@ -60,16 +63,26 @@ public class NSReportObject public boolean IsValid() { - return NSStr.IsNotEmpty(identifier) && null != timestamp && protocol > 0; + return NSStr.IsNotEmpty(identifier) && null != timestamp && timestamp > 0 && NSProtocol.IsValid(protocol); } + //"d10457fb8d1ae32b27f9eb9c0a107c75" public String Sign() { Map map; - map = BeanUtil.beanToMap(this); - map.put("dataLength", NSStr.Length(dataStr)); - return NSSignTool.Sign(map, SIGN_FIELDS); + NSErrGlobal.ASSERT(IsValid(), NSErrno.ERRNO_CLI_PARAMETER_MISSING); + try + { + map = BeanUtil.beanToMap(this); + map.put("length", NSStr.Length(dataStr)); + return NSSignTool.Sign(map, SIGN_FIELDS); + } + catch(Exception e) + { + e.printStackTrace(); + return NSErrGlobal.ThrowAndReturnNull(NSErrno.ERRNO_SYS_INVALID_SIGN); + } } public boolean CheckSign(String src) diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java index 1c61528..d99c107 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java @@ -1,9 +1,12 @@ package com.nsgk.agentcentersdk.entity; +import com.nsgk.agentcentersdk.utility.NSArr; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; // 基本实体 @Data @@ -19,5 +22,47 @@ public abstract class NSEntityBase implements Serializable protected Long deptId; /** 外部ID */ - private Long outId; + protected Long outId; + + protected Map parms; + + protected Map PARMS() + { + if(null == parms) + parms = new LinkedHashMap<>(); + return parms; + } + + @SuppressWarnings("unchecked") + public T Parm(String name, Object val) + { + PARMS().put(name, val); + return (T)this; + } + + @SuppressWarnings("unchecked") + public T DelParm(String...name) + { + if(null != parms && NSArr.IsNotEmpty(name)) + { + NSArr.Stream(name).forEach(parms::remove); + } + return (T)this; + } + + public boolean HasParm(String name) + { + if(null == parms) + return false; + return parms.containsKey(name); + } + + @SuppressWarnings("unchecked") + public T ParmT(String name, T...val) + { + T def = NSArr.DefParm(val); + if(null == parms) + return def; + return (T)parms.getOrDefault(name, def); + } } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSAssert.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSAssert.java new file mode 100644 index 0000000..b2ef3c6 --- /dev/null +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSAssert.java @@ -0,0 +1,28 @@ +package com.nsgk.agentcentersdk.err; + +import cn.hutool.core.collection.CollectionUtil; +import com.nsgk.agentcentersdk.utility.NSStr; + +import java.util.Collection; +import java.util.Objects; + +// 断言 +public final class NSAssert +{ + public static void NotNull(Object obj, Integer...err) + { + NSErrGlobal.ASSERT(Objects.nonNull(obj), err); + } + + public static void NotEmpty(String obj, Integer...err) + { + NSErrGlobal.ASSERT(NSStr.IsNotEmpty(obj), err); + } + + public static void NotEmpty(Collection obj, Integer...err) + { + NSErrGlobal.ASSERT(CollectionUtil.isNotEmpty(obj), err); + } + + private NSAssert() {} +} diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSErrGlobal.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSErrGlobal.java new file mode 100644 index 0000000..9f2d485 --- /dev/null +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSErrGlobal.java @@ -0,0 +1,98 @@ +package com.nsgk.agentcentersdk.err; + +import com.nsgk.agentcentersdk.utility.NSArr; + +import java.io.Serializable; + +// 全局错误记录 +public final class NSErrGlobal +{ + private static final ThreadLocal errno = new ThreadLocal<>(); + + public static int Err(int newErr) + { + int err; + + err = errno.get(); + errno.set(newErr); + return err; + } + + public static void Throw(int err) + { + if(err == NSErrno.ERRNO_OK) + return; + throw new NSException(err); + } + + public static void Throw() + { + Throw(Errno()); + } + + public static T ThrowAndReturnNull(int err) + { + return ThrowAndReturn(err, null); + } + + public static T ThrowAndReturnNull() + { + return ThrowAndReturn(null); + } + + public static T ThrowAndReturn(int err, T t) + { + if(err == NSErrno.ERRNO_OK) + return t; + throw new NSException(err); + } + + public static T ThrowAndReturn(T t) + { + return ThrowAndReturn(Errno(), t); + } + + public static T Return(int err, T t) + { + if(err != NSErrno.ERRNO_OK) + Err(err); + return t; + } + + public static T Return(T t) + { + return Return(Errno(), t); + } + + // 默认清除 + public static int Errno(boolean...clear) + { + int err; + + err = errno.get(); + if(null == clear || clear.length == 0 || clear[0]) + errno.set(NSErrno.ERRNO_OK); + return err; + } + + public static boolean HasError(boolean...clear) + { + return Errno(clear) != NSErrno.ERRNO_OK; + } + + public static String Error(boolean...clear) + { + return NSErrno.ErrStr(Errno(clear)); + } + + public static void ASSERT(boolean expression, Integer...err) + { + int e; + + e = NSArr.GetParm(NSErrno.ERRNO_ERROR, err); + if(!expression) + Throw(e); + } + + private NSErrGlobal() {} +} diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSErrno.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSErrno.java new file mode 100644 index 0000000..15c1eb3 --- /dev/null +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSErrno.java @@ -0,0 +1,43 @@ +package com.nsgk.agentcentersdk.err; + +// 错误码 +public final class NSErrno +{ + public static final int ERRNO_OK = 0; + + public static final int ERRNO_ERROR = 0x00001; + + public static final int ERRNO_SYS_INVALID_SIGN = 0x01001; + public static final int ERRNO_SYS_ENCRYPT_FAIL = 0x01002; + public static final int ERRNO_SYS_DECRYPT_FAIL = 0x01003; + public static final int ERRNO_SYS_INVALID_PROTOCOL = 0x01004; + public static final int ERRNO_SYS_SIGN_FAIL = 0x01005; + public static final int ERRNO_SYS_HTTP = 0x01006; + + public static final int ERRNO_CLI_PARAMETER_MISSING = 0x03001; + public static final int ERRNO_CLI_DATA_MISSING = 0x03002; + public static final int ERRNO_CLI_SIGN_MISSING = 0x03003; + + public static final int ERRNO_SRV_HTTP = 0x04001; + + private NSErrno() {} + + public static String ErrStr(int errno) + { + switch(errno) + { + case ERRNO_SYS_INVALID_SIGN: return "签名无效"; + case ERRNO_SYS_ENCRYPT_FAIL: return "加密失败"; + case ERRNO_SYS_DECRYPT_FAIL: return "解密失败"; + case ERRNO_SYS_INVALID_PROTOCOL: return "无效协议"; + case ERRNO_SYS_SIGN_FAIL: return "签名失败"; + case ERRNO_SYS_HTTP: return "Http请求错误"; + + case ERRNO_CLI_PARAMETER_MISSING: return "参数缺失"; + case ERRNO_CLI_DATA_MISSING: return "数据缺失"; + case ERRNO_CLI_SIGN_MISSING: return "签名缺失"; + + case ERRNO_ERROR: default: return "错误"; + } + } +} diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSException.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSException.java new file mode 100644 index 0000000..b203a14 --- /dev/null +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/err/NSException.java @@ -0,0 +1,21 @@ +package com.nsgk.agentcentersdk.err; + +import lombok.Data; + +@Data +public final class NSException extends RuntimeException +{ + private final int errno; + + public NSException(int errno) + { + super(NSErrno.ErrStr(errno)); + this.errno = errno; + } + + public NSException(int errno, String error) + { + super(error); + this.errno = errno; + } +} diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkRequest.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkRequest.java index 79c07f8..92b1e07 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkRequest.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkRequest.java @@ -10,16 +10,4 @@ import lombok.experimental.Accessors; @Accessors(chain = true) public class NSNetworkRequest extends NSNetworkTransport { - public void WriteDataObject(NSReportObject object, String publicKey) - { - String dataStr; - - ClearHeaders().AddHeader("sign", object.getSign()); - ClearQueries().AddQuery("identifier", object.getIdentifier()) - .AddQuery("protocol", object.getProtocol()) - .AddQuery("timestamp", object.getTimestamp()) - ; - dataStr = object.getDataStr(); - setData(NSCrypto.RSAEncrypt(dataStr, publicKey)); - } } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkTransport.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkTransport.java index 420adfc..f150641 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkTransport.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkTransport.java @@ -5,7 +5,6 @@ import com.nsgk.agentcentersdk.utility.NSStr; import lombok.Data; import lombok.experimental.Accessors; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -40,7 +39,7 @@ public class NSNetworkTransport public String Header(String name, String...value) { - return headers.getOrDefault(name, NSArr.DefParms(value)); + return headers.getOrDefault(name, NSArr.DefParm(value)); } public NSNetworkTransport ClearQueries() @@ -57,6 +56,6 @@ public class NSNetworkTransport public Object Query(String name, Object...value) { - return query.getOrDefault(name, NSArr.DefParms(value)); + return query.getOrDefault(name, NSArr.DefParm(value)); } } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSArr.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSArr.java index 4ee0415..12fd353 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSArr.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSArr.java @@ -1,14 +1,39 @@ package com.nsgk.agentcentersdk.utility; +import java.util.ArrayList; +import java.util.stream.Stream; + // 数组工具 public final class NSArr { - public static T DefParms(T...args) + public static T DefParm(T...args) { if(null == args || args.length == 0) return null; return args[0]; } + public static T GetParm(T def, T[] args) + { + if(null == args || args.length == 0) + return def; + return args[0]; + } + + public static boolean IsEmpty(T...args) + { + return(null == args || args.length == 0); + } + + public static boolean IsNotEmpty(T...args) + { + return !IsEmpty(args); + } + + public static Stream Stream(T...args) + { + return IsEmpty(args) ? new ArrayList().stream() : Stream.of(args); + } + private NSArr() {} } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSReflect.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSReflect.java new file mode 100644 index 0000000..2950b0f --- /dev/null +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSReflect.java @@ -0,0 +1,144 @@ +package com.nsgk.agentcentersdk.utility; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +// 反射工具 +public final class NSReflect +{ + public static Class Class(String className) + { + try + { + return Class.forName(className); + } + catch(ClassNotFoundException e) + { + e.printStackTrace(); + throw new RuntimeException("SDK版本不匹配"); + } + } + + @SuppressWarnings("unchecked") + public static T CallStaticT(Class classObject, String methodName, Object...args) + { + return (T)CallStatic(classObject, methodName, args); + } + + @SuppressWarnings("unchecked") + public static T CallStaticT_s(Class classObject, String methodName, Object...args) + { + return (T)CallStatic_s(classObject, methodName, args); + } + + public static Object CallStatic(Class classObject, String methodName, Object...args) + { + if(null == args || args.length == 0) + return CallStatic_s(classObject, methodName); + Object[] objs = new Object[args.length * 2]; + for(int i = 0; i < args.length; i++) + { + objs[i * 2] = args[i].getClass(); + objs[i * 2 + 1] = args[i]; + } + return CallStatic_s(classObject, methodName, objs); + } + + public static Object CallStatic_s(Class classObject, String methodName, Object...args) + { + List> classes = new ArrayList<>(); + List params = new ArrayList<>(); + if(null != args && args.length > 0) + { + for(int i = 0; i < args.length; i += 2) + { + Class clazz; + Object c = args[i]; + if(null != c) + clazz = (Class) c; + else + clazz = args[i + 1].getClass(); + classes.add(clazz); + params.add(args[i + 1]); + } + } + try + { + Method method = classObject.getMethod(methodName, classes.toArray(new Class[0])); + return method.invoke(null, params.toArray(new Object[0])); + } + catch(NoSuchMethodException | IllegalAccessException | IllegalArgumentException e) + { + e.printStackTrace(); + throw new RuntimeException("SDK版本不匹配"); + } + catch(Exception e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + @SuppressWarnings("unchecked") + public static T CallT(Object object, String methodName, Object...args) + { + return (T)Call(object, methodName, args); + } + + @SuppressWarnings("unchecked") + public static T CallT_s(Object object, String methodName, Object...args) + { + return (T)Call_s(object, methodName, args); + } + + public static Object Call(Object object, String methodName, Object...args) + { + if(null == args || args.length == 0) + return Call_s(object, methodName); + Object[] objs = new Object[args.length * 2]; + for(int i = 0; i < args.length; i++) + { + objs[i * 2] = args[i].getClass(); + objs[i * 2 + 1] = args[i]; + } + return Call_s(object, methodName, objs); + } + + public static Object Call_s(Object object, String methodName, Object...args) + { + List> classes = new ArrayList<>(); + List params = new ArrayList<>(); + if(null != args && args.length > 0) + { + for(int i = 0; i < args.length; i += 2) + { + Class clazz; + Object c = args[i]; + if(null != c) + clazz = (Class) c; + else + clazz = args[i + 1].getClass(); + classes.add(clazz); + params.add(args[i + 1]); + } + } + try + { + Method method = object.getClass().getMethod(methodName, classes.toArray(new Class[0])); + return method.invoke(object, params.toArray(new Object[0])); + } + catch(NoSuchMethodException | IllegalAccessException | IllegalArgumentException e) + { + e.printStackTrace(); + throw new RuntimeException("SDK版本不匹配"); + } + catch(Exception e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + private NSReflect() {} +} diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSSignTool.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSSignTool.java index 3b4b3a0..769053b 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSSignTool.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSSignTool.java @@ -24,7 +24,7 @@ public final class NSSignTool fields = Arrays.stream(signFields).sorted(String::compareTo).collect(Collectors.toList()); sb = new StringBuilder(); for(int i = 0; i < fields.size(); i++) - {//dataLength=69&identifier=test&protocol=1×tamp=1683442648774 + { if(i > 0) sb.append("&"); String key = fields.get(i); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java index 09d4624..e5074c3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java @@ -3,10 +3,17 @@ package com.ruoyi.web.controller.agentcenter; import com.nsgk.agentcentersdk.api.NSApiResult; import com.nsgk.agentcentersdk.api.NSSDK; import com.nsgk.agentcentersdk.api.NSSDKServer; +import com.nsgk.agentcentersdk.core.NSProtocol; import com.nsgk.agentcentersdk.core.NSReportObject; import com.nsgk.agentcentersdk.entity.NSContractionEntity; +import com.nsgk.agentcentersdk.err.NSErrGlobal; +import com.nsgk.agentcentersdk.err.NSErrno; +import com.nsgk.agentcentersdk.err.NSException; +import com.ruoyi.agentcenter.object.ContractionMessage; +import com.ruoyi.agentcenter.object.Message; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.utils.EventBusEngine; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -32,7 +39,7 @@ public class AgentCenterController extends BaseController server = NSSDK.InstanceServer(); recv = server.Recv(request, NSContractionEntity.class); - return server.Resp(200, "测试成功", recv.getDataStr()); + return server.Resp(0, "测试成功", recv.getDataStr()); } @PostMapping("/report") @@ -42,9 +49,36 @@ public class AgentCenterController extends BaseController NSReportObject recv; NSSDK.InitServer(RuoYiConfig.Secret.privateKey); - server = NSSDK.InstanceServer(); - recv = server.Recv(request, NSContractionEntity.class); + try + { + server = NSSDK.InstanceServer(); + recv = server.Recv(request, NSContractionEntity.class); + + EventBusEngine.Post(convMsg(recv)); + + return NSSDKServer.Success("上报成功"); + } + catch(NSException e) + { + return NSSDKServer.Fail(e.getErrno(), e.getMessage()); + } + } + + private Message convMsg(NSReportObject reportObject) + { + Message msg; + int protocol; - return server.Resp(200, "上报成功", recv.getDataStr()); + protocol = reportObject.getProtocol(); + switch(reportObject.getProtocol()) + { + case NSProtocol.NS_PROTOCOL_CONTRACTION: + msg = new ContractionMessage(protocol, reportObject.getIdentifier(), reportObject.getTimestamp(), (NSContractionEntity)reportObject.getData()); + break; + default: + NSErrGlobal.Err(NSErrno.ERRNO_SYS_INVALID_PROTOCOL); + throw new RuntimeException(String.format("未知的协议类型: 0x%x", protocol)); + } + return msg; } } diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/ContractionListener.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/ContractionListener.java new file mode 100644 index 0000000..191bd16 --- /dev/null +++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/ContractionListener.java @@ -0,0 +1,26 @@ +package com.ruoyi.agentcenter.listener; + +import com.alibaba.fastjson2.JSONObject; +import com.google.common.eventbus.Subscribe; +import com.ruoyi.agentcenter.object.ContractionMessage; +import com.ruoyi.common.utils.EventBusEngine; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +@Component +public class ContractionListener +{ + @PostConstruct + public void init() + { + EventBusEngine.Register(this); + } + + @Subscribe + //@AllowConcurrentEvents + public void handle(ContractionMessage msg) + { + System.err.println(JSONObject.toJSONString(msg)); + } +} diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/TestListener.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/TestListener.java index 7fa25a3..ad1711d 100644 --- a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/TestListener.java +++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/TestListener.java @@ -1,8 +1,7 @@ package com.ruoyi.agentcenter.listener; -import com.google.common.eventbus.AllowConcurrentEvents; import com.google.common.eventbus.Subscribe; -import com.ruoyi.common.object.Message; +import com.ruoyi.agentcenter.object.Message; import com.ruoyi.common.utils.EventBusEngine; import org.springframework.stereotype.Component; @@ -14,13 +13,13 @@ public class TestListener @PostConstruct public void init() { - EventBusEngine.Register(this); + //EventBusEngine.Register(this); } @Subscribe //@AllowConcurrentEvents public void handle(Message msg) { - System.err.println("LLL " + msg.data + " " + Thread.currentThread().getId()); + System.err.println("LLL " + msg.getData() + " " + Thread.currentThread().getId()); } } diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/ContractionMessage.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/ContractionMessage.java new file mode 100644 index 0000000..557abaa --- /dev/null +++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/ContractionMessage.java @@ -0,0 +1,11 @@ +package com.ruoyi.agentcenter.object; + +import com.nsgk.agentcentersdk.entity.NSContractionEntity; + +public class ContractionMessage extends Message +{ + public ContractionMessage(int protocol, String identifier, Long timestamp, NSContractionEntity data) + { + super(protocol, identifier, timestamp, data); + } +} diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Message.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Message.java new file mode 100644 index 0000000..16aaad7 --- /dev/null +++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Message.java @@ -0,0 +1,31 @@ +package com.ruoyi.agentcenter.object; + +import com.nsgk.agentcentersdk.core.NSProtocol; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public abstract class Message +{ + private final int protocol; // 协议 + private final String identifier; // 识别ID + private final Long timestamp; // 客户端时间戳 + private final T data; + + public Message() + { + this.protocol = NSProtocol.NS_PROTOCOL_INVALID; + this.identifier = ""; + this.timestamp = 0L; + this.data = null; + } + + public Message(int protocol, String identifier, Long timestamp, T data) + { + this.protocol = protocol; + this.identifier = identifier; + this.timestamp = timestamp; + this.data = data; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/object/Message.java b/ruoyi-common/src/main/java/com/ruoyi/common/object/Message.java deleted file mode 100644 index 3654714..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/object/Message.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ruoyi.common.object; - -import lombok.Data; -import lombok.experimental.Accessors; - -@Data -@Accessors(chain = true) -public final class Message -{ - public static final int PROTOCOL_INVALID = 0; - - public int protocol = PROTOCOL_INVALID; - public Object data; -}