diff --git a/build.gradle b/build.gradle index 3d04098c9..6cd384106 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ buildscript { } dependencies { classpath 'org.kordamp.gradle:clirr-gradle-plugin:0.2.2' + classpath "biz.aQute.bnd:biz.aQute.bnd.gradle:6.0.0" } } @@ -450,6 +451,7 @@ subprojects { apply plugin: 'signing' apply plugin: 'checkstyle' apply plugin: 'org.kordamp.gradle.clirr' + apply plugin: 'biz.aQute.bnd.builder' checkstyle { toolVersion = '8.27' @@ -612,9 +614,15 @@ project(':smack-omemo').clirr.enabled = false project(':smack-omemo-signal').clirr.enabled = false subprojects*.jar { - manifest { - from sharedManifest - } + manifest { + from sharedManifest + } + bundle { + bnd( + '-removeheaders': 'Tool, Bnd-*', + '-exportcontents': '*', + ) + } } configure(subprojects - gplLicensedProjects) { diff --git a/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java b/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java index c3d7109f8..a88507719 100644 --- a/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java +++ b/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java @@ -43,6 +43,7 @@ import org.jivesoftware.smack.packet.StanzaError; import org.jivesoftware.smack.util.CloseableUtil; import org.jivesoftware.smack.util.PacketParserUtils; import org.jivesoftware.smack.xml.XmlPullParser; +import org.jivesoftware.smack.xml.XmlPullParserException; import org.igniterealtime.jbosh.AbstractBody; import org.igniterealtime.jbosh.BOSHClient; @@ -200,6 +201,13 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection { + getHost() + ":" + getPort() + "."; throw new SmackException.SmackMessageException(errorMessage); } + + try { + XmlPullParser parser = PacketParserUtils.getParserFor(""); + onStreamOpen(parser); + } catch (XmlPullParserException | IOException e) { + throw new AssertionError("Failed to setup stream environment", e); + } } @Override @@ -511,7 +519,7 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection { parseAndProcessStanza(parser); break; case "features": - parseFeatures(parser); + parseFeaturesAndNotify(parser); break; case "error": // Some BOSH error isn't stream error. diff --git a/smack-core/build.gradle b/smack-core/build.gradle index fcc351120..f614ef812 100644 --- a/smack-core/build.gradle +++ b/smack-core/build.gradle @@ -1,3 +1,8 @@ +// Note that this is also declared in the main build.gradle for +// subprojects, but since evaluationDependsOnChildren is enabled we +// need to declare it here too to have bundle{bnd{...}} available +apply plugin: 'biz.aQute.bnd.builder' + description = """\ Smack core components.""" @@ -55,3 +60,11 @@ task createVersionResource(type: CreateFileTask) { } compileJava.dependsOn(createVersionResource) + +jar { + bundle { + bnd( + 'DynamicImport-Package': '*', + ) + } +} diff --git a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java index 23e664e94..2a0165009 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java @@ -405,7 +405,7 @@ public abstract class ConnectionConfiguration { /** * Returns the TLS security mode used when making the connection. By default, - * the mode is {@link SecurityMode#ifpossible}. + * the mode is {@link SecurityMode#required}. * * @return the security mode. */ @@ -960,7 +960,7 @@ public abstract class ConnectionConfiguration { /** * Sets the TLS security mode used when making the connection. By default, - * the mode is {@link SecurityMode#ifpossible}. + * the mode is {@link SecurityMode#required}. * * @param securityMode the security mode. * @return a reference to this builder. diff --git a/smack-core/src/main/java/org/jivesoftware/smack/XMPPException.java b/smack-core/src/main/java/org/jivesoftware/smack/XMPPException.java index ce4c0a4f0..f7235fb48 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/XMPPException.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/XMPPException.java @@ -120,6 +120,16 @@ public abstract class XMPPException extends Exception { return error; } + /** + * Gets the stanza associated with this exception. + * + * @return the stanza from which this exception was created or {@code null} if the exception is not from a + * stanza. + */ + public Stanza getStanza() { + return stanza; + } + /** * Get the request which triggered the error response causing this exception. * diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java index 2fcfe88fc..2c9cd0e51 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java @@ -202,7 +202,7 @@ public abstract class IQ extends Stanza implements IqView { // Add the query section if there is one. IQChildElementXmlStringBuilder iqChildElement = getIQChildElementBuilder( - new IQChildElementXmlStringBuilder(this)); + new IQChildElementXmlStringBuilder(getChildElementName(), getChildElementNamespace(), null, xml.getXmlEnvironment())); // TOOD: Document the cases where iqChildElement is null but childElementName not. And if there are none, change // the logic. if (iqChildElement == null) { @@ -399,17 +399,16 @@ public abstract class IQ extends Stanza implements IqView { private boolean isEmptyElement; - private IQChildElementXmlStringBuilder(IQ iq) { - this(iq.getChildElementName(), iq.getChildElementNamespace()); + public IQChildElementXmlStringBuilder(ExtensionElement extensionElement, + XmlEnvironment enclosingXmlEnvironment) { + this(extensionElement.getElementName(), extensionElement.getNamespace(), extensionElement.getLanguage(), + enclosingXmlEnvironment); } - public IQChildElementXmlStringBuilder(ExtensionElement pe) { - this(pe.getElementName(), pe.getNamespace()); - } - - private IQChildElementXmlStringBuilder(String element, String namespace) { - prelude(element, namespace); - this.element = element; + private IQChildElementXmlStringBuilder(String elementName, String xmlNs, String xmlLang, + XmlEnvironment enclosingXmlEnvironment) { + super(elementName, xmlNs, xmlLang, enclosingXmlEnvironment); + this.element = elementName; } public void setEmptyElement() { diff --git a/smack-core/src/main/java/org/jivesoftware/smack/sasl/core/SASLAnonymous.java b/smack-core/src/main/java/org/jivesoftware/smack/sasl/core/SASLAnonymous.java index fd99732fe..79b9eff48 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/sasl/core/SASLAnonymous.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/sasl/core/SASLAnonymous.java @@ -60,4 +60,8 @@ public class SASLAnonymous extends SASLMechanism { // SASL Anonymous is always successful :) } + @Override + public boolean requiresPassword() { + return false; + } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java index 32b11496a..6c8912b14 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java @@ -78,6 +78,7 @@ public class ParserUtils { throws XmlPullParserException, IOException { XmlPullParser.Event event = parser.getEventType(); while (!(event == XmlPullParser.Event.END_ELEMENT && parser.getDepth() == depth)) { + assert event != XmlPullParser.Event.END_DOCUMENT; event = parser.next(); } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java b/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java index ec0e11cad..1ede61781 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java @@ -1,6 +1,6 @@ /** * - * Copyright 2014-2020 Florian Schmaus + * Copyright 2014-2021 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,11 +52,13 @@ public class XmlStringBuilder implements Appendable, CharSequence, Element { } public XmlStringBuilder(XmlElement element, XmlEnvironment enclosingXmlEnvironment) { - sb = new LazyStringBuilder(); - halfOpenElement(element); + this(element.getElementName(), element.getNamespace(), element.getLanguage(), enclosingXmlEnvironment); + } + + public XmlStringBuilder(String elementName, String xmlNs, String xmlLang, XmlEnvironment enclosingXmlEnvironment) { + sb = new LazyStringBuilder(); + halfOpenElement(elementName); - String xmlNs = element.getNamespace(); - String xmlLang = element.getLanguage(); if (enclosingXmlEnvironment == null) { xmlnsAttribute(xmlNs); xmllangAttribute(xmlLang); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java index c020df7cf..f2e055386 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java @@ -154,8 +154,7 @@ public final class CarbonManager extends Manager { // because we also reset in authenticated() if the stream got not resumed, but for maximum correctness, // also reset here. enabled_state = false; - boolean removed = connection().removeSyncStanzaListener(carbonsListener); - assert removed; + connection().removeSyncStanzaListener(carbonsListener); } @Override public void authenticated(XMPPConnection connection, boolean resumed) { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/ibb/packet/DataPacketExtension.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/ibb/packet/DataPacketExtension.java index 532ac9a11..008c941c6 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/ibb/packet/DataPacketExtension.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/ibb/packet/DataPacketExtension.java @@ -153,7 +153,7 @@ public class DataPacketExtension implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this)); + XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this, enclosingNamespace)); xml.closeElement(this); return xml; } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java index 12be65fcb..66e221c49 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java @@ -615,9 +615,7 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream if (annouceLocalStreamHost) { // add local proxy on first position if exists List localProxies = getLocalStreamHost(); - if (localProxies != null) { - streamHosts.addAll(localProxies); - } + streamHosts.addAll(localProxies); } // query SOCKS5 proxies for network settings @@ -652,12 +650,14 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream /** * Returns the stream host information of the local SOCKS5 proxy containing the IP address and - * the port or null if local SOCKS5 proxy is not running. + * the port. The returned list may be empty if the local SOCKS5 proxy is not running. * - * @return the stream host information of the local SOCKS5 proxy or null if local SOCKS5 proxy - * is not running + * @return the stream host information of the local SOCKS5 proxy */ public List getLocalStreamHost() { + // Ensure that the local SOCKS5 proxy is running (if enabled). + Socks5Proxy.getSocks5Proxy(); + List streamHosts = new ArrayList<>(); XMPPConnection connection = connection(); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/packet/DiscoverInfo.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/packet/DiscoverInfo.java index b4d3f7554..abe18f630 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/packet/DiscoverInfo.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/packet/DiscoverInfo.java @@ -258,6 +258,14 @@ public class DiscoverInfo extends IQ implements DiscoverInfoView { return features.contains(new Feature(feature)); } + public static boolean nullSafeContainsFeature(DiscoverInfo discoverInfo, CharSequence feature) { + if (discoverInfo == null) { + return false; + } + + return discoverInfo.containsFeature(feature); + } + @Override protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { xml.optAttribute("node", getNode()); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java index 000765ec9..df08bace6 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java @@ -53,7 +53,7 @@ public class JingleUtil { JingleContentDescription description, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setAction(JingleAction.session_initiate) .setSessionId(sessionId) .setInitiator(connection.getUser()); @@ -118,7 +118,7 @@ public class JingleUtil { JingleContentDescription description, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setResponder(connection.getUser()) .setAction(JingleAction.session_accept) .setSessionId(sessionId); @@ -153,7 +153,7 @@ public class JingleUtil { } 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) .setSessionId(sessionId) .setReason(reason); @@ -232,7 +232,7 @@ public class JingleUtil { public Jingle createSessionTerminateContentCancel(FullJid recipient, String sessionId, JingleContent.Creator contentCreator, String contentName) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setAction(JingleAction.session_terminate) .setSessionId(sessionId); @@ -314,7 +314,7 @@ public class JingleUtil { } public Jingle createSessionPing(FullJid recipient, String sessionId) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setSessionId(sessionId) .setAction(JingleAction.session_info); @@ -343,7 +343,7 @@ public class JingleUtil { public Jingle createTransportReplace(FullJid recipient, FullJid initiator, String sessionId, JingleContent.Creator contentCreator, String contentName, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setInitiator(initiator) .setSessionId(sessionId) .setAction(JingleAction.transport_replace); @@ -370,7 +370,7 @@ public class JingleUtil { public Jingle createTransportAccept(FullJid recipient, FullJid initiator, String sessionId, JingleContent.Creator contentCreator, String contentName, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setAction(JingleAction.transport_accept) .setInitiator(initiator) .setSessionId(sessionId); @@ -397,7 +397,7 @@ public class JingleUtil { public Jingle createTransportReject(FullJid recipient, FullJid initiator, String sessionId, JingleContent.Creator contentCreator, String contentName, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setAction(JingleAction.transport_reject) .setInitiator(initiator) .setSessionId(sessionId); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/Jingle.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/Jingle.java index 40acf187a..7598d1894 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/Jingle.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/Jingle.java @@ -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"); * 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.List; +import org.jivesoftware.smack.XMPPConnection; 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.StringUtils; @@ -65,9 +69,9 @@ public final class Jingle extends IQ { private final List 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 contents) { - super(ELEMENT, NAMESPACE); + super(builder, ELEMENT, NAMESPACE); this.sessionId = StringUtils.requireNotNullNorEmpty(sessionId, "Jingle session ID must not be null"); this.action = Objects.requireNonNull(action, "Jingle action must not be null"); this.initiator = initiator; @@ -169,11 +173,31 @@ public final class Jingle extends IQ { 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() { - 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 { private String sid; private JingleAction action; @@ -186,7 +210,16 @@ public final class Jingle extends IQ { private List contents; - private Builder() { + Builder(IqData iqCommon) { + super(iqCommon); + } + + Builder(XMPPConnection connection) { + super(connection); + } + + Builder(String stanzaId) { + super(stanzaId); } public Builder setSessionId(String sessionId) { @@ -228,8 +261,14 @@ public final class Jingle extends IQ { return this; } + @Override 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; } } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java index bfc085f60..ab5680c1d 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java @@ -145,6 +145,11 @@ public final class JingleContent implements XmlElement { xml.optAttribute(DISPOSITION_ATTRIBUTE_NAME, disposition); xml.attribute(NAME_ATTRIBUTE_NAME, name); xml.optAttribute(SENDERS_ATTRIBUTE_NAME, senders); + + if (description == null && transport == null) { + return xml.closeEmptyElement(); + } + xml.rightAngleBracket(); xml.optAppend(description); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/provider/JingleProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/provider/JingleProvider.java index 8ff1e269b..f6c352a75 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/provider/JingleProvider.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/provider/JingleProvider.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017-2019 Florian Schmaus + * Copyright 2017-2021 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (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.util.logging.Logger; +import org.jivesoftware.smack.packet.IqData; import org.jivesoftware.smack.packet.StandardExtensionElement; import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.parsing.SmackParsingException; 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.xml.XmlPullParser; import org.jivesoftware.smack.xml.XmlPullParserException; @@ -40,13 +41,13 @@ import org.jivesoftware.smackx.jingle.element.UnknownJingleContentTransport; import org.jxmpp.jid.FullJid; -public class JingleProvider extends IQProvider { +public class JingleProvider extends IqProvider { private static final Logger LOGGER = Logger.getLogger(JingleProvider.class.getName()); @Override - public Jingle parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException { - Jingle.Builder builder = Jingle.getBuilder(); + public Jingle parse(XmlPullParser parser, int initialDepth, IqData iqData, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException { + Jingle.Builder builder = Jingle.builder(iqData); String actionString = parser.getAttributeValue("", Jingle.ACTION_ATTRIBUTE_NAME); if (actionString != null) { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/JingleTransportManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/JingleTransportManager.java index 5b348c5d3..8c91c8976 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/JingleTransportManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/JingleTransportManager.java @@ -36,6 +36,10 @@ public abstract class JingleTransportManager i } public XMPPConnection getConnection() { + return connection(); + } + + public XMPPConnection connection() { return connection; } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/JingleS5BTransportManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/JingleS5BTransportManager.java index 06accc144..8211820fe 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/JingleS5BTransportManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/JingleS5BTransportManager.java @@ -148,7 +148,7 @@ public final class JingleS5BTransportManager extends JingleTransportManager" + - ""; + ""; assertEquals(xml, content1.toXML().toString()); } } diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleTest.java index c8ac6c926..2f8147947 100644 --- a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleTest.java +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleTest.java @@ -38,7 +38,7 @@ public class JingleTest extends SmackTestSuite { @Test public void emptyBuilderTest() { - Jingle.Builder builder = Jingle.getBuilder(); + Jingle.Builder builder = Jingle.builder("id"); assertThrows(IllegalArgumentException.class, () -> { builder.build(); }); @@ -48,7 +48,7 @@ public class JingleTest extends SmackTestSuite { public void onlySessionIdBuilderTest() { String sessionId = "testSessionId"; - Jingle.Builder builder = Jingle.getBuilder(); + Jingle.Builder builder = Jingle.builder("id"); builder.setSessionId(sessionId); assertThrows(IllegalArgumentException.class, () -> { builder.build(); @@ -59,7 +59,7 @@ public class JingleTest extends SmackTestSuite { public void parserTest() throws XmppStringprepException { String sessionId = "testSessionId"; - Jingle.Builder builder = Jingle.getBuilder(); + Jingle.Builder builder = Jingle.builder("id"); builder.setSessionId(sessionId); builder.setAction(JingleAction.session_initiate); diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/element/JingleTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/element/JingleTest.java new file mode 100644 index 000000000..ae198617f --- /dev/null +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/element/JingleTest.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2021 Florian Schmaus + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jingle.element; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.jivesoftware.smack.packet.StreamOpen; + +import org.junit.jupiter.api.Test; + +public class JingleTest { + + @Test + public void noRedundantNamespaceTest() { + Jingle.Builder jingleBuilder = Jingle.builder("test-id"); + jingleBuilder.setSessionId("MySession"); + jingleBuilder.setAction(JingleAction.content_accept); + + JingleContent.Builder jingleContentBuilder = JingleContent.getBuilder(); + jingleContentBuilder.setName("Hello world"); + jingleContentBuilder.setCreator(JingleContent.Creator.initiator); + + jingleBuilder.addJingleContent(jingleContentBuilder.build()); + Jingle iq = jingleBuilder.build(); + + String actualXml = iq.toXML(StreamOpen.CLIENT_NAMESPACE).toString(); + String expectedXml + = "" + + "" + + "" + + ""; + assertEquals(expectedXml, actualXml); + } +} diff --git a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomInvitation.java b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomInvitation.java index 65e004de2..712c4fb8c 100644 --- a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomInvitation.java +++ b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomInvitation.java @@ -118,7 +118,7 @@ public class RoomInvitation implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this)); + XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this, enclosingNamespace)); xml.closeElement(this); return xml; } diff --git a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomTransfer.java b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomTransfer.java index 2d6d95c58..726af6f65 100644 --- a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomTransfer.java +++ b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomTransfer.java @@ -113,7 +113,7 @@ public class RoomTransfer implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this)); + XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this, enclosingNamespace)); xml.closeElement(this); return xml; } diff --git a/smack-xmlparser-stax/build.gradle b/smack-xmlparser-stax/build.gradle index 66cf94388..b25ce2e9a 100644 --- a/smack-xmlparser-stax/build.gradle +++ b/smack-xmlparser-stax/build.gradle @@ -1,3 +1,8 @@ +// Note that this is also declared in the main build.gradle for +// subprojects, but since evaluationDependsOnChildren is enabled we +// need to declare it here too to have bundle{bnd{...}} available +apply plugin: 'biz.aQute.bnd.builder' + description = """\ Smack XML parser using Stax.""" @@ -5,3 +10,13 @@ dependencies { api project(':smack-xmlparser') //testCompile project(path: ":smack-xmlparser", configuration: "testRuntime") } + +jar { + bundle { + bnd( + // see http://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.loader.html + 'Require-Capability': 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"', + 'Provide-Capability': "osgi.serviceloader;osgi.serviceloader=org.jivesoftware.smack.xml.XmlPullParserFactory;register:=org.jivesoftware.smack.xml.stax.StaxXmlPullParserFactory", + ) + } +} diff --git a/smack-xmlparser-xpp3/build.gradle b/smack-xmlparser-xpp3/build.gradle index a0afd7c4a..f0a9f56c6 100644 --- a/smack-xmlparser-xpp3/build.gradle +++ b/smack-xmlparser-xpp3/build.gradle @@ -1,3 +1,8 @@ +// Note that this is also declared in the main build.gradle for +// subprojects, but since evaluationDependsOnChildren is enabled we +// need to declare it here too to have bundle{bnd{...}} available +apply plugin: 'biz.aQute.bnd.builder' + description = """\ Smack XML parser using XPP3.""" @@ -11,3 +16,13 @@ dependencies { api project(':smack-xmlparser') //testCompile project(path: ":smack-xmlparser", configuration: "testRuntime") } + +jar { + bundle { + bnd( + // see http://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.loader.html + 'Require-Capability': 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"', + 'Provide-Capability': "osgi.serviceloader;osgi.serviceloader=org.jivesoftware.smack.xml.XmlPullParserFactory;register:=org.jivesoftware.smack.xml.xpp3.Xpp3XmlPullParserFactory", + ) + } +} diff --git a/smack-xmlparser/build.gradle b/smack-xmlparser/build.gradle index 46318a504..513a2b153 100644 --- a/smack-xmlparser/build.gradle +++ b/smack-xmlparser/build.gradle @@ -1,2 +1,16 @@ +// Note that this is also declared in the main build.gradle for +// subprojects, but since evaluationDependsOnChildren is enabled we +// need to declare it here too to have bundle{bnd{...}} available +apply plugin: 'biz.aQute.bnd.builder' + description = """\ Smack XML parser fundamentals""" + +jar { + bundle { + bnd( + // see http://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.loader.html + 'Require-Capability': 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)"', + ) + } +}