diff --git a/build/build.xml b/build/build.xml
index a7ae990..050a555 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -173,8 +173,8 @@
-
-
+
+
@@ -213,8 +213,9 @@
destdir="${compile.dir}"
includeAntRuntime="no"
debug="on"
- source="1.5"
- target="1.5"
+ source="1.7"
+ target="1.7"
+ encoding="UTF-8"
>
diff --git a/src/java/org/jivesoftware/multiplexer/Session.java b/src/java/org/jivesoftware/multiplexer/Session.java
index c50dae8..7307ac1 100644
--- a/src/java/org/jivesoftware/multiplexer/Session.java
+++ b/src/java/org/jivesoftware/multiplexer/Session.java
@@ -90,6 +90,7 @@
}
public static void removeSession(String streamID) {
+ StreamIDFactory.releaseId(streamID);
sessions.remove(streamID);
}
diff --git a/src/java/org/jivesoftware/multiplexer/StreamIDFactory.java b/src/java/org/jivesoftware/multiplexer/StreamIDFactory.java
index fb9eb8c..2e3da60 100644
--- a/src/java/org/jivesoftware/multiplexer/StreamIDFactory.java
+++ b/src/java/org/jivesoftware/multiplexer/StreamIDFactory.java
@@ -21,6 +21,8 @@
package org.jivesoftware.multiplexer;
import java.util.Random;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ThreadLocalRandom;
/**
* A basic stream ID factory that produces id's using java.util.Random
@@ -32,15 +34,21 @@
* @author Gaston Dombiak
*/
public class StreamIDFactory {
- /**
- * The random number to use, someone with Java can predict stream IDs if they can guess the current seed *
- */
- Random random = new Random();
+
+ private static final ConcurrentHashMap usingStreamIDs = new ConcurrentHashMap<>();
String managerName = ConnectionManager.getInstance().getName();
public String createStreamID() {
- return managerName + Integer.toHexString(random.nextInt());
+ String streamID;
+ do {
+ streamID = managerName + Integer.toHexString(ThreadLocalRandom.current().nextInt());
+ } while(usingStreamIDs.putIfAbsent(streamID, Boolean.TRUE) == null);
+ return streamID;
+ }
+
+ public static void releaseId(String streamId){
+ usingStreamIDs.remove(streamId);
}
}