From 8701d7349002db59351ed9934ba6aa34283b66b1 Mon Sep 17 00:00:00 2001
From: Paul Gregoire <mondain@gmail.com>
Date: Wed, 29 Nov 2023 09:23:56 -0800
Subject: [PATCH] Replace Number with int for PrivateNetstreamData in client.
 Update to 1.3.26

---
 client/pom.xml                                |  2 +-
 .../main/java/org/red5/client/Red5Client.java |  2 +-
 .../net/rtmp/BaseRTMPClientHandler.java       | 34 +++++++++++--------
 client/src/main/resources/logback.xml         | 23 +++++++++++++
 common/pom.xml                                |  4 +--
 .../main/java/org/red5/server/api/Red5.java   |  4 +--
 .../server/stream/AbstractClientStream.java   | 14 ++++++--
 io/pom.xml                                    |  2 +-
 pom.xml                                       |  2 +-
 server/pom.xml                                |  2 +-
 service/pom.xml                               |  2 +-
 11 files changed, 64 insertions(+), 27 deletions(-)
 create mode 100644 client/src/main/resources/logback.xml

diff --git a/client/pom.xml b/client/pom.xml
index 9bad3b3d..5881d9f2 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.red5</groupId>
         <artifactId>red5-parent</artifactId>
-        <version>1.3.25</version>
+        <version>1.3.26</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>red5-client</artifactId>
diff --git a/client/src/main/java/org/red5/client/Red5Client.java b/client/src/main/java/org/red5/client/Red5Client.java
index b2e6e5aa..9d6962c5 100644
--- a/client/src/main/java/org/red5/client/Red5Client.java
+++ b/client/src/main/java/org/red5/client/Red5Client.java
@@ -18,7 +18,7 @@ public final class Red5Client {
     /**
      * Current server version with revision
      */
-    public static final String VERSION = "Red5 Client 1.3.25";
+    public static final String VERSION = "Red5 Client 1.3.26";
 
     /**
      * Create a new Red5Client object using the connection local to the current thread A bit of magic that lets you access the red5 scope
diff --git a/client/src/main/java/org/red5/client/net/rtmp/BaseRTMPClientHandler.java b/client/src/main/java/org/red5/client/net/rtmp/BaseRTMPClientHandler.java
index 3ab7436a..c280e4f1 100644
--- a/client/src/main/java/org/red5/client/net/rtmp/BaseRTMPClientHandler.java
+++ b/client/src/main/java/org/red5/client/net/rtmp/BaseRTMPClientHandler.java
@@ -11,7 +11,7 @@ import java.util.Arrays;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -98,7 +98,7 @@ public abstract class BaseRTMPClientHandler extends BaseRTMPHandler implements I
     /**
      * Net stream handling
      */
-    private volatile CopyOnWriteArrayList<NetStreamPrivateData> streamDataList = new CopyOnWriteArrayList<>();
+    private volatile CopyOnWriteArraySet<NetStreamPrivateData> streamDataList = new CopyOnWriteArraySet<>();
 
     /**
      * Task to start on connection close
@@ -577,7 +577,8 @@ public abstract class BaseRTMPClientHandler extends BaseRTMPHandler implements I
         log.debug("publish - stream id: {}, name: {}, mode: {}", streamId, name, mode);
         // setup the netstream handler
         if (handler != null) {
-            NetStreamPrivateData streamData = streamDataList.stream().filter(s -> s.getStreamId().equals(streamId.doubleValue())).findFirst().orElse(null);
+            final int sid = streamId.intValue();
+            NetStreamPrivateData streamData = streamDataList.stream().filter(s -> s.getStreamId() == sid).findFirst().orElse(null);
             if (streamData != null) {
                 log.debug("Setting handler on stream data - handler: {}", handler);
                 streamData.handler = handler;
@@ -608,7 +609,8 @@ public abstract class BaseRTMPClientHandler extends BaseRTMPHandler implements I
     @Override
     public void publishStreamData(Number streamId, IMessage message) {
         // get the stream data by index of the list
-        NetStreamPrivateData streamData = streamDataList.stream().filter(s -> s.getStreamId().equals(streamId.doubleValue())).findFirst().orElse(null);
+        final int sid = streamId.intValue();
+        NetStreamPrivateData streamData = streamDataList.stream().filter(s -> s.getStreamId() == sid).findFirst().orElse(null);
         if (streamData != null) {
             if (streamData.connConsumer != null) {
                 streamData.connConsumer.pushMessage(null, message);
@@ -808,9 +810,10 @@ public abstract class BaseRTMPClientHandler extends BaseRTMPHandler implements I
             }
             if (streamId != null) {
                 // try lookup by stream id, if null return the first one
-                NetStreamPrivateData streamData = streamDataList.stream().filter(s -> s.getStreamId().equals(streamId)).findFirst().orElse(streamDataList.get(0));
+                final int sid = streamId.intValue();
+                NetStreamPrivateData streamData = streamDataList.stream().filter(s -> s.getStreamId() == sid).findFirst().orElse(null);
                 if (streamData == null) {
-                    log.warn("Stream data was null for id: {}", streamId);
+                    log.warn("Stream data was null for id: {} entry count: {}", streamId, streamDataList.size());
                 } else if (streamData.handler != null) {
                     log.debug("Got stream data and handler");
                     streamData.handler.onStreamEvent((Notify) command);
@@ -1028,9 +1031,9 @@ public abstract class BaseRTMPClientHandler extends BaseRTMPHandler implements I
             Object callResult = call.getResult();
             if (callResult != null) {
                 // we expect a number consisting of the stream id, but we'll check for an object map as well
-                Number streamId = null;
+                int streamId = -1;
                 if (callResult instanceof Number) {
-                    streamId = (Number) callResult;
+                    streamId = ((Number) callResult).intValue();
                 } else if (callResult instanceof Map) {
                     Map<?, ?> map = (Map<?, ?>) callResult;
                     // XXX(paul) log out the map contents
@@ -1038,14 +1041,14 @@ public abstract class BaseRTMPClientHandler extends BaseRTMPHandler implements I
                     if (map.containsKey("streamId")) {
                         Object tmpStreamId = map.get("streamId");
                         if (tmpStreamId instanceof Number) {
-                            streamId = (Number) tmpStreamId;
+                            streamId = ((Number) tmpStreamId).intValue();
                         } else {
                             log.warn("CreateStreamCallBack resultReceived - stream id is not a number: {}", tmpStreamId);
                         }
                     }
                 }
                 log.debug("CreateStreamCallBack resultReceived - stream id: {} call: {} connection: {}", streamId, call, conn);
-                if (conn != null && streamId != null) {
+                if (conn != null && streamId != -1) {
                     log.debug("Setting new net stream");
                     NetStream stream = new NetStream(streamEventDispatcher);
                     stream.setConnection(conn);
@@ -1100,7 +1103,8 @@ public abstract class BaseRTMPClientHandler extends BaseRTMPHandler implements I
                     log.debug("Deleting net stream");
                     conn.removeClientStream(streamId);
                     // send a delete notify?
-                    NetStreamPrivateData streamData = streamDataList.stream().filter(s -> s.getStreamId().equals(streamId)).findFirst().orElse(null);
+                    final int sid = streamId.intValue();
+                    NetStreamPrivateData streamData = streamDataList.stream().filter(s -> s.getStreamId() == sid).findFirst().orElse(null);
                     if (streamData != null) {
                         streamDataList.remove(streamData);
                     } else {
@@ -1148,22 +1152,22 @@ public abstract class BaseRTMPClientHandler extends BaseRTMPHandler implements I
 
         public volatile ConnectionConsumer connConsumer;
 
-        final Number streamId;
+        private final int streamId;
 
-        NetStreamPrivateData(Number streamId) {
+        NetStreamPrivateData(int streamId) {
             this.streamId = streamId;
             if (streamEventHandler != null) {
                 handler = streamEventHandler;
             }
         }
 
-        public Number getStreamId() {
+        public int getStreamId() {
             return streamId;
         }
 
         @Override
         public int hashCode() {
-            return streamId.hashCode();
+            return streamId;
         }
 
     }
diff --git a/client/src/main/resources/logback.xml b/client/src/main/resources/logback.xml
new file mode 100644
index 00000000..eae9066f
--- /dev/null
+++ b/client/src/main/resources/logback.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<configuration>
+
+    <jmxConfigurator />
+
+    <appender class="ch.qos.logback.core.ConsoleAppender" name="CONSOLE">
+        <encoder>
+            <pattern>[%p] [%thread] %logger - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="CONSOLE" />
+    </root>
+
+    <logger name="org.red5.server.service.ReflectionUtils" level="TRACE" />
+    <logger name="org.red5.server.service.ServiceInvoker" level="TRACE" />
+    <logger name="org.red5.server.net.rtmp.RTMPHandler" level="TRACE" />
+    
+    <logger name="org.red5.client.net.rtmp.BaseRTMPClientHandler" level="TRACE" />
+    <logger name="org.red5.client.test" level="DEBUG" />
+
+</configuration>
\ No newline at end of file
diff --git a/common/pom.xml b/common/pom.xml
index 7382320a..fa9fd28f 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.red5</groupId>
         <artifactId>red5-parent</artifactId>
-        <version>1.3.25</version>
+        <version>1.3.26</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>red5-server-common</artifactId>
@@ -124,7 +124,7 @@
         <dependency>
             <groupId>net.engio</groupId>
             <artifactId>mbassador</artifactId>
-            <version>1.3.25</version>
+            <version>1.3.26</version>
         </dependency> -->
         <dependency>
             <groupId>junit</groupId>
diff --git a/common/src/main/java/org/red5/server/api/Red5.java b/common/src/main/java/org/red5/server/api/Red5.java
index ff2678c0..a4fb0c7f 100644
--- a/common/src/main/java/org/red5/server/api/Red5.java
+++ b/common/src/main/java/org/red5/server/api/Red5.java
@@ -55,12 +55,12 @@ public final class Red5 {
     /**
      * Server version with revision
      */
-    public static final String VERSION = "Red5 Server 1.3.25";
+    public static final String VERSION = "Red5 Server 1.3.26";
 
     /**
      * Server version for fmsVer requests
      */
-    public static final String FMS_VERSION = "RED5/1,3,25,0";
+    public static final String FMS_VERSION = "RED5/1,3,26,0";
 
     /**
      * Server capabilities
diff --git a/common/src/main/java/org/red5/server/stream/AbstractClientStream.java b/common/src/main/java/org/red5/server/stream/AbstractClientStream.java
index 08f2c6b1..107e8938 100644
--- a/common/src/main/java/org/red5/server/stream/AbstractClientStream.java
+++ b/common/src/main/java/org/red5/server/stream/AbstractClientStream.java
@@ -20,7 +20,7 @@ public abstract class AbstractClientStream extends AbstractStream implements ICl
     /**
      * Stream identifier. Unique across server.
      */
-    private Number streamId = 0.0d;
+    private int streamId;
 
     /**
      * Stream name of the broadcasting stream.
@@ -43,10 +43,20 @@ public abstract class AbstractClientStream extends AbstractStream implements ICl
      * @param streamId
      *            Stream id
      */
-    public void setStreamId(Number streamId) {
+    public void setStreamId(int streamId) {
         this.streamId = streamId;
     }
 
+    /**
+     * Setter for stream id
+     *
+     * @param streamId
+     *            Stream id
+     */
+    public void setStreamId(Number streamId) {
+        this.streamId = streamId.intValue();
+    }
+
     /**
      * Return stream id
      *
diff --git a/io/pom.xml b/io/pom.xml
index 1d7df375..ffbd23a0 100644
--- a/io/pom.xml
+++ b/io/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.red5</groupId>
         <artifactId>red5-parent</artifactId>
-        <version>1.3.25</version>
+        <version>1.3.26</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>red5-io</artifactId>
diff --git a/pom.xml b/pom.xml
index 8c01f811..cb775dc5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
     <name>Red5</name>
     <description>The Red5 server</description>
     <groupId>org.red5</groupId>
-    <version>1.3.25</version>
+    <version>1.3.26</version>
     <url>https://github.com/Red5/red5-server</url>
     <inceptionYear>2005</inceptionYear>
     <organization>
diff --git a/server/pom.xml b/server/pom.xml
index c49dce6f..ee63aaa6 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.red5</groupId>
         <artifactId>red5-parent</artifactId>
-        <version>1.3.25</version>
+        <version>1.3.26</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>red5-server</artifactId>
diff --git a/service/pom.xml b/service/pom.xml
index 28c49c5b..e08e568a 100644
--- a/service/pom.xml
+++ b/service/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.red5</groupId>
         <artifactId>red5-parent</artifactId>
-        <version>1.3.25</version>
+        <version>1.3.26</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>red5-service</artifactId>
-- 
GitLab