diff --git a/source/org/jivesoftware/smack/Chat.java b/source/org/jivesoftware/smack/Chat.java
index 66f5a54ba..c4ec1726d 100644
--- a/source/org/jivesoftware/smack/Chat.java
+++ b/source/org/jivesoftware/smack/Chat.java
@@ -170,7 +170,19 @@ public class Chat {
}
}
-
+ @Override
+ public String toString() {
+ return "Chat [(participant=" + participant + "), (thread=" + threadID + ")]";
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 1;
+ hash = hash * 31 + threadID.hashCode();
+ hash = hash * 31 + participant.hashCode();
+ return hash;
+ }
+
@Override
public boolean equals(Object obj) {
return obj instanceof Chat
diff --git a/source/org/jivesoftware/smack/ChatManager.java b/source/org/jivesoftware/smack/ChatManager.java
index 1523b4fdc..90e68ab82 100644
--- a/source/org/jivesoftware/smack/ChatManager.java
+++ b/source/org/jivesoftware/smack/ChatManager.java
@@ -24,6 +24,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
+import java.util.UUID;
import java.util.WeakHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
@@ -33,39 +34,59 @@ import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.ThreadFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.packet.Message.Type;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smack.util.collections.ReferenceMap;
/**
* The chat manager keeps track of references to all current chats. It will not hold any references
- * in memory on its own so it is neccesary to keep a reference to the chat object itself. To be
+ * in memory on its own so it is necessary to keep a reference to the chat object itself. To be
* made aware of new chats, register a listener by calling {@link #addChatListener(ChatManagerListener)}.
*
* @author Alexander Wenckus
*/
public class ChatManager {
-
- /**
- * Returns the next unique id. Each id made up of a short alphanumeric
- * prefix along with a unique numeric value.
- *
- * @return the next id.
+ /*
+ * Sets the default behaviour for allowing 'normal' messages to be used in chats. As some clients don't set
+ * the message type to chat, the type normal has to be accepted to allow chats with these clients.
*/
- private static synchronized String nextID() {
- return prefix + Long.toString(id++);
+ private static boolean defaultIsNormalInclude = true;
+
+ /*
+ * Sets the default behaviour for how to match chats when there is NO thread id in the incoming message.
+ */
+ private static MatchMode defaultMatchMode = MatchMode.BARE_JID;
+
+ /**
+ * Defines the different modes under which a match will be attempted with an existing chat when
+ * the incoming message does not have a thread id.
+ */
+ public enum MatchMode {
+ /**
+ * Will not attempt to match, always creates a new chat.
+ */
+ NONE,
+ /**
+ * Will match on the JID in the from field of the message.
+ */
+ SUPPLIED_JID,
+ /**
+ * Will attempt to match on the JID in the from field, and then attempt the base JID if no match was found.
+ * This is the most lenient matching.
+ */
+ BARE_JID;
}
-
- /**
- * A prefix helps to make sure that ID's are unique across mutliple instances.
+
+ /*
+ * Determines whether incoming messages of type normal can create chats.
*/
- private static String prefix = StringUtils.randomString(5);
-
- /**
- * Keeps track of the current increment, which is appended to the prefix to
- * forum a unique ID.
+ private boolean normalIncluded = defaultIsNormalInclude;
+
+ /*
+ * Determines how incoming message with no thread will be matched to existing chats.
*/
- private static long id = 0;
-
+ private MatchMode matchMode = defaultMatchMode;
+
/**
* Maps thread ID to chat.
*/
@@ -101,11 +122,11 @@ public class ChatManager {
return false;
}
Message.Type messageType = ((Message) packet).getType();
- return messageType != Message.Type.groupchat &&
- messageType != Message.Type.headline;
+ return (messageType == Type.chat) || (normalIncluded ? messageType == Type.normal : false);
}
};
- // Add a listener for all message packets so that we can deliver errant
+
+ // Add a listener for all message packets so that we can deliver
// messages to the best Chat instance available.
connection.addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
@@ -116,10 +137,6 @@ public class ChatManager {
}
else {
chat = getThreadChat(message.getThread());
- if (chat == null) {
- // Try to locate the chat based on the sender of the message
- chat = getUserChat(message.getFrom());
- }
}
if(chat == null) {
@@ -130,6 +147,44 @@ public class ChatManager {
}, filter);
}
+ /**
+ * Determines whether incoming messages of type normal will be used for creating new chats or matching
+ * a message to existing ones.
+ *
+ * @return true if normal is allowed, false otherwise.
+ */
+ public boolean isNormalIncluded() {
+ return normalIncluded;
+ }
+
+ /**
+ * Sets whether to allow incoming messages of type normal to be used for creating new chats or matching
+ * a message to an existing one.
+ *
+ * @param normalIncluded true to allow normal, false otherwise.
+ */
+ public void setNormalIncluded(boolean normalIncluded) {
+ this.normalIncluded = normalIncluded;
+ }
+
+ /**
+ * Gets the current mode for matching messages with NO thread id to existing chats.
+ *
+ * @return The current mode.
+ */
+ public MatchMode getMatchMode() {
+ return matchMode;
+ }
+
+ /**
+ * Sets the mode for matching messages with NO thread id to existing chats.
+ *
+ * @param matchMode The mode to set.
+ */
+ public void setMatchMode(MatchMode matchMode) {
+ this.matchMode = matchMode;
+ }
+
/**
* Creates a new chat and returns it.
*
@@ -138,12 +193,7 @@ public class ChatManager {
* @return the created chat.
*/
public Chat createChat(String userJID, MessageListener listener) {
- String threadID;
- do {
- threadID = nextID();
- } while (threadChats.get(threadID) != null);
-
- return createChat(userJID, threadID, listener);
+ return createChat(userJID, null, listener);
}
/**
@@ -155,7 +205,7 @@ public class ChatManager {
* @return the created chat.
*/
public Chat createChat(String userJID, String thread, MessageListener listener) {
- if(thread == null) {
+ if (thread == null) {
thread = nextID();
}
Chat chat = threadChats.get(thread);
@@ -191,20 +241,25 @@ public class ChatManager {
}
/**
- * Try to get a matching chat for the given user JID. Try the full
- * JID map first, the try to match on the base JID if no match is
- * found.
+ * Try to get a matching chat for the given user JID, based on the {@link MatchMode}.
+ *
NONE - return null
+ * SUPPLIED_JID - match the jid in the from field of the message exactly.
+ * BARE_JID - if not match for from field, try the bare jid.
*
- * @param userJID
- * @return
+ * @param userJID jid in the from field of message.
+ * @return Matching chat, or null if no match found.
*/
private Chat getUserChat(String userJID) {
- Chat match = jidChats.get(userJID);
+ if (matchMode == MatchMode.NONE) {
+ return null;
+ }
+
+ Chat match = jidChats.get(userJID);
- if (match == null) {
- match = baseJidChats.get(StringUtils.parseBareAddress(userJID));
- }
- return match;
+ if (match == null && (matchMode == MatchMode.BARE_JID)) {
+ match = baseJidChats.get(StringUtils.parseBareAddress(userJID));
+ }
+ return match;
}
public Chat getThreadChat(String thread) {
@@ -278,4 +333,21 @@ public class ChatManager {
interceptors.put(packetInterceptor, filter);
}
}
+
+ /**
+ * Returns a unique id.
+ *
+ * @return the next id.
+ */
+ private static String nextID() {
+ return UUID.randomUUID().toString();
+ }
+
+ public static void setDefaultMatchMode(MatchMode mode) {
+ defaultMatchMode = mode;
+ }
+
+ public static void setDefaultIsNormalIncluded(boolean allowNormal) {
+ defaultIsNormalInclude = allowNormal;
+ }
}
diff --git a/source/org/jivesoftware/smack/packet/Message.java b/source/org/jivesoftware/smack/packet/Message.java
index b2e25bf9c..a62b0e10a 100644
--- a/source/org/jivesoftware/smack/packet/Message.java
+++ b/source/org/jivesoftware/smack/packet/Message.java
@@ -80,7 +80,10 @@ public class Message extends Packet {
*/
public Message(String to, Type type) {
setTo(to);
- this.type = type;
+
+ if (type != null) {
+ this.type = type;
+ }
}
/**
diff --git a/source/org/jivesoftware/smack/packet/Packet.java b/source/org/jivesoftware/smack/packet/Packet.java
index 041d8c892..27427acda 100644
--- a/source/org/jivesoftware/smack/packet/Packet.java
+++ b/source/org/jivesoftware/smack/packet/Packet.java
@@ -452,6 +452,7 @@ public abstract class Packet {
return DEFAULT_LANGUAGE;
}
+ @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
@@ -472,6 +473,7 @@ public abstract class Packet {
return !(xmlns != null ? !xmlns.equals(packet.xmlns) : packet.xmlns != null);
}
+ @Override
public int hashCode() {
int result;
result = (xmlns != null ? xmlns.hashCode() : 0);
@@ -483,4 +485,9 @@ public abstract class Packet {
result = 31 * result + (error != null ? error.hashCode() : 0);
return result;
}
+
+ @Override
+ public String toString() {
+ return toXML();
+ }
}
diff --git a/test-unit/org/jivesoftware/smack/ChatConnectionTest.java b/test-unit/org/jivesoftware/smack/ChatConnectionTest.java
index 3ded1ca44..72d56ff50 100644
--- a/test-unit/org/jivesoftware/smack/ChatConnectionTest.java
+++ b/test-unit/org/jivesoftware/smack/ChatConnectionTest.java
@@ -22,267 +22,419 @@ package org.jivesoftware.smack;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
+import org.jivesoftware.smack.ChatManager.MatchMode;
import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.packet.Message.Type;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.PacketExtension;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
-/**
- * Tests that verifies the correct behavior of the {@see Roster} implementation.
- *
- * @see Roster
- * @see Roster Management
- * @author Guenther Niess
- */
public class ChatConnectionTest {
private DummyConnection connection;
@Before
public void setUp() throws Exception {
- // Uncomment this to enable debug output
- //Connection.DEBUG_ENABLED = true;
-
- connection = new DummyConnection();
- connection.connect();
- connection.login("me", "secret");
+ connection = getConnection();
}
@After
public void tearDown() throws Exception {
- if (connection != null)
- connection.disconnect();
+ if (connection != null)
+ connection.disconnect();
+ }
+
+ @Test
+ public void validateDefaultSetNormalIncluded() {
+ ChatManager.setDefaultIsNormalIncluded(false);
+ assertFalse(getConnection().getChatManager().isNormalIncluded());
+
+ ChatManager.setDefaultIsNormalIncluded(true);
+ assertTrue(getConnection().getChatManager().isNormalIncluded());
+ }
+
+ @Test
+ public void validateDefaultSetMatchMode() {
+ ChatManager.setDefaultMatchMode(MatchMode.NONE);
+ assertEquals(MatchMode.NONE, getConnection().getChatManager().getMatchMode());
+
+ ChatManager.setDefaultMatchMode(MatchMode.BARE_JID);
+ assertEquals(MatchMode.BARE_JID, getConnection().getChatManager().getMatchMode());
+ }
+
+ @Test
+ public void validateMessageTypeWithDefaults() {
+ DummyConnection dc = getConnection();
+ ChatManager cm = dc.getChatManager();
+ TestChatManagerListener listener = new TestChatManagerListener();
+ cm.addChatListener(listener);
+ Message incomingChat = createChatPacket("134", true);
+ incomingChat.setType(Type.chat);
+ processServerMessage(incomingChat, dc);
+ assertNotNull(listener.getNewChat());
+
+ dc = getConnection();
+ cm = dc.getChatManager();
+ listener = new TestChatManagerListener();
+ cm.addChatListener(listener);
+ incomingChat = createChatPacket("134", true);
+ incomingChat.setType(Type.normal);
+ processServerMessage(incomingChat, dc);
+ assertNotNull(listener.getNewChat());
+
+ dc = getConnection();
+ cm = dc.getChatManager();
+ listener = new TestChatManagerListener();
+ cm.addChatListener(listener);
+ incomingChat = createChatPacket("134", true);
+ incomingChat.setType(Type.groupchat);
+ processServerMessage(incomingChat, dc);
+ assertNull(listener.getNewChat());
+
+ dc = getConnection();
+ cm = dc.getChatManager();
+ listener = new TestChatManagerListener();
+ cm.addChatListener(listener);
+ incomingChat = createChatPacket("134", true);
+ incomingChat.setType(Type.headline);
+ processServerMessage(incomingChat, dc);
+ assertNull(listener.getNewChat());
+ }
+
+ @Test
+ public void validateMessageTypeWithNoNormal() {
+ ChatManager.setDefaultIsNormalIncluded(false);
+ DummyConnection dc = getConnection();
+ ChatManager cm = dc.getChatManager();
+ TestChatManagerListener listener = new TestChatManagerListener();
+ cm.addChatListener(listener);
+ Message incomingChat = createChatPacket("134", true);
+ incomingChat.setType(Type.chat);
+ processServerMessage(incomingChat, dc);
+ assertNotNull(listener.getNewChat());
+
+ dc = getConnection();
+ cm = dc.getChatManager();
+ listener = new TestChatManagerListener();
+ cm.addChatListener(listener);
+ incomingChat = createChatPacket("134", true);
+ incomingChat.setType(Type.normal);
+ processServerMessage(incomingChat, dc);
+ assertNull(listener.getNewChat());
+ }
+
+ // No thread behaviour
+ @Test
+ public void chatMatchedOnJIDWhenNoThreadBareMode() {
+ // MatchMode.BARE_JID is the default, so setting required.
+ DummyConnection con = getConnection();
+ TestMessageListener msgListener = new TestMessageListener();
+ TestChatManagerListener listener = new TestChatManagerListener(msgListener);
+ con.getChatManager().addChatListener(listener);
+ Packet incomingChat = createChatPacket(null, true);
+ processServerMessage(incomingChat, con);
+ Chat newChat = listener.getNewChat();
+ assertNotNull(newChat);
+
+ // Should match on chat with full jid
+ incomingChat = createChatPacket(null, true);
+ processServerMessage(incomingChat, con);
+ assertEquals(2, msgListener.getNumMessages());
+
+ // Should match on chat with bare jid
+ incomingChat = createChatPacket(null, false);
+ processServerMessage(incomingChat, con);
+ assertEquals(3, msgListener.getNumMessages());
+ }
+
+ @Test
+ public void chatMatchedOnJIDWhenNoThreadJidMode() {
+ DummyConnection con = getConnection();
+ TestMessageListener msgListener = new TestMessageListener();
+ TestChatManagerListener listener = new TestChatManagerListener(msgListener);
+ ChatManager cm = con.getChatManager();
+ cm.setMatchMode(MatchMode.SUPPLIED_JID);
+ cm.addChatListener(listener);
+ Packet incomingChat = createChatPacket(null, true);
+ processServerMessage(incomingChat, con);
+ Chat newChat = listener.getNewChat();
+ assertNotNull(newChat);
+ cm.removeChatListener(listener);
+
+ // Should match on chat with full jid
+ incomingChat = createChatPacket(null, true);
+ processServerMessage(incomingChat, con);
+ assertEquals(2, msgListener.getNumMessages());
+
+ // Should not match on chat with bare jid
+ TestChatManagerListener listener2 = new TestChatManagerListener();
+ cm.addChatListener(listener2);
+ incomingChat = createChatPacket(null, false);
+ processServerMessage(incomingChat, con);
+ assertEquals(2, msgListener.getNumMessages());
+ assertNotNull(listener2.getNewChat());
+ }
+
+ @Test
+ public void chatMatchedOnJIDWhenNoThreadNoneMode() {
+ DummyConnection con = getConnection();
+ TestMessageListener msgListener = new TestMessageListener();
+ TestChatManagerListener listener = new TestChatManagerListener(msgListener);
+ ChatManager cm = con.getChatManager();
+ cm.setMatchMode(MatchMode.NONE);
+ cm.addChatListener(listener);
+ Packet incomingChat = createChatPacket(null, true);
+ processServerMessage(incomingChat, con);
+ Chat newChat = listener.getNewChat();
+ assertNotNull(newChat);
+ assertEquals(1, msgListener.getNumMessages());
+ cm.removeChatListener(listener);
+
+ // Should not match on chat with full jid
+ TestChatManagerListener listener2 = new TestChatManagerListener();
+ cm.addChatListener(listener2);
+ incomingChat = createChatPacket(null, true);
+ processServerMessage(incomingChat, con);
+ assertEquals(1, msgListener.getNumMessages());
+ assertNotNull(newChat);
+ cm.removeChatListener(listener2);
+
+ // Should not match on chat with bare jid
+ TestChatManagerListener listener3 = new TestChatManagerListener();
+ cm.addChatListener(listener3);
+ incomingChat = createChatPacket(null, false);
+ processServerMessage(incomingChat, con);
+ assertEquals(1, msgListener.getNumMessages());
+ assertNotNull(listener3.getNewChat());
}
/**
- * Confirm that a new chat is created when a chat message is received but
- * there is no thread id for a user with only a base jid.
+ * Confirm that an existing chat created with a base jid is matched to an incoming chat message that has no thread
+ * id and the user is a full jid.
*/
@Test
- public void chatCreatedWithIncomingChatNoThreadBaseJid()
- {
- TestChatManagerListener listener = new TestChatManagerListener();
- connection.getChatManager().addChatListener(listener);
+ public void chatFoundWhenNoThreadFullJid() {
+ TestChatManagerListener listener = new TestChatManagerListener();
+ connection.getChatManager().addChatListener(listener);
+ Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
- Packet incomingChat = createChatPacket(null, false);
- processServerMessage(incomingChat);
+ Packet incomingChat = createChatPacket(null, true);
+ processServerMessage(incomingChat);
- Chat newChat = listener.getNewChat();
- assertNotNull(newChat);
+ Chat newChat = listener.getNewChat();
+ assertNotNull(newChat);
+ assertTrue(newChat == outgoing);
}
/**
- * Confirm that a new chat is created when a chat message is received but
- * there is no thread id for a user with a full jid.
+ * Confirm that an existing chat created with a base jid is matched to an incoming chat message that has no thread
+ * id and the user is a base jid.
*/
@Test
- public void chatCreatedWhenIncomingChatNoThreadFullJid()
- {
- TestChatManagerListener listener = new TestChatManagerListener();
- connection.getChatManager().addChatListener(listener);
+ public void chatFoundWhenNoThreadBaseJid() {
+ TestChatManagerListener listener = new TestChatManagerListener();
+ connection.getChatManager().addChatListener(listener);
+ Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
- Packet incomingChat = createChatPacket(null, true);
- processServerMessage(incomingChat);
+ Packet incomingChat = createChatPacket(null, false);
+ processServerMessage(incomingChat);
- Chat newChat = listener.getNewChat();
- assertNotNull(newChat);
+ Chat newChat = listener.getNewChat();
+ assertNotNull(newChat);
+ assertTrue(newChat == outgoing);
}
/**
- * Confirm that an existing chat created with a base jid is matched to an
- * incoming chat message that has no thread id and the user is a full jid.
+ * Confirm that an existing chat created with a base jid is matched to an incoming chat message that has the same id
+ * and the user is a full jid.
*/
@Test
- public void chatFoundWhenNoThreadFullJid()
- {
- TestChatManagerListener listener = new TestChatManagerListener();
- connection.getChatManager().addChatListener(listener);
- Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
+ public void chatFoundWithSameThreadFullJid() {
+ TestChatManagerListener listener = new TestChatManagerListener();
+ connection.getChatManager().addChatListener(listener);
+ Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
- Packet incomingChat = createChatPacket(null, true);
- processServerMessage(incomingChat);
+ Packet incomingChat = createChatPacket(outgoing.getThreadID(), true);
+ processServerMessage(incomingChat);
- Chat newChat = listener.getNewChat();
- assertNotNull(newChat);
- assertTrue(newChat == outgoing);
+ Chat newChat = listener.getNewChat();
+ assertNotNull(newChat);
+ assertTrue(newChat == outgoing);
}
/**
- * Confirm that an existing chat created with a base jid is matched to an
- * incoming chat message that has no thread id and the user is a base jid.
+ * Confirm that an existing chat created with a base jid is matched to an incoming chat message that has the same id
+ * and the user is a base jid.
*/
@Test
- public void chatFoundWhenNoThreadBaseJid()
- {
- TestChatManagerListener listener = new TestChatManagerListener();
- connection.getChatManager().addChatListener(listener);
- Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
+ public void chatFoundWithSameThreadBaseJid() {
+ TestChatManagerListener listener = new TestChatManagerListener();
+ connection.getChatManager().addChatListener(listener);
+ Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
- Packet incomingChat = createChatPacket(null, false);
- processServerMessage(incomingChat);
+ Packet incomingChat = createChatPacket(outgoing.getThreadID(), false);
+ processServerMessage(incomingChat);
- Chat newChat = listener.getNewChat();
- assertNotNull(newChat);
- assertTrue(newChat == outgoing);
+ Chat newChat = listener.getNewChat();
+ assertNotNull(newChat);
+ assertTrue(newChat == outgoing);
}
/**
- * Confirm that an existing chat created with a base jid is matched to an
- * incoming chat message that has the same id and the user is a full jid.
+ * Confirm that an existing chat created with a base jid is not matched to an incoming chat message that has a
+ * different id and the same user as a base jid.
*/
@Test
- public void chatFoundWithSameThreadFullJid()
- {
- TestChatManagerListener listener = new TestChatManagerListener();
- connection.getChatManager().addChatListener(listener);
- Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
+ public void chatNotFoundWithDiffThreadBaseJid() {
+ TestChatManagerListener listener = new TestChatManagerListener();
+ connection.getChatManager().addChatListener(listener);
+ Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
- Packet incomingChat = createChatPacket(outgoing.getThreadID(), true);
- processServerMessage(incomingChat);
+ Packet incomingChat = createChatPacket(outgoing.getThreadID() + "ff", false);
+ processServerMessage(incomingChat);
- Chat newChat = listener.getNewChat();
- assertNotNull(newChat);
- assertTrue(newChat == outgoing);
+ Chat newChat = listener.getNewChat();
+ assertNotNull(newChat);
+ assertFalse(newChat == outgoing);
}
/**
- * Confirm that an existing chat created with a base jid is matched to an
- * incoming chat message that has the same id and the user is a base jid.
+ * Confirm that an existing chat created with a base jid is not matched to an incoming chat message that has a
+ * different id and the same base jid.
*/
@Test
- public void chatFoundWithSameThreadBaseJid()
- {
- TestChatManagerListener listener = new TestChatManagerListener();
- connection.getChatManager().addChatListener(listener);
- Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
+ public void chatNotFoundWithDiffThreadFullJid() {
+ TestChatManagerListener listener = new TestChatManagerListener();
+ connection.getChatManager().addChatListener(listener);
+ Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
- Packet incomingChat = createChatPacket(outgoing.getThreadID(), false);
- processServerMessage(incomingChat);
+ Packet incomingChat = createChatPacket(outgoing.getThreadID() + "ff", true);
+ processServerMessage(incomingChat);
- Chat newChat = listener.getNewChat();
- assertNotNull(newChat);
- assertTrue(newChat == outgoing);
+ Chat newChat = listener.getNewChat();
+ assertNotNull(newChat);
+ assertFalse(newChat == outgoing);
}
- /**
- * Confirm that an existing chat created with a base jid is not matched to
- * an incoming chat message that has a different id and the same user as a
- * base jid.
- */
- @Ignore
@Test
- public void chatNotFoundWithDiffThreadBaseJid()
- {
- TestChatManagerListener listener = new TestChatManagerListener();
- connection.getChatManager().addChatListener(listener);
- Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
+ public void chatNotMatchedWithTypeNormal() {
+ TestChatManagerListener listener = new TestChatManagerListener();
+ DummyConnection con = getConnection();
+ ChatManager cm = con.getChatManager();
+ cm.setNormalIncluded(false);
+ cm.addChatListener(listener);
- Packet incomingChat = createChatPacket(outgoing.getThreadID() + "ff", false);
- processServerMessage(incomingChat);
+ Message incomingChat = createChatPacket(null, false);
+ incomingChat.setType(Type.normal);
+ processServerMessage(incomingChat);
- Chat newChat = listener.getNewChat();
- assertNotNull(newChat);
- assertFalse(newChat == outgoing);
+ assertNull(listener.getNewChat());
}
- /**
- * Confirm that an existing chat created with a base jid is not matched to
- * an incoming chat message that has a different id and the same base jid.
- */
- @Ignore
- @Test
- public void chatNotFoundWithDiffThreadFullJid()
- {
- TestChatManagerListener listener = new TestChatManagerListener();
- connection.getChatManager().addChatListener(listener);
- Chat outgoing = connection.getChatManager().createChat("you@testserver", null);
+ private ChatManager getChatManager(boolean includeNormal, MatchMode mode) {
+ ChatManager cm = getConnection().getChatManager();
+ cm.setMatchMode(mode);
+ cm.setNormalIncluded(includeNormal);
+ return cm;
+ }
+
+ private DummyConnection getConnection() {
+ DummyConnection con = new DummyConnection();
+
+ try {
+ con.connect();
+ con.login("me", "secret");
+ } catch (XMPPException e) {
+ // No need for handling in a dummy connection.
+ }
+ return con;
+ }
+ private Message createChatPacket(final String threadId, final boolean isFullJid) {
+ Message chatMsg = new Message("me@testserver", Message.Type.chat);
+ chatMsg.setBody("the body message - " + System.currentTimeMillis());
+ chatMsg.setFrom("you@testserver" + (isFullJid ? "/resource" : ""));
- Packet incomingChat = createChatPacket(outgoing.getThreadID() + "ff", true);
- processServerMessage(incomingChat);
-
- Chat newChat = listener.getNewChat();
- assertNotNull(newChat);
- assertFalse(newChat == outgoing);
+ if (threadId != null)
+ chatMsg.setThread(threadId);
+ return chatMsg;
}
- private Packet createChatPacket(final String threadId, final boolean isFullJid)
- {
- Message chatMsg = new Message("me@testserver", Message.Type.chat);
- chatMsg.setBody("the body message");
- chatMsg.setFrom("you@testserver" + (isFullJid ? "/resource" : ""));
-
- if (threadId != null)
- chatMsg.addExtension(new PacketExtension()
- {
- @Override
- public String toXML()
- {
- return "" + threadId + "";
- }
-
- @Override
- public String getNamespace()
- {
- return null;
- }
-
- @Override
- public String getElementName()
- {
- return "thread";
- }
- });
- return chatMsg;
+ private void processServerMessage(Packet incomingChat) {
+ processServerMessage(incomingChat, connection);
+ }
+
+ private void processServerMessage(Packet incomingChat, DummyConnection con) {
+ TestChatServer chatServer = new TestChatServer(incomingChat, con);
+ chatServer.start();
+ try {
+ chatServer.join();
+ } catch (InterruptedException e) {
+ fail();
+ }
}
- private void processServerMessage(Packet incomingChat)
- {
- TestChatServer chatServer = new TestChatServer(incomingChat);
- chatServer.start();
- try
- {
- chatServer.join();
- } catch (InterruptedException e)
- {
- fail();
- }
+ class TestChatManagerListener implements ChatManagerListener {
+ private Chat newChat;
+ private MessageListener listener;
+
+ public TestChatManagerListener(TestMessageListener msgListener) {
+ listener = msgListener;
+ }
+
+ public TestChatManagerListener() {
+ }
+
+ @Override
+ public void chatCreated(Chat chat, boolean createdLocally) {
+ newChat = chat;
+
+ if (listener != null)
+ newChat.addMessageListener(listener);
+ }
+
+ public Chat getNewChat() {
+ return newChat;
+ }
+ }
+
+ private class TestChatServer extends Thread {
+ private Packet chatPacket;
+ private DummyConnection con;
+
+ TestChatServer(Packet chatMsg, DummyConnection conect) {
+ chatPacket = chatMsg;
+ con = conect;
+ }
+
+ @Override
+ public void run() {
+ con.processPacket(chatPacket);
+ }
}
- class TestChatManagerListener implements ChatManagerListener
- {
- private Chat newChat;
-
- @Override
- public void chatCreated(Chat chat, boolean createdLocally)
- {
- newChat = chat;
- }
-
- public Chat getNewChat()
- {
- return newChat;
- }
- }
-
- private class TestChatServer extends Thread
- {
- private Packet chatPacket;
-
- TestChatServer(Packet chatMsg)
- {
- chatPacket = chatMsg;
- }
-
- @Override
- public void run()
- {
- connection.processPacket(chatPacket);
- }
- }
+ private class TestMessageListener implements MessageListener {
+ private Chat msgChat;
+ private int counter = 0;
+
+ @Override
+ public void processMessage(Chat chat, Message message) {
+ msgChat = chat;
+ counter++;
+ }
+
+ public Chat getChat() {
+ return msgChat;
+ }
+
+ public int getNumMessages() {
+ return counter;
+ }
+ };
}