From ea04a3e9fc93ffd76e0811244739d21947c44cd2 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Sat, 31 Jan 2026 19:24:03 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E6=8F=90=E5=8F=96=E6=8E=A5=E5=8F=A3):?= =?UTF-8?q?=20=E6=8F=90=E5=8F=96=E4=BA=86Client/Server=E7=B1=BB=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 1 - .idea/uiDesigner.xml | 124 +++++++++ Common/build.gradle | 13 - .../websocket/AbstractWebSocketClient.java | 200 +++++++------- .../websocket/AbstractWebSocketServer.java | 250 +++++++----------- .../dg_lab/websocket/PowerBoxWSClient.java | 38 +-- .../dg_lab/websocket/PowerBoxWSServer.java | 54 ++-- .../sharedData/ClientPowerBoxSharedData.java | 3 +- CommonApi/build.gradle | 12 +- .../dg_lab/api/manager/IDGLabManager.java | 1 + .../dg_lab/api/operation/ClientOperation.java | 4 + .../dg_lab/api/operation/ServerOperation.java | 4 + .../api/websocket/IWebSocketServer.java | 79 ++++++ .../api/websocket/IWebsocketClient.java | 72 +++++ .../dg_lab/api/websocket/IWebsocketSide.java | 72 +++++ .../dg_lab/api/websocket/message/Message.java | 23 ++ .../websocket/message/PowerBoxMessage.java | 11 +- .../api/websocket/message/data/DataType.java | 4 + .../api/websocket/message/data/IData.java | 3 + .../websocket/message/data/PowerBoxData.java | 5 +- build.gradle | 14 +- gradle.properties | 2 +- 22 files changed, 657 insertions(+), 332 deletions(-) create mode 100644 .idea/uiDesigner.xml create mode 100644 CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebSocketServer.java create mode 100644 CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebsocketClient.java create mode 100644 CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebsocketSide.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 1867029..2e12d27 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/build.gradle b/Common/build.gradle index 8703172..7c45839 100644 --- a/Common/build.gradle +++ b/Common/build.gradle @@ -25,19 +25,6 @@ repositories { dependencies { // Common 依赖 CommonApi api project(':CommonApi') - - implementation 'org.apache.logging.log4j:log4j-core:2.23.1' - implementation 'org.apache.logging.log4j:log4j-api:2.23.1' - implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.23.1' - implementation 'org.realityforge.org.jetbrains.annotations:org.jetbrains.annotations:1.7.0' - implementation 'org.apache.commons:commons-lang3:3.17.0' - implementation 'com.google.guava:guava:33.3.0-jre' - implementation 'io.netty:netty-all:4.1.109.Final' - implementation 'com.google.code.gson:gson:2.10.1' - implementation 'org.slf4j:slf4j-api:2.0.16' - - testImplementation platform('org.junit:junit-bom:5.10.0') - testImplementation 'org.junit.jupiter:junit-jupiter' } // Sources JAR diff --git a/Common/src/main/java/com/r3944realms/dg_lab/websocket/AbstractWebSocketClient.java b/Common/src/main/java/com/r3944realms/dg_lab/websocket/AbstractWebSocketClient.java index adc8c50..5e088b8 100644 --- a/Common/src/main/java/com/r3944realms/dg_lab/websocket/AbstractWebSocketClient.java +++ b/Common/src/main/java/com/r3944realms/dg_lab/websocket/AbstractWebSocketClient.java @@ -18,7 +18,7 @@ package com.r3944realms.dg_lab.websocket; import com.r3944realms.dg_lab.DgLab; import com.r3944realms.dg_lab.api.manager.Status; -import com.r3944realms.dg_lab.api.websocket.message.Message; +import com.r3944realms.dg_lab.api.websocket.IWebsocketClient; import com.r3944realms.dg_lab.utils.stringUtils.StringHandlerUtil; import com.r3944realms.dg_lab.utils.stringUtils.UrlValidator; import io.netty.bootstrap.Bootstrap; @@ -48,7 +48,7 @@ import java.util.concurrent.CompletableFuture; /** * 主要是处理netty逻辑以建立客户端 */ -public abstract class AbstractWebSocketClient { +public abstract class AbstractWebSocketClient implements IWebsocketClient { /** * 日志 */ @@ -56,11 +56,11 @@ public abstract class AbstractWebSocketClient { /** * 地址 */ - protected volatile String Address; + protected volatile String address; /** * 端口 */ - protected volatile int Port; + protected volatile int port; /** * 启用 SSL @@ -74,43 +74,43 @@ public abstract class AbstractWebSocketClient { * @param certFile 可选证书文件 */ public void enableSSL(@Nullable File certFile) { - this.SslEnabled = true; - this.CertFile = certFile; + this.sslEnabled = true; + this.certFile = certFile; } /** * 禁用SSL */ public void disableSSL() { - this.SslEnabled = false; + this.sslEnabled = false; } /** * 是否启用 SSL */ - boolean SslEnabled; + boolean sslEnabled; /** * 客户端可选信任证书 */ - File CertFile; + File certFile; /** * 客户端启动类 */ - private Bootstrap ClientBootstrap; + private Bootstrap clientBootstrap; /** * 客户端事件线程组 */ - private EventLoopGroup ClientEventLoopGroup; + private EventLoopGroup clientEventLoopGroup; /** * The Client channel. */ - protected Channel ClientChannel; + protected Channel clientChannel; - private Thread WebSocketClientThread; + private Thread webSocketClientThread; /** * The Client status. */ - protected volatile Status ClientStatus = Status.WAITING_FOR_INIT; + protected volatile Status clientStatus = Status.WAITING_FOR_INIT; /** * Gets status. @@ -118,7 +118,7 @@ public abstract class AbstractWebSocketClient { * @return the status */ public Status getStatus() { - return this.ClientStatus; + return this.clientStatus; } /** @@ -126,16 +126,18 @@ public abstract class AbstractWebSocketClient { * * @return enable */ - public boolean isSslEnabled() { - return this.SslEnabled; + @Override + public boolean isSSLEnabled() { + return sslEnabled; } + /** * Sets status. * * @param status the status */ public void setStatus(Status status) { - this.ClientStatus = status; + this.clientStatus = status; } /** @@ -143,8 +145,8 @@ public abstract class AbstractWebSocketClient { */ protected AbstractWebSocketClient() { try { - this.Address = InetAddress.getLocalHost().getHostAddress(); - this.Port = 9000; + this.address = InetAddress.getLocalHost().getHostAddress(); + this.port = 9000; } catch (UnknownHostException e) { logger.error(e.getMessage()); } @@ -158,8 +160,8 @@ public abstract class AbstractWebSocketClient { protected AbstractWebSocketClient(int port) { try { InetAddress localHost = InetAddress.getLocalHost(); - this.Address = localHost.getHostAddress(); - this.Port = UrlValidator.isValidPort(port) ? port : 9000; + this.address = localHost.getHostAddress(); + this.port = UrlValidator.isValidPort(port) ? port : 9000; } catch (UnknownHostException e) { logger.error(e.getMessage()); } @@ -173,24 +175,35 @@ public abstract class AbstractWebSocketClient { */ protected AbstractWebSocketClient(String address, int port) { try { - this.Address = UrlValidator.isValidAddress(address) ? address : InetAddress.getLocalHost().getHostAddress(); - this.Port = UrlValidator.isValidPort(port) ? port : 9000; + this.address = UrlValidator.isValidAddress(address) ? address : InetAddress.getLocalHost().getHostAddress(); + this.port = UrlValidator.isValidPort(port) ? port : 9000; } catch (UnknownHostException e) { logger.error(e.getMessage()); } } + @Override + public int getPort() { + return port; + } + /** * Sets port. * * @param port the port */ + @Override public void setPort(int port) { - if (this.ClientStatus != Status.WAITING_FOR_INIT && this.ClientStatus != Status.STOPPED) { + if (this.clientStatus != Status.WAITING_FOR_INIT && this.clientStatus != Status.STOPPED) { logger.error("Unable to change port to {}", port); return; } - this.Port = UrlValidator.isValidPort(port) ? port : 9000; + this.port = UrlValidator.isValidPort(port) ? port : 9000; + } + + @Override + public String getAddress() { + return address; } /** @@ -199,12 +212,12 @@ public abstract class AbstractWebSocketClient { * @param address the address */ public void setAddress(String address) { - if (this.ClientStatus != Status.WAITING_FOR_INIT && this.ClientStatus != Status.STOPPED) { + if (this.clientStatus != Status.WAITING_FOR_INIT && this.clientStatus != Status.STOPPED) { logger.error("Unable to change address to {}", address); return; } try { - this.Address = UrlValidator.isValidAddress(address) ? address : InetAddress.getLocalHost().getHostAddress(); + this.address = UrlValidator.isValidAddress(address) ? address : InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { throw new RuntimeException(e); } @@ -231,7 +244,7 @@ public abstract class AbstractWebSocketClient { * @return the url */ public String getUrl() { - return StringHandlerUtil.buildWebSocketURL(Address, Port, false); + return StringHandlerUtil.buildWebSocketURL(address, port, false); } /** @@ -250,35 +263,36 @@ public abstract class AbstractWebSocketClient { * Init thread. */ protected final void initThread() { - ClientEventLoopGroup = new NioEventLoopGroup(); - WebSocketClientThread = new Thread(() -> { - ClientStatus = Status.STARTING; - ClientBootstrap = new Bootstrap(); - ClientBootstrap.group(ClientEventLoopGroup); - ClientBootstrap.channel(NioSocketChannel.class); - ClientBootstrap.handler(new ChannelInitializer() { + init(); + clientEventLoopGroup = new NioEventLoopGroup(); + webSocketClientThread = new Thread(() -> { + clientStatus = Status.STARTING; + clientBootstrap = new Bootstrap(); + clientBootstrap.group(clientEventLoopGroup); + clientBootstrap.channel(NioSocketChannel.class); + clientBootstrap.handler(new ChannelInitializer() { @Override protected void initChannel(NioSocketChannel ch) throws SSLException { ChannelPipeline pipeline = ch.pipeline(); // SSL 支持 - if (SslEnabled) { + if (sslEnabled) { SslContext sslCtx; - if (CertFile != null && CertFile.exists()) { + if (certFile != null && certFile.exists()) { sslCtx = SslContextBuilder.forClient() - .trustManager(CertFile) + .trustManager(certFile) .build(); } else { // 默认信任所有受信任的 CA sslCtx = SslContextBuilder.forClient().build(); } - pipeline.addFirst(sslCtx.newHandler(ch.alloc(), Address, Port)); + pipeline.addFirst(sslCtx.newHandler(ch.alloc(), address, port)); } pipeline.addLast(DgLab.LOGGING_HANDLER, new HttpClientCodec(), new HttpObjectAggregator(65536), new WebSocketClientProtocolHandler( WebSocketClientHandshakerFactory.newHandshaker( - URI.create(StringHandlerUtil.buildWebSocketURL(Address, Port, false)), + URI.create(StringHandlerUtil.buildWebSocketURL(address, port, false)), WebSocketVersion.V13, null, false, @@ -290,17 +304,17 @@ public abstract class AbstractWebSocketClient { } }); try { - ChannelFuture channelFuture = ClientBootstrap.connect(Address, Port); - ClientStatus = Status.RUNNING; - started(); - ClientChannel = channelFuture.sync().channel(); - ClientChannel.closeFuture().sync(); + ChannelFuture channelFuture = clientBootstrap.connect(address, port); + clientStatus = Status.RUNNING; + onStarted(); + clientChannel = channelFuture.sync().channel(); + clientChannel.closeFuture().sync(); } catch (Exception e) { - startingError("Catch Exception: " + e.getMessage()); - ClientStatus = Status.ERROR; + onStartingError("Catch Exception: " + e.getMessage()); + clientStatus = Status.ERROR; logger.error(e.getMessage()); } finally { - if(ClientStatus == Status.ERROR || ClientStatus == Status.RUNNING) stop(); + if(clientStatus == Status.ERROR || clientStatus == Status.RUNNING) stop(); } }, "WebSocketClient"); @@ -316,23 +330,23 @@ public abstract class AbstractWebSocketClient { * Start. */ public final void start() { - starting(); - switch (ClientStatus) { + onStarting(); + switch (clientStatus) { case STARTING -> { - startingError("Client is already starting"); - logger.info("Client is already starting."); + onStartingError("Client is already onStarting"); + logger.info("Client is already onStarting."); } case RUNNING -> { - startingError("Client is already running."); + onStartingError("Client is already running."); logger.info("Client is already running."); } case STOPPING -> { - startingError("Client is stopping"); - logger.info("Client is stopping"); + onStartingError("Client is onStopping"); + logger.info("Client is onStopping"); } case STOPPED, WAITING_FOR_INIT -> { initThread(); - WebSocketClientThread.start(); + webSocketClientThread.start(); start0(); } } @@ -347,92 +361,58 @@ public abstract class AbstractWebSocketClient { return CompletableFuture.runAsync(() -> {}); } - /** - * Starting. - */ - protected abstract void starting(); - - /** - * Starting error. - */ - protected abstract void startingError(String msg); - - /** - * Started. - */ - protected abstract void started(); - - /** - * Stopping. - */ - protected abstract void stopping(); - - /** - * Stopping error. - */ - protected abstract void stoppingError(String msg); - - /** - * Stopped. - */ - protected abstract void stopped(); /** * Stop. */ public final void stop() { - stopping(); - switch (ClientStatus) { + onStopping(); + switch (clientStatus) { case STARTING -> { - stoppingError("Client is already starting."); - logger.info("Client is starting, please waiting."); + onStoppingError("Client is already onStarting."); + logger.info("Client is onStarting, please waiting."); } case RUNNING, ERROR -> { - ClientStatus = Status.STOPPING; + clientStatus = Status.STOPPING; CompletableFuture CliChanClose = CompletableFuture.runAsync(() -> { - if (ClientChannel != null && ClientChannel.isOpen()) { + if (clientChannel != null && clientChannel.isOpen()) { try { - ClientChannel.close().sync(); + clientChannel.close().sync(); } catch (InterruptedException e) { logger.error(e.getMessage()); } finally { - ClientChannel = null; + clientChannel = null; } } }); CompletableFuture CliEvenClose = CliChanClose.thenRunAsync(() -> { - if (ClientEventLoopGroup != null) { + if (clientEventLoopGroup != null) { try { - ClientEventLoopGroup.shutdownGracefully().sync(); + clientEventLoopGroup.shutdownGracefully().sync(); } catch (InterruptedException e) { logger.error(e.getMessage()); } finally { - ClientEventLoopGroup = null; + clientEventLoopGroup = null; } } }); CliEvenClose.thenCombineAsync(stop0(), (a, b) -> { - ClientStatus = Status.STOPPED; - ClientBootstrap = null; - stopped(); + clientStatus = Status.STOPPED; + clientBootstrap = null; + onStopped(); return null; }); } case STOPPING -> { - stoppingError("Client is already stopping."); - logger.info("Client is already stopping"); + onStoppingError("Client is already onStopping."); + logger.info("Client is already onStopping"); } case STOPPED, WAITING_FOR_INIT -> { - stoppingError("Client has been stopped."); - logger.info("Client has stopped"); + onStoppingError("Client has been onStopped."); + logger.info("Client has onStopped"); } } } - /** - * 向所连接的服务器发送消息 - * - * @param message 消息 - */ - public abstract void send(Message message); + } diff --git a/Common/src/main/java/com/r3944realms/dg_lab/websocket/AbstractWebSocketServer.java b/Common/src/main/java/com/r3944realms/dg_lab/websocket/AbstractWebSocketServer.java index c4eaf1c..bbd0c7d 100644 --- a/Common/src/main/java/com/r3944realms/dg_lab/websocket/AbstractWebSocketServer.java +++ b/Common/src/main/java/com/r3944realms/dg_lab/websocket/AbstractWebSocketServer.java @@ -19,6 +19,7 @@ package com.r3944realms.dg_lab.websocket; import com.r3944realms.dg_lab.DgLab; import com.r3944realms.dg_lab.api.manager.Status; +import com.r3944realms.dg_lab.api.websocket.IWebSocketServer; import com.r3944realms.dg_lab.api.websocket.message.Message; import com.r3944realms.dg_lab.utils.stringUtils.UrlValidator; import com.r3944realms.dg_lab.websocket.handler.server.HttpRequestHandler; @@ -46,7 +47,7 @@ import java.util.concurrent.CompletableFuture; * 主要是处理netty逻辑以建立服务端 */ @SuppressWarnings({"DuplicatedCode", "LoggingSimilarMessage"}) -public abstract class AbstractWebSocketServer { +public abstract class AbstractWebSocketServer implements IWebSocketServer { /** * The constant logger. @@ -56,54 +57,56 @@ public abstract class AbstractWebSocketServer { /** * Should enable SSL */ - boolean SslEnabled; + boolean sslEnabled; /** * SSL 密码 */ - String SslPassword; + String sslPassword; /** - * Cert File + * 证书文件 */ - File CertFile; + File certFile; /** - * Key File + * 私钥文件 */ - File KeyFile; + File keyFile; - private int Port; + private String listenAddress; + + private int port; /** * The Server bootstrap. */ - protected ServerBootstrap ServerBootstrap; + protected ServerBootstrap serverBootstrap; /** * The Boss group. */ - protected EventLoopGroup BossGroup, + protected EventLoopGroup bossGroup, /** * The Worker group. */ - WorkerGroup; + workerGroup; /** * The Server channel. */ - protected Channel ServerChannel; + protected Channel serverChannel; /** * The Websocket server thread. */ - protected Thread WebsocketServerThread; + protected Thread websocketServerThread; /** * The Server status. */ - protected volatile Status ServerStatus = Status.WAITING_FOR_INIT; + protected volatile Status serverStatus = Status.WAITING_FOR_INIT; /** * Instantiates a new Abstract web socket server. */ protected AbstractWebSocketServer() { - Port = 9000; + port = 9000; } /** @@ -112,84 +115,61 @@ public abstract class AbstractWebSocketServer { * @param port the port */ protected AbstractWebSocketServer(int port) { - Port = port; + this.port = port; + } + + @Override + public void setListenedAddress(String address) { + this.listenAddress = address; + } + + @Override + public String getListenedAddress() { + return listenAddress == null ? "0.0.0.0" : listenAddress; } - /** - * Gets status. - * - * @return the status - */ public Status getStatus() { - return this.ServerStatus; + return this.serverStatus; } - /** - * Sets status. - * - * @param status the status - */ + public void setStatus(Status status) { - this.ServerStatus = status; + this.serverStatus = status; } - /** - * Sets port. - * - * @param port the port - */ + public void setPort(int port) { - if(this.ServerStatus != Status.WAITING_FOR_INIT && this.ServerStatus != Status.STOPPED) { + if(this.serverStatus != Status.WAITING_FOR_INIT && this.serverStatus != Status.STOPPED) { logger.error("Unable to Change Port to {}", port); return; } - this.Port = UrlValidator.isValidPort(port) ? port : 9000; + this.port = UrlValidator.isValidPort(port) ? port : 9000; } - /** - * Gets port. - * - * @return the port - */ + public int getPort() { - return Port; + return port; } - /** - * 获取SSL是否开启 - * - * @return enable - */ public boolean isSSLEnabled() { - return SslEnabled; + return sslEnabled; } - /** - * 启用SSL - * @param certFile 证书文件 - * @param keyFile 私钥文件 - */ + public void enableSSL(@NotNull File certFile, @NotNull File keyFile) { enableSSL(certFile, keyFile, null); } - /** - * 启用SSL - * @param certFile 证书文件 - * @param keyFile 私钥文件 - * @param password ssl密码 - */ + public void enableSSL(@NotNull File certFile, @NotNull File keyFile, @Nullable String password) { - this.SslEnabled = true; - this.CertFile = certFile; - this.KeyFile = keyFile; - this.SslPassword = password; + this.sslEnabled = true; + this.certFile = certFile; + this.keyFile = keyFile; + this.sslPassword = password; } - /** - * 禁用SSL - */ + public void disableSSL() { - this.SslEnabled = false; + this.sslEnabled = false; } /** @@ -208,23 +188,24 @@ public abstract class AbstractWebSocketServer { * Init thread. */ protected final void initThread() { - BossGroup = new NioEventLoopGroup(); - WorkerGroup = new NioEventLoopGroup(); - WebsocketServerThread = new Thread(() ->{ + init(); + bossGroup = new NioEventLoopGroup(); + workerGroup = new NioEventLoopGroup(); + websocketServerThread = new Thread(() ->{ try { - ServerBootstrap = new ServerBootstrap(); - ServerStatus = Status.STARTING; - ServerBootstrap.option(ChannelOption.SO_BACKLOG, 1024) + serverBootstrap = new ServerBootstrap(); + serverStatus = Status.STARTING; + serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024) .childOption(ChannelOption.SO_KEEPALIVE, true); - ServerBootstrap.group(BossGroup, WorkerGroup); - ServerBootstrap.channel(NioServerSocketChannel.class); - ServerBootstrap.childHandler(new ChannelInitializer() { + serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap.channel(NioServerSocketChannel.class); + serverBootstrap.childHandler(new ChannelInitializer() { @Override protected void initChannel(NioSocketChannel ch) throws SSLException { ChannelPipeline pipeline = ch.pipeline(); // 根据配置启用 SSL - if (SslEnabled) { - SslContext sslCtx = SslContextBuilder.forServer(CertFile, KeyFile, SslPassword).build(); + if (sslEnabled) { + SslContext sslCtx = SslContextBuilder.forServer(certFile, keyFile, sslPassword).build(); pipeline.addFirst(sslCtx.newHandler(ch.alloc())); } pipeline.addLast(DgLab.LOGGING_HANDLER); @@ -237,56 +218,25 @@ public abstract class AbstractWebSocketServer { } }); logger.debug("WebSocketServer try binding port ... "); - ChannelFuture channelFuture = ServerBootstrap.bind("0.0.0.0",Port); + ChannelFuture channelFuture = serverBootstrap.bind(getListenedAddress(), port); channelFuture.sync(); - ServerChannel = channelFuture.channel(); - ServerStatus = Status.RUNNING; - started(); - logger.info("WebSocketServer start on the port of {}{}", Port, SslEnabled ? " (SSL)" : ""); - logger.debug("WebSocketServer listening on port {}", Port); + serverChannel = channelFuture.channel(); + serverStatus = Status.RUNNING; + onStarted(); + logger.info("WebSocketServer start on the port of {}{}", port, sslEnabled ? " (SSL)" : ""); + logger.debug("WebSocketServer listening on port {}", port); channelFuture.channel().closeFuture().sync(); } catch (Exception e) { - ServerStatus = Status.ERROR; - stoppingError("Catch Exception:" + e.getMessage()); + serverStatus = Status.ERROR; + onStoppingError("Catch Exception:" + e.getMessage()); logger.error(e.getMessage()); } finally { - if(ServerStatus == Status.ERROR || ServerStatus == Status.RUNNING) stop(); + if(serverStatus == Status.ERROR || serverStatus == Status.RUNNING) stop(); } }, "WebSocketServer"); initThread0(); } - /** - * Starting. - */ - protected abstract void starting(); - - - - /** - * Starting error(With error result). - */ - protected abstract void startingError(String error); - - /** - * Started. - */ - protected abstract void started(); - - /** - * Stopping. - */ - protected abstract void stopping(); - - /** - * Stopping error. - */ - protected abstract void stoppingError(String error); - /** - * Stopped. - */ - protected abstract void stopped(); - /** * 自定义Start后续逻辑 */ @@ -298,23 +248,23 @@ public abstract class AbstractWebSocketServer { * Start. */ public final void start() { - starting(); - switch (ServerStatus) { + onStarting(); + switch (serverStatus) { case STARTING -> { - startingError("Server is already starting."); - logger.info("Server is already starting."); + onStartingError("Server is already onStarting."); + logger.info("Server is already onStarting."); } case RUNNING -> { - startingError("Server is already running."); + onStartingError("Server is already running."); logger.info("Server is already running."); } case STOPPING -> { - startingError("Server is stopping"); - logger.info("Server is stopping"); + onStartingError("Server is onStopping"); + logger.info("Server is onStopping"); } case STOPPED, WAITING_FOR_INIT -> { initThread(); - WebsocketServerThread.start(); + websocketServerThread.start(); start0(); } } @@ -333,76 +283,68 @@ public abstract class AbstractWebSocketServer { * Stop. */ public final void stop() { - stopping(); - switch (ServerStatus) { + onStopping(); + switch (serverStatus) { case STARTING -> { - stoppingError("Server is starting, please waiting."); - logger.info("Server is starting, please waiting."); + onStoppingError("Server is onStarting, please waiting."); + logger.info("Server is onStarting, please waiting."); } case RUNNING -> { - ServerStatus = Status.STOPPING; + serverStatus = Status.STOPPING; // Close the server channel if it's open CompletableFuture SerChanClose = CompletableFuture.runAsync(() -> { - if (ServerChannel != null && ServerChannel.isOpen()) { + if (serverChannel != null && serverChannel.isOpen()) { try { - ServerChannel.close().sync(); + serverChannel.close().sync(); } catch (InterruptedException e) { logger.error(e.getMessage()); } finally { - ServerChannel = null; + serverChannel = null; } } }); // Shutdown the event loop groups CompletableFuture BosGroClose = SerChanClose.thenRunAsync(() -> { - if (BossGroup != null) { + if (bossGroup != null) { try { - BossGroup.shutdownGracefully().sync(); + bossGroup.shutdownGracefully().sync(); } catch (InterruptedException e) { logger.error(e.getMessage()); } finally { - BossGroup = null; + bossGroup = null; } } } ); CompletableFuture WorGroClose = SerChanClose.thenRunAsync(() -> { - if (WorkerGroup != null) { + if (workerGroup != null) { try { - WorkerGroup.shutdownGracefully().sync(); + workerGroup.shutdownGracefully().sync(); } catch (InterruptedException e) { logger.error(e.getMessage()); } finally { - WorkerGroup = null; + workerGroup = null; } } }); BosGroClose.thenCombineAsync(WorGroClose, (a,b) -> { stop0().thenRunAsync(() -> { - ServerStatus = Status.STOPPED; - ServerBootstrap = null; - stopped(); + serverStatus = Status.STOPPED; + serverBootstrap = null; + onStopped(); }); return null; }); } case STOPPING -> { - stoppingError("Server is already stopping"); - logger.info("Server is already stopping"); + onStoppingError("Server is already onStopping"); + logger.info("Server is already onStopping"); } case STOPPED -> { - stoppingError("Server has stopped"); - logger.info("Server has stopped"); + onStoppingError("Server has onStopped"); + logger.info("Server has onStopped"); } } } - - /** - * 向指定的客户端发送消息 - * - * @param clientId 客户端UUID - * @param message 消息 - */ - public abstract void send(String clientId, Message message); } diff --git a/Common/src/main/java/com/r3944realms/dg_lab/websocket/PowerBoxWSClient.java b/Common/src/main/java/com/r3944realms/dg_lab/websocket/PowerBoxWSClient.java index d5e0eb3..b810a0d 100644 --- a/Common/src/main/java/com/r3944realms/dg_lab/websocket/PowerBoxWSClient.java +++ b/Common/src/main/java/com/r3944realms/dg_lab/websocket/PowerBoxWSClient.java @@ -62,8 +62,8 @@ public class PowerBoxWSClient extends AbstractWebSocketClient { this.sharedData = sharedData; this.operation = operation; this.role = role; - sharedData.address = this.Address; - sharedData.port = this.Port; + sharedData.address = this.address; + sharedData.port = this.port; contextWrapper = new ClientDLPBHandlerContextWrapper(sharedData, role, operation, false); } @@ -82,8 +82,8 @@ public class PowerBoxWSClient extends AbstractWebSocketClient { this.sharedData = sharedData; this.operation = operation; this.role = role; - sharedData.address = this.Address; - sharedData.port = this.Port; + sharedData.address = this.address; + sharedData.port = this.port; contextWrapper = new ClientDLPBHandlerContextWrapper(sharedData, role, operation, false); } @@ -123,8 +123,8 @@ public class PowerBoxWSClient extends AbstractWebSocketClient { this.sharedData = sharedData; this.operation = operation; this.role = role; - sharedData.address = this.Address; - sharedData.port = this.Port; + sharedData.address = this.address; + sharedData.port = this.port; contextWrapper = new ClientDLPBHandlerContextWrapper(sharedData, role, operation, useRoleMsgMode); } @@ -144,8 +144,8 @@ public class PowerBoxWSClient extends AbstractWebSocketClient { this.sharedData = sharedData; this.operation = operation; this.role = role; - sharedData.address = this.Address; - sharedData.port = this.Port; + sharedData.address = this.address; + sharedData.port = this.port; contextWrapper = new ClientDLPBHandlerContextWrapper(sharedData, role, operation, useRoleMsgMode); } @@ -178,35 +178,41 @@ public class PowerBoxWSClient extends AbstractWebSocketClient { } @Override - protected void starting() { + public void init() { + + } + + @Override + public void onStarting() { operation.ClientStartingHandler(); } @Override - protected void startingError(String msg) { + public void onStartingError(String msg) { operation.ClientStartingErrorHandler(msg); } @Override - protected void started() { + public void onStarted() { operation.ClientStartedHandler(); } @Override - protected void stopping() { + public void onStopping() { operation.ClientStoppingHandler(); } @Override - protected void stoppingError(String msg) { + public void onStoppingError(String msg) { operation.ClientStoppingErrorHandler(msg); } @Override - protected void stopped() { + public void onStopped() { operation.ClientStoppedHandler(); } + @Override public void enableSSL() { super.enableSSL(); @@ -219,10 +225,12 @@ public class PowerBoxWSClient extends AbstractWebSocketClient { sharedData.isEnableSsl = false; } + + @Override public void send(Message message) { if(message instanceof PowerBoxMessage PBMessage) { - this.ClientChannel.writeAndFlush(new TextWebSocketFrame(PBMessage.getMsgJson())); + this.clientChannel.writeAndFlush(new TextWebSocketFrame(PBMessage.getMsgJson())); } else { logger.error("Message is not a PowerBoxMessage"); } diff --git a/Common/src/main/java/com/r3944realms/dg_lab/websocket/PowerBoxWSServer.java b/Common/src/main/java/com/r3944realms/dg_lab/websocket/PowerBoxWSServer.java index bff5af5..6a04520 100644 --- a/Common/src/main/java/com/r3944realms/dg_lab/websocket/PowerBoxWSServer.java +++ b/Common/src/main/java/com/r3944realms/dg_lab/websocket/PowerBoxWSServer.java @@ -19,6 +19,7 @@ package com.r3944realms.dg_lab.websocket; import com.r3944realms.dg_lab.api.operation.ServerOperation; import com.r3944realms.dg_lab.api.websocket.message.Message; import com.r3944realms.dg_lab.api.websocket.message.PowerBoxMessage; +import com.r3944realms.dg_lab.api.websocket.message.data.type.PowerBoxDataType; import com.r3944realms.dg_lab.api.websocket.message.role.WebSocketServerRole; import com.r3944realms.dg_lab.websocket.handler.server.DefaultServerOperation; import com.r3944realms.dg_lab.websocket.handler.server.ServerDLPBHandler; @@ -38,7 +39,7 @@ public class PowerBoxWSServer extends AbstractWebSocketServer { /** * The Shared data. */ - protected final ServerPowerBoxSharedData SharedData; + protected final ServerPowerBoxSharedData sharedData; /** * The Role. */ @@ -57,7 +58,7 @@ public class PowerBoxWSServer extends AbstractWebSocketServer { * @param operation the operation */ public PowerBoxWSServer(ServerPowerBoxSharedData sharedData, WebSocketServerRole role, ServerOperation operation) { - this.SharedData = sharedData; + this.sharedData = sharedData; this.role = role; this.operation = operation; contextWrapper = new ServerDLPBHandlerContextWrapper( @@ -77,7 +78,7 @@ public class PowerBoxWSServer extends AbstractWebSocketServer { */ public PowerBoxWSServer(ServerPowerBoxSharedData sharedData, WebSocketServerRole role, ServerOperation operation, int port) { super(port); - this.SharedData = sharedData; + this.sharedData = sharedData; this.role = role; this.operation = operation; contextWrapper = new ServerDLPBHandlerContextWrapper( @@ -114,52 +115,63 @@ public class PowerBoxWSServer extends AbstractWebSocketServer { } @Override - protected void starting() { + public void init() { + + } + + @Override + public void onStarting() { operation.ServerStartingHandler(); } @Override - protected void startingError(String error) { + public void onStartingError(String error) { operation.ServerStartingErrorHandler(error); } @Override - protected void started() { + public void onStarted() { operation.ServerStartedHandler(); } @Override - protected void stopping() { + public void onStopping() { operation.ServerStoppingHandler(); } @Override - protected void stoppingError(String error) { + public void onStoppingError(String error) { operation.ServerStoppingErrorHandler(error); } @Override - protected void stopped() { + public void onStopped() { operation.ServerStoppedHandler(); } @Override public void send(String connectId, Message message) { if(message instanceof PowerBoxMessage PBMessage) { - ChannelHandlerContext context = SharedData.connections.get(connectId);//获取连接连接的Context + ChannelHandlerContext context = sharedData.connections.get(connectId);//获取连接连接的Context if(context != null) { - String targetId = SharedData.relations.get(connectId); - if(targetId.isEmpty()) { //该上下文为客户端 - context.writeAndFlush(new TextWebSocketFrame(PBMessage.getMsgJson()));//发送给客户端 - ChannelHandlerContext appContext = SharedData.connections.get(targetId); - appContext.writeAndFlush(new TextWebSocketFrame(PBMessage.getDataJson()));//发送给APP端 - } else if(SharedData.relations.containsValue(targetId)){ // 绑定状态的APP端 - //仅对APP发信息 - context.writeAndFlush(new TextWebSocketFrame(PBMessage.getDataJson())); - + String targetId = sharedData.relations.get(connectId); + if(targetId != null) { + if (targetId.isEmpty()) { //该上下文为客户端 + context.writeAndFlush(new TextWebSocketFrame(PBMessage.getMsgJson()));//发送给客户端 + ChannelHandlerContext appContext = sharedData.connections.get(targetId); + appContext.writeAndFlush(new TextWebSocketFrame(PBMessage.getDataJson()));//发送给APP端 + } else if(sharedData.relations.containsValue(targetId)){ // 绑定状态的APP端 + //仅对APP发信息 + context.writeAndFlush(new TextWebSocketFrame(PBMessage.getDataJson())); + } else { // 未绑定状态(不可发送消息) + logger.error("Can't send Msg to no relationship obj."); + } + } else if (PBMessage.commandType == PowerBoxDataType._NC_BIND_) { + //客户端写入绑定消息 + context.writeAndFlush(new TextWebSocketFrame(PBMessage.getMsgJson())); } else { // 未绑定状态(不可发送消息) - logger.error("Can't send Msg to no relationship obj."); + logger.error("Can't send Non-Binding Msg to no relationship obj."); } } else { logger.error("Find that Target is invalid."); @@ -175,7 +187,7 @@ public class PowerBoxWSServer extends AbstractWebSocketServer { * @return the shared data */ public ServerPowerBoxSharedData getSharedData() { - return SharedData; + return sharedData; } @Override diff --git a/Common/src/main/java/com/r3944realms/dg_lab/websocket/sharedData/ClientPowerBoxSharedData.java b/Common/src/main/java/com/r3944realms/dg_lab/websocket/sharedData/ClientPowerBoxSharedData.java index c70eeb0..39f6bdb 100644 --- a/Common/src/main/java/com/r3944realms/dg_lab/websocket/sharedData/ClientPowerBoxSharedData.java +++ b/Common/src/main/java/com/r3944realms/dg_lab/websocket/sharedData/ClientPowerBoxSharedData.java @@ -65,7 +65,7 @@ public class ClientPowerBoxSharedData implements ISharedData { /** * The Follow a strength. */ - //跟随AB的软上限 +//跟随AB的软上限 public final boolean followAStrength = false; /** * The Follow b strength. @@ -79,6 +79,7 @@ public class ClientPowerBoxSharedData implements ISharedData { * 是否启用 SSL */ public boolean isEnableSsl = false; + /** * Instantiates a new Client power box shared data. * diff --git a/CommonApi/build.gradle b/CommonApi/build.gradle index 23908ec..06d96df 100644 --- a/CommonApi/build.gradle +++ b/CommonApi/build.gradle @@ -33,18 +33,8 @@ sourceSets { } dependencies { - implementation 'org.apache.logging.log4j:log4j-core:2.23.1' - implementation 'org.apache.logging.log4j:log4j-api:2.23.1' - implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.23.1' - implementation group: 'org.realityforge.org.jetbrains.annotations', name: 'org.jetbrains.annotations', version: '1.7.0' - implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.17.0' - implementation group: 'com.google.guava', name: 'guava', version: '33.3.0-jre' - implementation group: 'io.netty', name: 'netty-all', version: '4.1.109.Final' - implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1' - testImplementation platform('org.junit:junit-bom:5.10.0') - testImplementation 'org.junit.jupiter:junit-jupiter' - implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.16' } + tasks.register('sourcesJar', Jar) { archiveClassifier.set('sources') from sourceSets.main.allSource diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/manager/IDGLabManager.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/manager/IDGLabManager.java index c1c4f0b..c1b041b 100644 --- a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/manager/IDGLabManager.java +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/manager/IDGLabManager.java @@ -39,6 +39,7 @@ public interface IDGLabManager { * @return the shared data */ ISharedData getSharedData(); + /** * 获取当前单例实例运行 * diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/operation/ClientOperation.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/operation/ClientOperation.java index 7416584..17b4617 100644 --- a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/operation/ClientOperation.java +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/operation/ClientOperation.java @@ -34,9 +34,11 @@ public interface ClientOperation extends IOperation { /** * 客户端启动遇到错误后处理 + * * @param errorMsg 错误消息 */ void ClientStartingErrorHandler(String errorMsg); + /** * 客户端线程关闭中处理 */ @@ -44,9 +46,11 @@ public interface ClientOperation extends IOperation { /** * 客户端线程关闭中遇到错误后处理 + * * @param errorMsg 错误消息 */ void ClientStoppingErrorHandler(String errorMsg); + /** * 客户端线程完全关闭后处理 */ diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/operation/ServerOperation.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/operation/ServerOperation.java index 3ee12b9..57e8743 100644 --- a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/operation/ServerOperation.java +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/operation/ServerOperation.java @@ -31,6 +31,7 @@ public interface ServerOperation extends IOperation { /** * 服务器线程开启中遇到错误后处理 + * * @param errorMessage 错误消息 */ void ServerStartingErrorHandler(String errorMessage); @@ -47,6 +48,7 @@ public interface ServerOperation extends IOperation { /** * 服务器线程关闭中遇到错误后处理 + * * @param errorMessage 错误消息 */ void ServerStoppingErrorHandler(String errorMessage); @@ -58,6 +60,8 @@ public interface ServerOperation extends IOperation { /** * 客户端会话连接触发器 + * + * @param clientId the client id */ void ClientSessionBuildInHandler(String clientId); diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebSocketServer.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebSocketServer.java new file mode 100644 index 0000000..4440545 --- /dev/null +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebSocketServer.java @@ -0,0 +1,79 @@ +package com.r3944realms.dg_lab.api.websocket; + +import com.r3944realms.dg_lab.api.websocket.message.Message; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; + +/** + * The interface Web socket server. + */ +public interface IWebSocketServer extends IWebsocketSide { + /** + * Gets listened address. + * + * @return the listened address + */ + String getListenedAddress(); + + /** + * Sets listened address. + * + * @param address the address + */ + void setListenedAddress(String address); + + /** + * 获取监听端口 + * + * @return 端口 port + */ + int getPort(); + + /** + * 设置监听端口 + * + * @param port 端口 + */ + void setPort(int port); + + /** + * 启用SSL + * + * @param certificateFile 证书文件 + * @param keyFile 私钥文件 + */ + default void enableSSL(@NotNull File certificateFile, @NotNull File keyFile) { + enableSSL(certificateFile, keyFile,null); + } + + /** + * 启用SSL + * + * @param certificateFile 证书文件 + * @param keyFile 私钥文件 + * @param password ssl密码 + */ + void enableSSL(@NotNull File certificateFile, @NotNull File keyFile, @Nullable String password); + + /** + * 禁用SSL + */ + void disableSSL(); + + /** + * 获取SSL是否开启 + * + * @return enable boolean + */ + boolean isSSLEnabled(); + + /** + * 向指定的客户端发送消息 + * + * @param connectId 客户端UUID + * @param message 消息 + */ + void send(String connectId, Message message); +} diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebsocketClient.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebsocketClient.java new file mode 100644 index 0000000..8cb98fa --- /dev/null +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebsocketClient.java @@ -0,0 +1,72 @@ +package com.r3944realms.dg_lab.api.websocket; + +import com.r3944realms.dg_lab.api.websocket.message.Message; +import org.jetbrains.annotations.Nullable; + +import java.io.File; + +/** + * The interface Websocket client. + */ +public interface IWebsocketClient extends IWebsocketSide { + /** + * Gets address. + * + * @return the address + */ + String getAddress(); + + /** + * Sets address. + * + * @param address the address + */ + void setAddress(String address); + + /** + * Gets port. + * + * @return the port + */ + int getPort(); + + /** + * Sets port. + * + * @param port the port + */ + void setPort(int port); + + /** + * Enable ssl. + */ + default void enableSSL() { + enableSSL(null); + } + + /** + * Enable ssl. + * + * @param certificateFile the certificate file + */ + void enableSSL(@Nullable File certificateFile); + + /** + * Disable ssl. + */ + void disableSSL(); + + /** + * Is ssl enabled boolean. + * + * @return the boolean + */ + boolean isSSLEnabled(); + + /** + * 向所连接的服务器发送消息 + * + * @param message 消息 + */ + void send(Message message); +} diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebsocketSide.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebsocketSide.java new file mode 100644 index 0000000..cabace5 --- /dev/null +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/IWebsocketSide.java @@ -0,0 +1,72 @@ +package com.r3944realms.dg_lab.api.websocket; + +import com.r3944realms.dg_lab.api.manager.Status; + +/** + * The interface Websocket side. + */ +public interface IWebsocketSide { + /** + * 获取状态 + * + * @return the status + */ + Status getStatus(); + + /** + * 设置状态 + * + * @param status 状态 + */ + void setStatus(Status status); + + /** + * Init. + */ + void init(); + + /** + * Start. + */ + void start(); + + /** + * Stop. + */ + void stop(); + + /** + * On starting. + */ + void onStarting(); + + /** + * On stopping. + */ + void onStopping(); + + /** + * On starting error. + * + * @param msg the msg + */ + void onStartingError(String msg); + + /** + * On stopping error. + * + * @param msg the msg + */ + void onStoppingError(String msg); + + /** + * On started. + */ + void onStarted(); + + /** + * On stopped. + */ + void onStopped(); + +} diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/Message.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/Message.java index 030f64a..804b6a9 100644 --- a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/Message.java +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/Message.java @@ -19,14 +19,19 @@ package com.r3944realms.dg_lab.api.websocket.message; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.TypeAdapter; import com.google.gson.annotations.Expose; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; import com.r3944realms.dg_lab.api.websocket.message.data.IData; import com.r3944realms.dg_lab.api.websocket.message.data.adapter.IDataTypeAdapterFactory; import com.r3944realms.dg_lab.api.websocket.message.role.Role; import com.r3944realms.dg_lab.api.websocket.message.role.RoleDeserializer; +import java.io.IOException; import java.io.Serial; import java.io.Serializable; +import java.util.concurrent.atomic.AtomicReference; /** * 消息,带有方向和有效负载消息 @@ -52,6 +57,24 @@ public abstract class Message implements Serializable { gsonBuilder.registerTypeAdapter(Role.class, new RoleDeserializer()); gsonBuilder.registerTypeAdapter(MessageDirection.class, new MessageDirectionDeserializer()); gsonBuilder.registerTypeAdapterFactory(new IDataTypeAdapterFactory()); + // 注册 AtomicReference 的适配器 + gsonBuilder.registerTypeAdapter(AtomicReference.class, new TypeAdapter>() { + @Override + public void write(JsonWriter out, AtomicReference value) throws IOException { + if (value == null || value.get() == null) { + out.nullValue(); + } else { + gson.toJson(value.get(), value.get().getClass(), out); + } + } + + @Override + public AtomicReference read(JsonReader in) throws IOException { + Object obj = gson.fromJson(in, Object.class); + return new AtomicReference<>(obj); + } + }); + gson = gsonBuilder.create(); } diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/PowerBoxMessage.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/PowerBoxMessage.java index bd579a5..3eee70a 100644 --- a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/PowerBoxMessage.java +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/PowerBoxMessage.java @@ -38,7 +38,14 @@ public class PowerBoxMessage extends Message { /** * The Invalid message json. */ - static final String INVALID_MESSAGE_JSON = gson.toJson(PowerBoxData.createPowerBoxData("error","","","")); + + private static class LazyInvalidJsonHolder { + /** + * The Value. + */ + static final String VALUE = + gson.toJson(PowerBoxData.createPowerBoxData("error", "", "", "")); + } /** * Instantiates a new Power box message. @@ -168,7 +175,7 @@ public class PowerBoxMessage extends Message { @Override public String getInvalidMessageJson() { - return INVALID_MESSAGE_JSON; + return LazyInvalidJsonHolder.VALUE; } @Override diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/DataType.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/DataType.java index 836a4ca..141f475 100644 --- a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/DataType.java +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/DataType.java @@ -16,6 +16,9 @@ package com.r3944realms.dg_lab.api.websocket.message.data; +/** + * The enum Data type. + */ public enum DataType { /** * Power box att data type. @@ -29,6 +32,7 @@ public enum DataType { * Power box data type. */ POWER_BOX; + /** * Gets type from string. * diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/IData.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/IData.java index 44901f2..3ab1ab7 100644 --- a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/IData.java +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/IData.java @@ -16,6 +16,9 @@ package com.r3944realms.dg_lab.api.websocket.message.data; +/** + * The interface Data. + */ public interface IData { /** diff --git a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/PowerBoxData.java b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/PowerBoxData.java index cbc2b21..5fd4a04 100644 --- a/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/PowerBoxData.java +++ b/CommonApi/src/main/java/com/r3944realms/dg_lab/api/websocket/message/data/PowerBoxData.java @@ -16,6 +16,7 @@ package com.r3944realms.dg_lab.api.websocket.message.data; +import com.google.gson.annotations.Expose; import com.r3944realms.dg_lab.api.websocket.message.data.type.PowerBoxDataType; import com.r3944realms.dg_lab.api.websocket.message.data.type.PowerBoxStatusCode; @@ -35,7 +36,9 @@ public class PowerBoxData implements IData { private final String clientId; private final String targetId; private final String message; - AtomicReference inValidReason = new AtomicReference<>(getInvalidReason()); + @Expose(serialize = false, deserialize = false) + private final transient AtomicReference inValidReason = new AtomicReference<>(getInvalidReason()); + /** * Instantiates a new Power box data. * diff --git a/build.gradle b/build.gradle index 161eca9..5453421 100644 --- a/build.gradle +++ b/build.gradle @@ -25,8 +25,18 @@ subprojects { } dependencies { - testImplementation(platform("org.junit:junit-bom:5.10.0")) - testImplementation("org.junit.jupiter:junit-jupiter") + implementation 'org.realityforge.org.jetbrains.annotations:org.jetbrains.annotations:1.7.0' + implementation 'org.apache.logging.log4j:log4j-core:2.23.1' + implementation 'org.apache.logging.log4j:log4j-api:2.23.1' + implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.23.1' + implementation 'org.apache.commons:commons-lang3:3.17.0' + implementation 'com.google.guava:guava:33.3.0-jre' + implementation 'io.netty:netty-all:4.1.109.Final' + implementation 'com.google.code.gson:gson:2.10.1' + implementation 'org.slf4j:slf4j-api:2.0.16' + + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' } tasks.test { diff --git a/gradle.properties b/gradle.properties index 6ded2b0..89f1185 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ org.gradle.configuration-cache=true org.gradle.configuration-cache.problems=warn # ROOT project_name=DgLab -project_version=4.3.12.18 +project_version=4.3.13.18 project_group=top.r3944realms.dg_lab # API