[jingle] Make Jingle.Builder extend IqBuilder

This makes Jingle.Builder to follow the new IqBuilder pattern,
allowing to construct Jingle IQs with a given stanza ID (mostly
useful for unit tests).
This commit is contained in:
Florian Schmaus 2021-10-19 11:32:51 +02:00
parent a3840659aa
commit 453ca6aeb0
5 changed files with 67 additions and 27 deletions

View File

@ -51,7 +51,7 @@ public class JingleUtil {
JingleContentDescription description, JingleContentDescription description,
JingleContentTransport transport) { JingleContentTransport transport) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection);
jb.setAction(JingleAction.session_initiate) jb.setAction(JingleAction.session_initiate)
.setSessionId(sessionId) .setSessionId(sessionId)
.setInitiator(connection.getUser()); .setInitiator(connection.getUser());
@ -116,7 +116,7 @@ public class JingleUtil {
JingleContentDescription description, JingleContentDescription description,
JingleContentTransport transport) { JingleContentTransport transport) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection);
jb.setResponder(connection.getUser()) jb.setResponder(connection.getUser())
.setAction(JingleAction.session_accept) .setAction(JingleAction.session_accept)
.setSessionId(sessionId); .setSessionId(sessionId);
@ -151,7 +151,7 @@ public class JingleUtil {
} }
public Jingle createSessionTerminate(FullJid recipient, String sessionId, JingleReason reason) { public Jingle createSessionTerminate(FullJid recipient, String sessionId, JingleReason reason) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection);
jb.setAction(JingleAction.session_terminate) jb.setAction(JingleAction.session_terminate)
.setSessionId(sessionId) .setSessionId(sessionId)
.setReason(reason); .setReason(reason);
@ -230,7 +230,7 @@ public class JingleUtil {
public Jingle createSessionTerminateContentCancel(FullJid recipient, String sessionId, public Jingle createSessionTerminateContentCancel(FullJid recipient, String sessionId,
JingleContent.Creator contentCreator, String contentName) { JingleContent.Creator contentCreator, String contentName) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection);
jb.setAction(JingleAction.session_terminate) jb.setAction(JingleAction.session_terminate)
.setSessionId(sessionId); .setSessionId(sessionId);
@ -312,7 +312,7 @@ public class JingleUtil {
} }
public Jingle createSessionPing(FullJid recipient, String sessionId) { public Jingle createSessionPing(FullJid recipient, String sessionId) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection);
jb.setSessionId(sessionId) jb.setSessionId(sessionId)
.setAction(JingleAction.session_info); .setAction(JingleAction.session_info);
@ -341,7 +341,7 @@ public class JingleUtil {
public Jingle createTransportReplace(FullJid recipient, FullJid initiator, String sessionId, public Jingle createTransportReplace(FullJid recipient, FullJid initiator, String sessionId,
JingleContent.Creator contentCreator, String contentName, JingleContent.Creator contentCreator, String contentName,
JingleContentTransport transport) { JingleContentTransport transport) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection);
jb.setInitiator(initiator) jb.setInitiator(initiator)
.setSessionId(sessionId) .setSessionId(sessionId)
.setAction(JingleAction.transport_replace); .setAction(JingleAction.transport_replace);
@ -368,7 +368,7 @@ public class JingleUtil {
public Jingle createTransportAccept(FullJid recipient, FullJid initiator, String sessionId, public Jingle createTransportAccept(FullJid recipient, FullJid initiator, String sessionId,
JingleContent.Creator contentCreator, String contentName, JingleContent.Creator contentCreator, String contentName,
JingleContentTransport transport) { JingleContentTransport transport) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection);
jb.setAction(JingleAction.transport_accept) jb.setAction(JingleAction.transport_accept)
.setInitiator(initiator) .setInitiator(initiator)
.setSessionId(sessionId); .setSessionId(sessionId);
@ -395,7 +395,7 @@ public class JingleUtil {
public Jingle createTransportReject(FullJid recipient, FullJid initiator, String sessionId, public Jingle createTransportReject(FullJid recipient, FullJid initiator, String sessionId,
JingleContent.Creator contentCreator, String contentName, JingleContent.Creator contentCreator, String contentName,
JingleContentTransport transport) { JingleContentTransport transport) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection);
jb.setAction(JingleAction.transport_reject) jb.setAction(JingleAction.transport_reject)
.setInitiator(initiator) .setInitiator(initiator)
.setSessionId(sessionId); .setSessionId(sessionId);

View File

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2003-2007 Jive Software, 2014-2017 Florian Schmaus * Copyright 2003-2007 Jive Software, 2014-2021 Florian Schmaus
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -21,7 +21,11 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.IqBuilder;
import org.jivesoftware.smack.packet.IqData;
import org.jivesoftware.smack.packet.id.StandardStanzaIdSource;
import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.Objects;
import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.util.StringUtils;
@ -65,9 +69,9 @@ public final class Jingle extends IQ {
private final List<JingleContent> contents; private final List<JingleContent> contents;
private Jingle(String sessionId, JingleAction action, FullJid initiator, FullJid responder, JingleReason reason, private Jingle(Builder builder, String sessionId, JingleAction action, FullJid initiator, FullJid responder, JingleReason reason,
List<JingleContent> contents) { List<JingleContent> contents) {
super(ELEMENT, NAMESPACE); super(builder, ELEMENT, NAMESPACE);
this.sessionId = StringUtils.requireNotNullNorEmpty(sessionId, "Jingle session ID must not be null"); this.sessionId = StringUtils.requireNotNullNorEmpty(sessionId, "Jingle session ID must not be null");
this.action = Objects.requireNonNull(action, "Jingle action must not be null"); this.action = Objects.requireNonNull(action, "Jingle action must not be null");
this.initiator = initiator; this.initiator = initiator;
@ -169,11 +173,31 @@ public final class Jingle extends IQ {
return xml; return xml;
} }
/**
* Deprecated, do not use.
*
* @return a builder.
* @deprecated use {@link #builder(XMPPConnection)} instead.
*/
@Deprecated
// TODO: Remove in Smack 4.6.
public static Builder getBuilder() { public static Builder getBuilder() {
return new Builder(); return builder(StandardStanzaIdSource.DEFAULT.getNewStanzaId());
} }
public static final class Builder { public static Builder builder(XMPPConnection connection) {
return new Builder(connection);
}
public static Builder builder(IqData iqData) {
return new Builder(iqData);
}
public static Builder builder(String stanzaId) {
return new Builder(stanzaId);
}
public static final class Builder extends IqBuilder<Builder, Jingle> {
private String sid; private String sid;
private JingleAction action; private JingleAction action;
@ -186,7 +210,16 @@ public final class Jingle extends IQ {
private List<JingleContent> contents; private List<JingleContent> contents;
private Builder() { Builder(IqData iqCommon) {
super(iqCommon);
}
Builder(XMPPConnection connection) {
super(connection);
}
Builder(String stanzaId) {
super(stanzaId);
} }
public Builder setSessionId(String sessionId) { public Builder setSessionId(String sessionId) {
@ -228,8 +261,14 @@ public final class Jingle extends IQ {
return this; return this;
} }
@Override
public Jingle build() { public Jingle build() {
return new Jingle(sid, action, initiator, responder, reason, contents); return new Jingle(this, sid, action, initiator, responder, reason, contents);
}
@Override
public Builder getThis() {
return this;
} }
} }
} }

View File

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2017-2019 Florian Schmaus * Copyright 2017-2021 Florian Schmaus
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -19,11 +19,12 @@ package org.jivesoftware.smackx.jingle.provider;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.jivesoftware.smack.packet.IqData;
import org.jivesoftware.smack.packet.StandardExtensionElement; import org.jivesoftware.smack.packet.StandardExtensionElement;
import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.parsing.SmackParsingException; import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.parsing.StandardExtensionElementProvider; import org.jivesoftware.smack.parsing.StandardExtensionElementProvider;
import org.jivesoftware.smack.provider.IQProvider; import org.jivesoftware.smack.provider.IqProvider;
import org.jivesoftware.smack.util.ParserUtils; import org.jivesoftware.smack.util.ParserUtils;
import org.jivesoftware.smack.xml.XmlPullParser; import org.jivesoftware.smack.xml.XmlPullParser;
import org.jivesoftware.smack.xml.XmlPullParserException; import org.jivesoftware.smack.xml.XmlPullParserException;
@ -40,13 +41,13 @@ import org.jivesoftware.smackx.jingle.element.UnknownJingleContentTransport;
import org.jxmpp.jid.FullJid; import org.jxmpp.jid.FullJid;
public class JingleProvider extends IQProvider<Jingle> { public class JingleProvider extends IqProvider<Jingle> {
private static final Logger LOGGER = Logger.getLogger(JingleProvider.class.getName()); private static final Logger LOGGER = Logger.getLogger(JingleProvider.class.getName());
@Override @Override
public Jingle parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException { public Jingle parse(XmlPullParser parser, int initialDepth, IqData iqData, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
Jingle.Builder builder = Jingle.getBuilder(); Jingle.Builder builder = Jingle.builder(iqData);
String actionString = parser.getAttributeValue("", Jingle.ACTION_ATTRIBUTE_NAME); String actionString = parser.getAttributeValue("", Jingle.ACTION_ATTRIBUTE_NAME);
if (actionString != null) { if (actionString != null) {

View File

@ -148,7 +148,7 @@ public final class JingleS5BTransportManager extends JingleTransportManager<Jing
public Jingle createCandidateUsed(FullJid recipient, FullJid initiator, String sessionId, JingleContent.Senders contentSenders, public Jingle createCandidateUsed(FullJid recipient, FullJid initiator, String sessionId, JingleContent.Senders contentSenders,
JingleContent.Creator contentCreator, String contentName, String streamId, JingleContent.Creator contentCreator, String contentName, String streamId,
String candidateId) { String candidateId) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection());
jb.setSessionId(sessionId).setInitiator(initiator).setAction(JingleAction.transport_info); jb.setSessionId(sessionId).setInitiator(initiator).setAction(JingleAction.transport_info);
JingleContent.Builder cb = JingleContent.getBuilder(); JingleContent.Builder cb = JingleContent.getBuilder();
@ -165,7 +165,7 @@ public final class JingleS5BTransportManager extends JingleTransportManager<Jing
} }
public Jingle createCandidateError(FullJid remote, FullJid initiator, String sessionId, JingleContent.Senders senders, JingleContent.Creator creator, String name, String streamId) { public Jingle createCandidateError(FullJid remote, FullJid initiator, String sessionId, JingleContent.Senders senders, JingleContent.Creator creator, String name, String streamId) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection());
jb.setSessionId(sessionId).setInitiator(initiator).setAction(JingleAction.transport_info); jb.setSessionId(sessionId).setInitiator(initiator).setAction(JingleAction.transport_info);
JingleContent.Builder cb = JingleContent.getBuilder(); JingleContent.Builder cb = JingleContent.getBuilder();
@ -184,7 +184,7 @@ public final class JingleS5BTransportManager extends JingleTransportManager<Jing
public Jingle createProxyError(FullJid remote, FullJid initiator, String sessionId, public Jingle createProxyError(FullJid remote, FullJid initiator, String sessionId,
JingleContent.Senders senders, JingleContent.Creator creator, JingleContent.Senders senders, JingleContent.Creator creator,
String name, String streamId) { String name, String streamId) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection());
jb.setSessionId(sessionId).setAction(JingleAction.transport_info).setInitiator(initiator); jb.setSessionId(sessionId).setAction(JingleAction.transport_info).setInitiator(initiator);
JingleContent.Builder cb = JingleContent.getBuilder(); JingleContent.Builder cb = JingleContent.getBuilder();
@ -202,7 +202,7 @@ public final class JingleS5BTransportManager extends JingleTransportManager<Jing
public Jingle createCandidateActivated(FullJid remote, FullJid initiator, String sessionId, public Jingle createCandidateActivated(FullJid remote, FullJid initiator, String sessionId,
JingleContent.Senders senders, JingleContent.Creator creator, JingleContent.Senders senders, JingleContent.Creator creator,
String name, String streamId, String candidateId) { String name, String streamId, String candidateId) {
Jingle.Builder jb = Jingle.getBuilder(); Jingle.Builder jb = Jingle.builder(connection());
jb.setInitiator(initiator).setSessionId(sessionId).setAction(JingleAction.transport_info); jb.setInitiator(initiator).setSessionId(sessionId).setAction(JingleAction.transport_info);
JingleContent.Builder cb = JingleContent.getBuilder(); JingleContent.Builder cb = JingleContent.getBuilder();

View File

@ -38,7 +38,7 @@ public class JingleTest extends SmackTestSuite {
@Test @Test
public void emptyBuilderTest() { public void emptyBuilderTest() {
Jingle.Builder builder = Jingle.getBuilder(); Jingle.Builder builder = Jingle.builder("id");
assertThrows(IllegalArgumentException.class, () -> { assertThrows(IllegalArgumentException.class, () -> {
builder.build(); builder.build();
}); });
@ -48,7 +48,7 @@ public class JingleTest extends SmackTestSuite {
public void onlySessionIdBuilderTest() { public void onlySessionIdBuilderTest() {
String sessionId = "testSessionId"; String sessionId = "testSessionId";
Jingle.Builder builder = Jingle.getBuilder(); Jingle.Builder builder = Jingle.builder("id");
builder.setSessionId(sessionId); builder.setSessionId(sessionId);
assertThrows(IllegalArgumentException.class, () -> { assertThrows(IllegalArgumentException.class, () -> {
builder.build(); builder.build();
@ -59,7 +59,7 @@ public class JingleTest extends SmackTestSuite {
public void parserTest() throws XmppStringprepException { public void parserTest() throws XmppStringprepException {
String sessionId = "testSessionId"; String sessionId = "testSessionId";
Jingle.Builder builder = Jingle.getBuilder(); Jingle.Builder builder = Jingle.builder("id");
builder.setSessionId(sessionId); builder.setSessionId(sessionId);
builder.setAction(JingleAction.session_initiate); builder.setAction(JingleAction.session_initiate);