1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2025-09-09 00:59:39 +02:00

Introduce StanzaBuilder

As first step to immutable Stanza types.
This commit is contained in:
Florian Schmaus 2019-10-24 15:45:08 +02:00
parent 926c5892ad
commit 5db6191110
134 changed files with 2576 additions and 764 deletions

View file

@ -24,6 +24,8 @@ import java.util.concurrent.CopyOnWriteArraySet;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.StanzaCollector;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.MessageBuilder;
import org.jivesoftware.smack.packet.StanzaBuilder;
import org.jivesoftware.smack.util.StringUtils;
import org.jxmpp.jid.EntityJid;
@ -98,11 +100,28 @@ public class Chat {
* @throws InterruptedException if the calling thread was interrupted.
*/
public void sendMessage(String text) throws NotConnectedException, InterruptedException {
Message message = new Message();
message.setBody(text);
MessageBuilder message = StanzaBuilder.buildMessage()
.setBody(text);
sendMessage(message);
}
/**
* Sends a message to the other chat participant. The thread ID, recipient,
* and message type of the message will automatically set to those of this chat.
*
* @param message the message to send.
* @throws NotConnectedException if the XMPP connection is not connected.
* @throws InterruptedException if the calling thread was interrupted.
*/
public void sendMessage(MessageBuilder message) throws NotConnectedException, InterruptedException {
// Force the recipient, message type, and thread ID since the user elected
// to send the message through this chat object.
message.to(participant);
message.ofType(Message.Type.chat);
message.setThread(threadID);
chatManager.sendMessage(this, message.build());
}
/**
* Sends a message to the other chat participant. The thread ID, recipient,
* and message type of the message will automatically set to those of this chat.

View file

@ -56,7 +56,9 @@ import org.jivesoftware.smack.iqrequest.AbstractIqRequestHandler;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.IQ.Type;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.PresenceBuilder;
import org.jivesoftware.smack.packet.Stanza;
import org.jivesoftware.smack.packet.StanzaBuilder;
import org.jivesoftware.smack.packet.StanzaError.Condition;
import org.jivesoftware.smack.roster.SubscribeListener.SubscribeAnswer;
import org.jivesoftware.smack.roster.packet.RosterPacket;
@ -286,23 +288,26 @@ public final class Roster extends Manager {
return;
}
Presence response;
Presence.Type type;
switch (subscribeAnswer) {
case ApproveAndAlsoRequestIfRequired:
BareJid bareFrom = from.asBareJid();
RosterUtil.askForSubscriptionIfRequired(Roster.this, bareFrom);
// The fall through is intended.
case Approve:
response = new Presence(Presence.Type.subscribed);
type = Presence.Type.subscribed;
break;
case Deny:
response = new Presence(Presence.Type.unsubscribed);
type = Presence.Type.unsubscribed;
break;
default:
throw new AssertionError();
}
response.setTo(presence.getFrom());
Presence response = connection.getStanzaFactory().buildPresenceStanza()
.ofType(type)
.to(presence.getFrom())
.build();
connection.sendStanza(response);
}
}, PresenceTypeFilter.SUBSCRIBE);
@ -747,8 +752,10 @@ public final class Roster extends Manager {
throw new FeatureNotSupportedException("Pre-approving");
}
Presence presencePacket = new Presence(Presence.Type.subscribed);
presencePacket.setTo(user);
Presence presencePacket = connection.getStanzaFactory().buildPresenceStanza()
.ofType(Presence.Type.subscribed)
.to(user)
.build();
connection.sendStanza(presencePacket);
}
@ -768,8 +775,10 @@ public final class Roster extends Manager {
final XMPPConnection connection = getAuthenticatedConnectionOrThrow();
// Create a presence subscription packet and send.
Presence presencePacket = new Presence(Presence.Type.subscribe);
presencePacket.setTo(jid);
Presence presencePacket = connection.getStanzaFactory().buildPresenceStanza()
.ofType(Presence.Type.subscribe)
.to(jid)
.build();
connection.sendStanza(presencePacket);
}
@ -1000,8 +1009,7 @@ public final class Roster extends Manager {
public Presence getPresence(BareJid jid) {
Map<Resourcepart, Presence> userPresences = getPresencesInternal(jid);
if (userPresences == null) {
Presence presence = new Presence(Presence.Type.unavailable);
presence.setFrom(jid);
Presence presence = synthesizeUnvailablePresence(jid);
return presence;
}
else {
@ -1042,8 +1050,7 @@ public final class Roster extends Manager {
return unavailable.clone();
}
else {
presence = new Presence(Presence.Type.unavailable);
presence.setFrom(jid);
presence = synthesizeUnvailablePresence(jid);
return presence;
}
}
@ -1067,15 +1074,13 @@ public final class Roster extends Manager {
Resourcepart resource = userWithResource.getResourcepart();
Map<Resourcepart, Presence> userPresences = getPresencesInternal(key);
if (userPresences == null) {
Presence presence = new Presence(Presence.Type.unavailable);
presence.setFrom(userWithResource);
Presence presence = synthesizeUnvailablePresence(userWithResource);
return presence;
}
else {
Presence presence = userPresences.get(resource);
if (presence == null) {
presence = new Presence(Presence.Type.unavailable);
presence.setFrom(userWithResource);
presence = synthesizeUnvailablePresence(userWithResource);
return presence;
}
else {
@ -1097,8 +1102,7 @@ public final class Roster extends Manager {
List<Presence> res;
if (userPresences == null) {
// Create an unavailable presence if none was found
Presence unavailable = new Presence(Presence.Type.unavailable);
unavailable.setFrom(bareJid);
Presence unavailable = synthesizeUnvailablePresence(bareJid);
res = new ArrayList<>(Arrays.asList(unavailable));
} else {
res = new ArrayList<>(userPresences.values().size());
@ -1143,8 +1147,7 @@ public final class Roster extends Manager {
List<Presence> res;
Map<Resourcepart, Presence> userPresences = getPresencesInternal(jid);
if (userPresences == null) {
Presence presence = new Presence(Presence.Type.unavailable);
presence.setFrom(jid);
Presence presence = synthesizeUnvailablePresence(jid);
res = Arrays.asList(presence);
}
else {
@ -1166,8 +1169,7 @@ public final class Roster extends Manager {
res = Arrays.asList(unavailable.clone());
}
else {
Presence presence = new Presence(Presence.Type.unavailable);
presence.setFrom(jid);
Presence presence = synthesizeUnvailablePresence(jid);
res = Arrays.asList(presence);
}
}
@ -1266,20 +1268,20 @@ public final class Roster extends Manager {
* presence sent from the server.
*/
private void setOfflinePresences() {
Presence packetUnavailable;
outerloop: for (Jid user : presenceMap.keySet()) {
Map<Resourcepart, Presence> resources = presenceMap.get(user);
if (resources != null) {
for (Resourcepart resource : resources.keySet()) {
packetUnavailable = new Presence(Presence.Type.unavailable);
PresenceBuilder presenceBuilder = StanzaBuilder.buildPresence()
.ofType(Presence.Type.unavailable);
EntityBareJid bareUserJid = user.asEntityBareJidIfPossible();
if (bareUserJid == null) {
LOGGER.warning("Can not transform user JID to bare JID: '" + user + "'");
continue;
}
packetUnavailable.setFrom(JidCreate.fullFrom(bareUserJid, resource));
presenceBuilder.from(JidCreate.fullFrom(bareUserJid, resource));
try {
presencePacketListener.processStanza(packetUnavailable);
presencePacketListener.processStanza(presenceBuilder.build());
}
catch (NotConnectedException e) {
throw new IllegalStateException(
@ -1471,6 +1473,13 @@ public final class Roster extends Manager {
}
}
private static Presence synthesizeUnvailablePresence(Jid from) {
return StanzaBuilder.buildPresence()
.ofType(Presence.Type.unavailable)
.from(from)
.build();
}
/**
* Check if the server supports roster versioning.
*

View file

@ -218,8 +218,12 @@ public final class RosterEntry extends Manager {
* @since 4.2
*/
public void cancelSubscription() throws NotConnectedException, InterruptedException {
Presence unsubscribed = new Presence(item.getJid(), Type.unsubscribed);
connection().sendStanza(unsubscribed);
XMPPConnection connection = connection();
Presence unsubscribed = connection.getStanzaFactory().buildPresenceStanza()
.to(item.getJid())
.ofType(Type.unsubscribed)
.build();
connection.sendStanza(unsubscribed);
}
@Override

View file

@ -19,7 +19,6 @@ package org.jivesoftware.smack.roster.provider;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.roster.packet.RosterVer;
import org.jivesoftware.smack.xml.XmlPullParser;
public class RosterVerStreamFeatureProvider extends ExtensionElementProvider<RosterVer> {

View file

@ -19,7 +19,6 @@ package org.jivesoftware.smack.roster.provider;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.roster.packet.SubscriptionPreApproval;
import org.jivesoftware.smack.xml.XmlPullParser;
public class SubscriptionPreApprovalStreamFeatureProvider extends ExtensionElementProvider<SubscriptionPreApproval> {

View file

@ -25,7 +25,9 @@ import static org.junit.Assert.assertTrue;
import org.jivesoftware.smack.DummyConnection;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Message.Type;
import org.jivesoftware.smack.packet.MessageBuilder;
import org.jivesoftware.smack.packet.Stanza;
import org.jivesoftware.smack.packet.StanzaBuilder;
import org.jivesoftware.smack.test.util.WaitForPacketListener;
import org.junit.After;
@ -89,49 +91,49 @@ public class ChatConnectionTest {
@Test
public void validateMessageTypeWithDefaults1() {
Message incomingChat = createChatPacket("134", true);
incomingChat.setType(Type.chat);
processServerMessage(incomingChat);
MessageBuilder incomingChat = createChatPacket("134", true);
incomingChat.ofType(Type.chat);
processServerMessage(incomingChat.build());
assertNotNull(listener.getNewChat());
}
@Test
public void validateMessageTypeWithDefaults2() {
Message incomingChat = createChatPacket("134", true);
incomingChat.setType(Type.normal);
processServerMessage(incomingChat);
MessageBuilder incomingChat = createChatPacket("134", true);
incomingChat.ofType(Type.normal);
processServerMessage(incomingChat.build());
assertNotNull(listener.getNewChat());
}
@Test
public void validateMessageTypeWithDefaults3() {
Message incomingChat = createChatPacket("134", true);
incomingChat.setType(Type.groupchat);
processServerMessage(incomingChat);
MessageBuilder incomingChat = createChatPacket("134", true);
incomingChat.ofType(Type.groupchat);
processServerMessage(incomingChat.build());
assertNull(listener.getNewChat());
}
@Test
public void validateMessageTypeWithDefaults4() {
Message incomingChat = createChatPacket("134", true);
incomingChat.setType(Type.headline);
MessageBuilder incomingChat = createChatPacket("134", true);
incomingChat.ofType(Type.headline);
assertNull(listener.getNewChat());
}
@Test
public void validateMessageTypeWithNoNormal1() {
cm.setNormalIncluded(false);
Message incomingChat = createChatPacket("134", true);
incomingChat.setType(Type.chat);
processServerMessage(incomingChat);
MessageBuilder incomingChat = createChatPacket("134", true);
incomingChat.ofType(Type.chat);
processServerMessage(incomingChat.build());
assertNotNull(listener.getNewChat());
}
@Test
public void validateMessageTypeWithNoNormal2() {
cm.setNormalIncluded(false);
Message incomingChat = createChatPacket("134", true);
incomingChat.setType(Type.normal);
processServerMessage(incomingChat);
MessageBuilder incomingChat = createChatPacket("134", true);
incomingChat.ofType(Type.normal);
processServerMessage(incomingChat.build());
assertNull(listener.getNewChat());
}
@ -142,18 +144,18 @@ public class ChatConnectionTest {
TestMessageListener msgListener = new TestMessageListener();
TestChatManagerListener listener = new TestChatManagerListener(msgListener);
cm.addChatListener(listener);
Stanza incomingChat = createChatPacket(null, true);
Stanza incomingChat = createChatMessage(null, true);
processServerMessage(incomingChat);
Chat newChat = listener.getNewChat();
assertNotNull(newChat);
// Should match on chat with full jid
incomingChat = createChatPacket(null, true);
incomingChat = createChatMessage(null, true);
processServerMessage(incomingChat);
assertEquals(2, msgListener.getNumMessages());
// Should match on chat with bare jid
incomingChat = createChatPacket(null, false);
incomingChat = createChatMessage(null, false);
processServerMessage(incomingChat);
assertEquals(3, msgListener.getNumMessages());
}
@ -164,21 +166,21 @@ public class ChatConnectionTest {
TestChatManagerListener listener = new TestChatManagerListener(msgListener);
cm.setMatchMode(ChatManager.MatchMode.SUPPLIED_JID);
cm.addChatListener(listener);
Stanza incomingChat = createChatPacket(null, true);
Stanza incomingChat = createChatMessage(null, true);
processServerMessage(incomingChat);
Chat newChat = listener.getNewChat();
assertNotNull(newChat);
cm.removeChatListener(listener);
// Should match on chat with full jid
incomingChat = createChatPacket(null, true);
incomingChat = createChatMessage(null, true);
processServerMessage(incomingChat);
assertEquals(2, msgListener.getNumMessages());
// Should not match on chat with bare jid
TestChatManagerListener listener2 = new TestChatManagerListener();
cm.addChatListener(listener2);
incomingChat = createChatPacket(null, false);
incomingChat = createChatMessage(null, false);
processServerMessage(incomingChat);
assertEquals(2, msgListener.getNumMessages());
assertNotNull(listener2.getNewChat());
@ -190,7 +192,7 @@ public class ChatConnectionTest {
TestChatManagerListener listener = new TestChatManagerListener(msgListener);
cm.setMatchMode(ChatManager.MatchMode.NONE);
cm.addChatListener(listener);
Stanza incomingChat = createChatPacket(null, true);
Stanza incomingChat = createChatMessage(null, true);
processServerMessage(incomingChat);
Chat newChat = listener.getNewChat();
assertNotNull(newChat);
@ -200,7 +202,7 @@ public class ChatConnectionTest {
// Should not match on chat with full jid
TestChatManagerListener listener2 = new TestChatManagerListener();
cm.addChatListener(listener2);
incomingChat = createChatPacket(null, true);
incomingChat = createChatMessage(null, true);
processServerMessage(incomingChat);
assertEquals(1, msgListener.getNumMessages());
assertNotNull(newChat);
@ -209,7 +211,7 @@ public class ChatConnectionTest {
// Should not match on chat with bare jid
TestChatManagerListener listener3 = new TestChatManagerListener();
cm.addChatListener(listener3);
incomingChat = createChatPacket(null, false);
incomingChat = createChatMessage(null, false);
processServerMessage(incomingChat);
assertEquals(1, msgListener.getNumMessages());
assertNotNull(listener3.getNewChat());
@ -223,7 +225,7 @@ public class ChatConnectionTest {
public void chatFoundWhenNoThreadEntityFullJid() {
Chat outgoing = cm.createChat(JidTestUtil.DUMMY_AT_EXAMPLE_ORG, null);
Stanza incomingChat = createChatPacket(null, true);
Stanza incomingChat = createChatMessage(null, true);
processServerMessage(incomingChat);
Chat newChat = listener.getNewChat();
@ -239,7 +241,7 @@ public class ChatConnectionTest {
public void chatFoundWhenNoThreadBaseJid() {
Chat outgoing = cm.createChat(JidTestUtil.DUMMY_AT_EXAMPLE_ORG, null);
Stanza incomingChat = createChatPacket(null, false);
Stanza incomingChat = createChatMessage(null, false);
processServerMessage(incomingChat);
Chat newChat = listener.getNewChat();
@ -255,7 +257,7 @@ public class ChatConnectionTest {
public void chatFoundWithSameThreadEntityFullJid() {
Chat outgoing = cm.createChat(JidTestUtil.DUMMY_AT_EXAMPLE_ORG, null);
Stanza incomingChat = createChatPacket(outgoing.getThreadID(), true);
Stanza incomingChat = createChatMessage(outgoing.getThreadID(), true);
processServerMessage(incomingChat);
Chat newChat = listener.getNewChat();
@ -271,7 +273,7 @@ public class ChatConnectionTest {
public void chatFoundWithSameThreadBaseJid() {
Chat outgoing = cm.createChat(JidTestUtil.DUMMY_AT_EXAMPLE_ORG, null);
Stanza incomingChat = createChatPacket(outgoing.getThreadID(), false);
Stanza incomingChat = createChatMessage(outgoing.getThreadID(), false);
processServerMessage(incomingChat);
Chat newChat = listener.getNewChat();
@ -287,7 +289,7 @@ public class ChatConnectionTest {
public void chatNotFoundWithDiffThreadBaseJid() {
Chat outgoing = cm.createChat(JidTestUtil.DUMMY_AT_EXAMPLE_ORG, null);
Stanza incomingChat = createChatPacket(outgoing.getThreadID() + "ff", false);
Stanza incomingChat = createChatMessage(outgoing.getThreadID() + "ff", false);
processServerMessage(incomingChat);
Chat newChat = listener.getNewChat();
@ -303,7 +305,7 @@ public class ChatConnectionTest {
public void chatNotFoundWithDiffThreadEntityFullJid() {
Chat outgoing = cm.createChat(JidTestUtil.DUMMY_AT_EXAMPLE_ORG, null);
Stanza incomingChat = createChatPacket(outgoing.getThreadID() + "ff", true);
Stanza incomingChat = createChatMessage(outgoing.getThreadID() + "ff", true);
processServerMessage(incomingChat);
Chat newChat = listener.getNewChat();
@ -315,15 +317,17 @@ public class ChatConnectionTest {
public void chatNotMatchedWithTypeNormal() {
cm.setNormalIncluded(false);
Message incomingChat = createChatPacket(null, false);
incomingChat.setType(Type.normal);
processServerMessage(incomingChat);
MessageBuilder incomingChat = createChatPacket(null, false);
incomingChat.ofType(Type.normal);
processServerMessage(incomingChat.build());
assertNull(listener.getNewChat());
}
private static Message createChatPacket(final String threadId, final boolean isEntityFullJid) {
Message chatMsg = new Message(JidTestUtil.BARE_JID_1, Message.Type.chat);
private static MessageBuilder createChatPacket(final String threadId, final boolean isEntityFullJid) {
MessageBuilder chatMsg = StanzaBuilder.buildMessage()
.ofType(Message.Type.chat)
.to(JidTestUtil.BARE_JID_1);
chatMsg.setBody("the body message - " + System.currentTimeMillis());
Jid jid;
if (isEntityFullJid) {
@ -331,11 +335,15 @@ public class ChatConnectionTest {
} else {
jid = JidTestUtil.DUMMY_AT_EXAMPLE_ORG;
}
chatMsg.setFrom(jid);
chatMsg.from(jid);
chatMsg.setThread(threadId);
return chatMsg;
}
private static Message createChatMessage(final String threadId, final boolean isEntityFullJid) {
return createChatPacket(threadId, isEntityFullJid).build();
}
private void processServerMessage(Stanza incomingChat) {
TestChatServer chatServer = new TestChatServer(incomingChat, dc);
chatServer.start();