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); } }