From 6e1193edafc320e6fb94203fdddde80e377d07ef Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 11 Jun 2019 00:10:38 +0200 Subject: [PATCH] Use QName instead of XmppStringUtils.generateKey() --- .../smack/AbstractXMPPConnection.java | 17 ++++--- .../smack/iqrequest/IQRequestHandler.java | 8 ++- .../org/jivesoftware/smack/packet/IQ.java | 13 +++++ .../packet/StandardExtensionElement.java | 21 ++++---- .../org/jivesoftware/smack/packet/Stanza.java | 49 ++++++++++--------- .../org/jivesoftware/smack/packet/TestIQ.java | 4 +- .../smackx/iqprivate/PrivateDataManager.java | 14 +++--- .../ox/element/OpenPgpContentElement.java | 15 +++--- 8 files changed, 80 insertions(+), 61 deletions(-) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java index 41890d14f..853d39e38 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java @@ -239,7 +239,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { protected final Lock connectionLock = new ReentrantLock(); - protected final Map streamFeatures = new HashMap<>(); + protected final Map streamFeatures = new HashMap<>(); /** * The full JID of the authenticated user, as returned by the resource binding response of the server. @@ -389,8 +389,8 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { protected Exception currentConnectionException; - private final Map setIqRequestHandler = new HashMap<>(); - private final Map getIqRequestHandler = new HashMap<>(); + private final Map setIqRequestHandler = new HashMap<>(); + private final Map getIqRequestHandler = new HashMap<>(); /** * Create a new XMPPConnection to an XMPP server. @@ -1303,7 +1303,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { final IQ iq = (IQ) packet; if (iq.isRequestIQ()) { final IQ iqRequest = iq; - final String key = XmppStringUtils.generateKey(iq.getChildElementName(), iq.getChildElementNamespace()); + final QName key = iqRequest.getChildElementQName(); IQRequestHandler iqRequestHandler; final IQ.Type type = iq.getType(); switch (type) { @@ -1694,7 +1694,8 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { @SuppressWarnings("unchecked") @Override public F getFeature(String element, String namespace) { - return (F) streamFeatures.get(XmppStringUtils.generateKey(element, namespace)); + QName qname = new QName(namespace, element); + return (F) streamFeatures.get(qname); } @Override @@ -1703,7 +1704,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { } protected void addStreamFeature(FullyQualifiedElement feature) { - String key = XmppStringUtils.generateKey(feature.getElementName(), feature.getNamespace()); + QName key = feature.getQName(); streamFeatures.put(key, feature); } @@ -1812,7 +1813,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { @Override public IQRequestHandler registerIQRequestHandler(final IQRequestHandler iqRequestHandler) { - final String key = XmppStringUtils.generateKey(iqRequestHandler.getElement(), iqRequestHandler.getNamespace()); + final QName key = iqRequestHandler.getQName(); switch (iqRequestHandler.getType()) { case set: synchronized (setIqRequestHandler) { @@ -1835,7 +1836,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { @Override public IQRequestHandler unregisterIQRequestHandler(String element, String namespace, IQ.Type type) { - final String key = XmppStringUtils.generateKey(element, namespace); + final QName key = new QName(namespace, element); switch (type) { case set: synchronized (setIqRequestHandler) { diff --git a/smack-core/src/main/java/org/jivesoftware/smack/iqrequest/IQRequestHandler.java b/smack-core/src/main/java/org/jivesoftware/smack/iqrequest/IQRequestHandler.java index 9e3d9729c..1162ef755 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/iqrequest/IQRequestHandler.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/iqrequest/IQRequestHandler.java @@ -1,6 +1,6 @@ /** * - * Copyright 2015 Florian Schmaus + * Copyright 2015-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ */ package org.jivesoftware.smack.iqrequest; +import javax.xml.namespace.QName; + import org.jivesoftware.smack.packet.IQ; /** @@ -50,4 +52,8 @@ public interface IQRequestHandler { String getElement(); String getNamespace(); + + default QName getQName() { + return new QName(getNamespace(), getElement()); + } } 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 9b15c9c95..322890fa7 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 @@ -20,6 +20,8 @@ package org.jivesoftware.smack.packet; import java.util.List; import java.util.Locale; +import javax.xml.namespace.QName; + import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.XmlStringBuilder; @@ -46,6 +48,7 @@ public abstract class IQ extends Stanza { public static final String IQ_ELEMENT = "iq"; public static final String QUERY_ELEMENT = "query"; + private final QName childElementQName; private final String childElementName; private final String childElementNamespace; @@ -56,6 +59,7 @@ public abstract class IQ extends Stanza { type = iq.getType(); this.childElementName = iq.childElementName; this.childElementNamespace = iq.childElementNamespace; + this.childElementQName = iq.childElementQName; } protected IQ(String childElementName) { @@ -65,6 +69,11 @@ public abstract class IQ extends Stanza { protected IQ(String childElementName, String childElementNamespace) { this.childElementName = childElementName; this.childElementNamespace = childElementNamespace; + if (childElementName == null) { + childElementQName = null; + } else { + childElementQName = new QName(childElementNamespace, childElementName); + } } /** @@ -115,6 +124,10 @@ public abstract class IQ extends Stanza { return !isRequestIQ(); } + public final QName getChildElementQName() { + return childElementQName; + } + public final String getChildElementName() { return childElementName; } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/StandardExtensionElement.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/StandardExtensionElement.java index 74d598bc6..fd7229b84 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/StandardExtensionElement.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/StandardExtensionElement.java @@ -1,6 +1,6 @@ /** * - * Copyright 2015 Florian Schmaus. + * Copyright 2015-2019 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,13 +21,13 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import javax.xml.namespace.QName; + import org.jivesoftware.smack.util.MultiMap; import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.util.XmlStringBuilder; -import org.jxmpp.util.XmppStringUtils; - /** * An {@link ExtensionElement} modeling the often required and used XML features when using XMPP. It * is therefore suitable for most use cases. Use @@ -47,7 +47,7 @@ public final class StandardExtensionElement implements ExtensionElement { private final String namespace; private final Map attributes; private final String text; - private final MultiMap elements; + private final MultiMap elements; private XmlStringBuilder xmlCache; @@ -65,7 +65,7 @@ public final class StandardExtensionElement implements ExtensionElement { } private StandardExtensionElement(String name, String namespace, Map attributes, String text, - MultiMap elements) { + MultiMap elements) { this.name = StringUtils.requireNotNullNorEmpty(name, "Name must not be null nor empty"); this.namespace = StringUtils.requireNotNullNorEmpty(namespace, "Namespace must not be null nor empty"); if (attributes == null) { @@ -100,7 +100,7 @@ public final class StandardExtensionElement implements ExtensionElement { if (elements == null) { return null; } - String key = XmppStringUtils.generateKey(element, namespace); + QName key = new QName(namespace, element); return elements.getFirst(key); } @@ -112,7 +112,7 @@ public final class StandardExtensionElement implements ExtensionElement { if (elements == null) { return null; } - String key = XmppStringUtils.generateKey(element, namespace); + QName key = new QName(namespace, element); return elements.getAll(key); } @@ -145,7 +145,7 @@ public final class StandardExtensionElement implements ExtensionElement { xml.optEscape(text); if (elements != null) { - for (Map.Entry entry : elements.entrySet()) { + for (Map.Entry entry : elements.entrySet()) { xml.append(entry.getValue().toXML(getNamespace())); } } @@ -165,7 +165,7 @@ public final class StandardExtensionElement implements ExtensionElement { private Map attributes; private String text; - private MultiMap elements; + private MultiMap elements; private Builder(String name, String namespace) { this.name = name; @@ -200,7 +200,8 @@ public final class StandardExtensionElement implements ExtensionElement { if (elements == null) { elements = new MultiMap<>(); } - String key = XmppStringUtils.generateKey(element.getElementName(), element.getNamespace()); + + QName key = element.getQName(); elements.put(key, element); return this; } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/Stanza.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/Stanza.java index ef737f9ee..f40f5ba22 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/Stanza.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/Stanza.java @@ -23,6 +23,8 @@ import java.util.Collection; import java.util.List; import java.util.Locale; +import javax.xml.namespace.QName; + import org.jivesoftware.smack.packet.id.StanzaIdUtil; import org.jivesoftware.smack.util.MultiMap; import org.jivesoftware.smack.util.PacketUtil; @@ -31,7 +33,6 @@ import org.jivesoftware.smack.util.XmlStringBuilder; import org.jxmpp.jid.Jid; import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.stringprep.XmppStringprepException; -import org.jxmpp.util.XmppStringUtils; /** * Base class for XMPP Stanzas, which are called Stanza in older versions of Smack (i.e. < 4.1). @@ -56,7 +57,7 @@ public abstract class Stanza implements TopLevelStreamElement { protected static final String DEFAULT_LANGUAGE = java.util.Locale.getDefault().getLanguage().toLowerCase(Locale.US); - private final MultiMap packetExtensions = new MultiMap<>(); + private final MultiMap extensionElements = new MultiMap<>(); private String id = null; private Jid to; @@ -306,9 +307,9 @@ public abstract class Stanza implements TopLevelStreamElement { * @return a list of all extension elements of this stanza. */ public List getExtensions() { - synchronized (packetExtensions) { + synchronized (extensionElements) { // No need to create a new list, values() will already create a new one for us - return packetExtensions.values(); + return extensionElements.values(); } } @@ -326,8 +327,8 @@ public abstract class Stanza implements TopLevelStreamElement { public List getExtensions(String elementName, String namespace) { requireNotNullNorEmpty(elementName, "elementName must not be null nor empty"); requireNotNullNorEmpty(namespace, "namespace must not be null nor empty"); - String key = XmppStringUtils.generateKey(elementName, namespace); - return packetExtensions.getAll(key); + QName key = new QName(namespace, elementName); + return extensionElements.getAll(key); } /** @@ -359,10 +360,10 @@ public abstract class Stanza implements TopLevelStreamElement { if (namespace == null) { return null; } - String key = XmppStringUtils.generateKey(elementName, namespace); + QName key = new QName(namespace, elementName); ExtensionElement packetExtension; - synchronized (packetExtensions) { - packetExtension = packetExtensions.getFirst(key); + synchronized (extensionElements) { + packetExtension = extensionElements.getFirst(key); } if (packetExtension == null) { return null; @@ -377,9 +378,9 @@ public abstract class Stanza implements TopLevelStreamElement { */ public void addExtension(ExtensionElement extension) { if (extension == null) return; - String key = XmppStringUtils.generateKey(extension.getElementName(), extension.getNamespace()); - synchronized (packetExtensions) { - packetExtensions.put(key, extension); + QName key = extension.getQName(); + synchronized (extensionElements) { + extensionElements.put(key, extension); } } @@ -393,7 +394,7 @@ public abstract class Stanza implements TopLevelStreamElement { */ public ExtensionElement overrideExtension(ExtensionElement extension) { if (extension == null) return null; - synchronized (packetExtensions) { + synchronized (extensionElements) { // Note that we need to use removeExtension(String, String) here. If would use // removeExtension(ExtensionElement) then we would remove based on the equality of ExtensionElement, which // is not what we want in this case. @@ -429,9 +430,9 @@ public abstract class Stanza implements TopLevelStreamElement { if (elementName == null) { return hasExtension(namespace); } - String key = XmppStringUtils.generateKey(elementName, namespace); - synchronized (packetExtensions) { - return packetExtensions.containsKey(key); + QName key = new QName(namespace, elementName); + synchronized (extensionElements) { + return extensionElements.containsKey(key); } } @@ -442,8 +443,8 @@ public abstract class Stanza implements TopLevelStreamElement { * @return true if a stanza extension exists, false otherwise. */ public boolean hasExtension(String namespace) { - synchronized (packetExtensions) { - for (ExtensionElement packetExtension : packetExtensions.values()) { + synchronized (extensionElements) { + for (ExtensionElement packetExtension : extensionElements.values()) { if (packetExtension.getNamespace().equals(namespace)) { return true; } @@ -460,9 +461,9 @@ public abstract class Stanza implements TopLevelStreamElement { * @return the removed stanza extension or null. */ public ExtensionElement removeExtension(String elementName, String namespace) { - String key = XmppStringUtils.generateKey(elementName, namespace); - synchronized (packetExtensions) { - return packetExtensions.remove(key); + QName key = new QName(namespace, elementName); + synchronized (extensionElements) { + return extensionElements.remove(key); } } @@ -473,9 +474,9 @@ public abstract class Stanza implements TopLevelStreamElement { * @return the removed stanza extension or null. */ public ExtensionElement removeExtension(ExtensionElement extension) { - String key = XmppStringUtils.generateKey(extension.getElementName(), extension.getNamespace()); - synchronized (packetExtensions) { - List list = packetExtensions.getAll(key); + QName key = extension.getQName(); + synchronized (extensionElements) { + List list = extensionElements.getAll(key); boolean removed = list.remove(extension); if (removed) { return extension; diff --git a/smack-core/src/test/java/org/jivesoftware/smack/packet/TestIQ.java b/smack-core/src/test/java/org/jivesoftware/smack/packet/TestIQ.java index a9f203632..84aed089d 100644 --- a/smack-core/src/test/java/org/jivesoftware/smack/packet/TestIQ.java +++ b/smack-core/src/test/java/org/jivesoftware/smack/packet/TestIQ.java @@ -1,6 +1,6 @@ /** * - * Copyright © 2014 Florian Schmaus + * Copyright © 2014-2019 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,7 +19,7 @@ package org.jivesoftware.smack.packet; public class TestIQ extends SimpleIQ { public TestIQ() { - this(null, null); + this("https://igniterealtime.org/projects/smack", "test-iq"); } public TestIQ(String element, String namespace) { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/iqprivate/PrivateDataManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/iqprivate/PrivateDataManager.java index 13f8a48e6..a4a758e93 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/iqprivate/PrivateDataManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/iqprivate/PrivateDataManager.java @@ -18,10 +18,12 @@ package org.jivesoftware.smackx.iqprivate; import java.io.IOException; -import java.util.Hashtable; +import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; +import javax.xml.namespace.QName; + import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.SmackException.NoResponseException; import org.jivesoftware.smack.SmackException.NotConnectedException; @@ -39,8 +41,6 @@ import org.jivesoftware.smackx.iqprivate.packet.PrivateData; import org.jivesoftware.smackx.iqprivate.packet.PrivateDataIQ; import org.jivesoftware.smackx.iqprivate.provider.PrivateDataProvider; -import org.jxmpp.util.XmppStringUtils; - /** * Manages private data, which is a mechanism to allow users to store arbitrary XML * data on an XMPP server. Each private data chunk is defined by a element name and @@ -77,7 +77,7 @@ public final class PrivateDataManager extends Manager { /** * Map of provider instances. */ - private static final Map privateDataProviders = new Hashtable<>(); + private static final Map privateDataProviders = new HashMap<>(); /** * Returns the private data provider registered to the specified XML element name and namespace. @@ -102,7 +102,7 @@ public final class PrivateDataManager extends Manager { * @return the PrivateData provider. */ public static PrivateDataProvider getPrivateDataProvider(String elementName, String namespace) { - String key = XmppStringUtils.generateKey(elementName, namespace); + QName key = new QName(namespace, elementName); return privateDataProviders.get(key); } @@ -116,7 +116,7 @@ public final class PrivateDataManager extends Manager { */ public static void addPrivateDataProvider(String elementName, String namespace, PrivateDataProvider provider) { - String key = XmppStringUtils.generateKey(elementName, namespace); + QName key = new QName(namespace, elementName); privateDataProviders.put(key, provider); } @@ -127,7 +127,7 @@ public final class PrivateDataManager extends Manager { * @param namespace The XML namespace. */ public static void removePrivateDataProvider(String elementName, String namespace) { - String key = XmppStringUtils.generateKey(elementName, namespace); + QName key = new QName(namespace, elementName); privateDataProviders.remove(key); } diff --git a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/element/OpenPgpContentElement.java b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/element/OpenPgpContentElement.java index 98626ad7c..47c2295b6 100644 --- a/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/element/OpenPgpContentElement.java +++ b/smack-openpgp/src/main/java/org/jivesoftware/smackx/ox/element/OpenPgpContentElement.java @@ -16,8 +16,6 @@ */ package org.jivesoftware.smackx.ox.element; -import static org.jivesoftware.smack.util.StringUtils.requireNotNullNorEmpty; - import java.io.ByteArrayInputStream; import java.io.InputStream; import java.nio.charset.Charset; @@ -26,6 +24,8 @@ import java.util.Date; import java.util.List; import java.util.Set; +import javax.xml.namespace.QName; + import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.util.MultiMap; import org.jivesoftware.smack.util.Objects; @@ -34,7 +34,6 @@ import org.jivesoftware.smack.util.XmlStringBuilder; import org.jxmpp.jid.Jid; import org.jxmpp.util.XmppDateTime; -import org.jxmpp.util.XmppStringUtils; /** * This class describes an OpenPGP content element. It defines the elements and fields that OpenPGP content elements @@ -50,7 +49,7 @@ public abstract class OpenPgpContentElement implements ExtensionElement { private final Set to; private final Date timestamp; - private final MultiMap payload; + private final MultiMap payload; private String timestampString; @@ -59,7 +58,7 @@ public abstract class OpenPgpContentElement implements ExtensionElement { this.timestamp = Objects.requireNonNull(timestamp); this.payload = new MultiMap<>(); for (ExtensionElement e : payload) { - this.payload.put(XmppStringUtils.generateKey(e.getElementName(), e.getNamespace()), e); + this.payload.put(e.getQName(), e); } } @@ -104,9 +103,7 @@ public abstract class OpenPgpContentElement implements ExtensionElement { * @return a set of all matching extensions. */ public List getExtensions(String elementName, String namespace) { - requireNotNullNorEmpty(elementName, "elementName must not be null or empty"); - requireNotNullNorEmpty(namespace, "namespace must not be null or empty"); - String key = XmppStringUtils.generateKey(elementName, namespace); + QName key = new QName(namespace, elementName); return payload.getAll(key); } @@ -139,7 +136,7 @@ public abstract class OpenPgpContentElement implements ExtensionElement { if (namespace == null) { return null; } - String key = XmppStringUtils.generateKey(elementName, namespace); + QName key = new QName(namespace, elementName); ExtensionElement packetExtension; synchronized (payload) { packetExtension = payload.getFirst(key);