From 49f4de0cdb5e4313e546e7f1a80a93001f13bd2b Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Wed, 8 May 2019 21:10:39 +0200 Subject: [PATCH] Replace 'key' with QName --- .../smack/AbstractXMPPConnection.java | 5 +- .../org/jivesoftware/smack/NonzaCallback.java | 24 ++++----- .../smack/packet/FullyQualifiedElement.java | 9 +++- .../smack/provider/ProviderManager.java | 52 +++++++++---------- .../smack/util/XmppElementUtil.java | 17 ++---- 5 files changed, 54 insertions(+), 53 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 423b42917..825cdbada 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java @@ -65,6 +65,7 @@ import javax.net.ssl.X509TrustManager; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.PasswordCallback; +import javax.xml.namespace.QName; import org.jivesoftware.smack.ConnectionConfiguration.DnssecMode; import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode; @@ -234,7 +235,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { private XmlEnvironment incomingStreamXmlEnvironment; - final Map nonzaCallbacks = new HashMap<>(); + final Map nonzaCallbacks = new HashMap<>(); protected final Lock connectionLock = new ReentrantLock(); @@ -1214,7 +1215,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { protected final void parseAndProcessNonza(XmlPullParser parser) throws IOException, XmlPullParserException, SmackParsingException { final String element = parser.getName(); final String namespace = parser.getNamespace(); - final String key = XmppStringUtils.generateKey(element, namespace); + final QName key = new QName(namespace, element); NonzaProvider nonzaProvider = ProviderManager.getNonzaProvider(key); if (nonzaProvider == null) { diff --git a/smack-core/src/main/java/org/jivesoftware/smack/NonzaCallback.java b/smack-core/src/main/java/org/jivesoftware/smack/NonzaCallback.java index acc776533..3bdd04bfb 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/NonzaCallback.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/NonzaCallback.java @@ -1,6 +1,6 @@ /** * - * Copyright 2018 Florian Schmaus + * Copyright 2018-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,18 +19,18 @@ package org.jivesoftware.smack; import java.util.HashMap; import java.util.Map; +import javax.xml.namespace.QName; + import org.jivesoftware.smack.SmackException.NoResponseException; import org.jivesoftware.smack.SmackException.NotConnectedException; import org.jivesoftware.smack.XMPPException.FailedNonzaException; import org.jivesoftware.smack.packet.Nonza; import org.jivesoftware.smack.util.XmppElementUtil; -import org.jxmpp.util.XmppStringUtils; - public class NonzaCallback { protected final AbstractXMPPConnection connection; - protected final Map> filterAndListeners; + protected final Map> filterAndListeners; private NonzaCallback(Builder builder) { this.connection = builder.connection; @@ -39,7 +39,7 @@ public class NonzaCallback { } void onNonzaReceived(Nonza nonza) { - String key = XmppStringUtils.generateKey(nonza.getElementName(), nonza.getNamespace()); + QName key = nonza.getQName(); GenericElementListener nonzaListener = filterAndListeners.get(key); nonzaListener.processElement(nonza); @@ -47,8 +47,8 @@ public class NonzaCallback { public void cancel() { synchronized (connection.nonzaCallbacks) { - for (Map.Entry> entry : filterAndListeners.entrySet()) { - String filterKey = entry.getKey(); + for (Map.Entry> entry : filterAndListeners.entrySet()) { + QName filterKey = entry.getKey(); NonzaCallback installedCallback = connection.nonzaCallbacks.get(filterKey); if (equals(installedCallback)) { connection.nonzaCallbacks.remove(filterKey); @@ -63,7 +63,7 @@ public class NonzaCallback { } synchronized (connection.nonzaCallbacks) { - for (String key : filterAndListeners.keySet()) { + for (QName key : filterAndListeners.keySet()) { connection.nonzaCallbacks.put(key, this); } } @@ -78,8 +78,8 @@ public class NonzaCallback { Builder builder) { super(builder); - final String successNonzaKey = XmppElementUtil.getKeyFor(successNonzaClass); - final String failedNonzaKey = XmppElementUtil.getKeyFor(failedNonzaClass); + final QName successNonzaKey = XmppElementUtil.getQNameFor(successNonzaClass); + final QName failedNonzaKey = XmppElementUtil.getQNameFor(failedNonzaClass); final GenericElementListener successListener = new GenericElementListener(successNonzaClass) { @Override @@ -139,14 +139,14 @@ public class NonzaCallback { public static final class Builder { private final AbstractXMPPConnection connection; - private Map> filterAndListeners = new HashMap<>(); + private Map> filterAndListeners = new HashMap<>(); Builder(AbstractXMPPConnection connection) { this.connection = connection; } public Builder listenFor(Class nonza, GenericElementListener nonzaListener) { - String key = XmppElementUtil.getKeyFor(nonza); + QName key = XmppElementUtil.getQNameFor(nonza); filterAndListeners.put(key, nonzaListener); return this; } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/FullyQualifiedElement.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/FullyQualifiedElement.java index 37e1b425a..1ed979548 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/FullyQualifiedElement.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/FullyQualifiedElement.java @@ -1,6 +1,6 @@ /** * - * Copyright 2018 Florian Schmaus + * Copyright 2018-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.packet; +import javax.xml.namespace.QName; + public interface FullyQualifiedElement extends NamedElement { /** @@ -25,4 +27,9 @@ public interface FullyQualifiedElement extends NamedElement { */ String getNamespace(); + default QName getQName() { + String namespaceURI = getNamespace(); + String localPart = getElementName(); + return new QName(namespaceURI, localPart); + } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderManager.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderManager.java index b2da1392f..377e6e47b 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderManager.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderManager.java @@ -22,6 +22,8 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import javax.xml.namespace.QName; + import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.packet.IQ; @@ -29,8 +31,6 @@ import org.jivesoftware.smack.packet.Nonza; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.util.XmppElementUtil; -import org.jxmpp.util.XmppStringUtils; - /** * Manages providers for parsing custom XML sub-documents of XMPP packets. Two types of * providers exist:
    @@ -112,10 +112,10 @@ import org.jxmpp.util.XmppStringUtils; */ public final class ProviderManager { - private static final Map> extensionProviders = new ConcurrentHashMap>(); - private static final Map> iqProviders = new ConcurrentHashMap>(); - private static final Map> streamFeatureProviders = new ConcurrentHashMap>(); - private static final Map> nonzaProviders = new ConcurrentHashMap<>(); + private static final Map> extensionProviders = new ConcurrentHashMap<>(); + private static final Map> iqProviders = new ConcurrentHashMap<>(); + private static final Map> streamFeatureProviders = new ConcurrentHashMap<>(); + private static final Map> nonzaProviders = new ConcurrentHashMap<>(); static { // Ensure that Smack is initialized by calling getVersion, so that user @@ -168,7 +168,7 @@ public final class ProviderManager { * @return the IQ provider. */ public static IQProvider getIQProvider(String elementName, String namespace) { - String key = getKey(elementName, namespace); + QName key = getQName(elementName, namespace); return iqProviders.get(key); } @@ -199,7 +199,7 @@ public final class ProviderManager { Object provider) { validate(elementName, namespace); // First remove existing providers - String key = removeIQProvider(elementName, namespace); + QName key = removeIQProvider(elementName, namespace); if (provider instanceof IQProvider) { iqProviders.put(key, (IQProvider) provider); } else { @@ -214,10 +214,10 @@ public final class ProviderManager { * * @param elementName the XML element name. * @param namespace the XML namespace. - * @return the key of the removed IQ Provider + * @return the QName of the removed provider */ - public static String removeIQProvider(String elementName, String namespace) { - String key = getKey(elementName, namespace); + public static QName removeIQProvider(String elementName, String namespace) { + QName key = getQName(elementName, namespace); iqProviders.remove(key); return key; } @@ -242,7 +242,7 @@ public final class ProviderManager { * @return the extension provider. */ public static ExtensionElementProvider getExtensionProvider(String elementName, String namespace) { - String key = getKey(elementName, namespace); + QName key = getQName(elementName, namespace); return extensionProviders.get(key); } @@ -260,7 +260,7 @@ public final class ProviderManager { Object provider) { validate(elementName, namespace); // First remove existing providers - String key = removeExtensionProvider(elementName, namespace); + QName key = removeExtensionProvider(elementName, namespace); if (provider instanceof ExtensionElementProvider) { extensionProviders.put(key, (ExtensionElementProvider) provider); } else { @@ -275,10 +275,10 @@ public final class ProviderManager { * * @param elementName the XML element name. * @param namespace the XML namespace. - * @return the key of the removed stanza extension provider + * @return the QName of the removed stanza extension provider */ - public static String removeExtensionProvider(String elementName, String namespace) { - String key = getKey(elementName, namespace); + public static QName removeExtensionProvider(String elementName, String namespace) { + QName key = getQName(elementName, namespace); extensionProviders.remove(key); return key; } @@ -297,48 +297,48 @@ public final class ProviderManager { } public static ExtensionElementProvider getStreamFeatureProvider(String elementName, String namespace) { - String key = getKey(elementName, namespace); + QName key = getQName(elementName, namespace); return streamFeatureProviders.get(key); } public static void addStreamFeatureProvider(String elementName, String namespace, ExtensionElementProvider provider) { validate(elementName, namespace); - String key = getKey(elementName, namespace); + QName key = getQName(elementName, namespace); streamFeatureProviders.put(key, provider); } public static void removeStreamFeatureProvider(String elementName, String namespace) { - String key = getKey(elementName, namespace); + QName key = getQName(elementName, namespace); streamFeatureProviders.remove(key); } public static NonzaProvider getNonzaProvider(String elementName, String namespace) { - String key = getKey(elementName, namespace); + QName key = getQName(elementName, namespace); return getNonzaProvider(key); } - public static NonzaProvider getNonzaProvider(String key) { + public static NonzaProvider getNonzaProvider(QName key) { return nonzaProviders.get(key); } public static void addNonzaProvider(NonzaProvider nonzaProvider) { Class nonzaClass = nonzaProvider.getElementClass(); - String key = XmppElementUtil.getKeyFor(nonzaClass); + QName key = XmppElementUtil.getQNameFor(nonzaClass); nonzaProviders.put(key, nonzaProvider); } public static void removeNonzaProvider(Class nonzaClass) { - String key = XmppElementUtil.getKeyFor(nonzaClass); + QName key = XmppElementUtil.getQNameFor(nonzaClass); nonzaProviders.remove(key); } public static void removeNonzaProvider(String elementName, String namespace) { - String key = getKey(elementName, namespace); + QName key = getQName(elementName, namespace); nonzaProviders.remove(key); } - private static String getKey(String elementName, String namespace) { - return XmppStringUtils.generateKey(elementName, namespace); + private static QName getQName(String elementName, String namespace) { + return new QName(namespace, elementName); } private static void validate(String elementName, String namespace) { diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/XmppElementUtil.java b/smack-core/src/main/java/org/jivesoftware/smack/util/XmppElementUtil.java index 79729b662..caabf8e89 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/XmppElementUtil.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/XmppElementUtil.java @@ -1,6 +1,6 @@ /** * - * Copyright 2018 Florian Schmaus + * Copyright 2018-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,13 +16,13 @@ */ package org.jivesoftware.smack.util; -import org.jivesoftware.smack.packet.FullyQualifiedElement; +import javax.xml.namespace.QName; -import org.jxmpp.util.XmppStringUtils; +import org.jivesoftware.smack.packet.FullyQualifiedElement; public class XmppElementUtil { - public static String getKeyFor(Class fullyQualifiedElement) { + public static QName getQNameFor(Class fullyQualifiedElement) { String element, namespace; try { element = (String) fullyQualifiedElement.getField("ELEMENT").get(null); @@ -32,14 +32,7 @@ public class XmppElementUtil { throw new IllegalArgumentException(e); } - String key = XmppStringUtils.generateKey(element, namespace); - return key; + return new QName(namespace, element); } - public static String getKeyFor(FullyQualifiedElement fullyQualifiedElement) { - String element = fullyQualifiedElement.getElementName(); - String namespace = fullyQualifiedElement.getNamespace(); - String key = XmppStringUtils.generateKey(element, namespace); - return key; - } }