mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-22 06:12:05 +01:00
Replace 'key' with QName
This commit is contained in:
parent
7c6d1f4340
commit
49f4de0cdb
5 changed files with 54 additions and 53 deletions
|
@ -65,6 +65,7 @@ import javax.net.ssl.X509TrustManager;
|
||||||
import javax.security.auth.callback.Callback;
|
import javax.security.auth.callback.Callback;
|
||||||
import javax.security.auth.callback.CallbackHandler;
|
import javax.security.auth.callback.CallbackHandler;
|
||||||
import javax.security.auth.callback.PasswordCallback;
|
import javax.security.auth.callback.PasswordCallback;
|
||||||
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
import org.jivesoftware.smack.ConnectionConfiguration.DnssecMode;
|
import org.jivesoftware.smack.ConnectionConfiguration.DnssecMode;
|
||||||
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
|
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
|
||||||
|
@ -234,7 +235,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
|
||||||
|
|
||||||
private XmlEnvironment incomingStreamXmlEnvironment;
|
private XmlEnvironment incomingStreamXmlEnvironment;
|
||||||
|
|
||||||
final Map<String, NonzaCallback> nonzaCallbacks = new HashMap<>();
|
final Map<QName, NonzaCallback> nonzaCallbacks = new HashMap<>();
|
||||||
|
|
||||||
protected final Lock connectionLock = new ReentrantLock();
|
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 {
|
protected final void parseAndProcessNonza(XmlPullParser parser) throws IOException, XmlPullParserException, SmackParsingException {
|
||||||
final String element = parser.getName();
|
final String element = parser.getName();
|
||||||
final String namespace = parser.getNamespace();
|
final String namespace = parser.getNamespace();
|
||||||
final String key = XmppStringUtils.generateKey(element, namespace);
|
final QName key = new QName(namespace, element);
|
||||||
|
|
||||||
NonzaProvider<? extends Nonza> nonzaProvider = ProviderManager.getNonzaProvider(key);
|
NonzaProvider<? extends Nonza> nonzaProvider = ProviderManager.getNonzaProvider(key);
|
||||||
if (nonzaProvider == null) {
|
if (nonzaProvider == null) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2018 Florian Schmaus
|
* Copyright 2018-2019 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,18 +19,18 @@ package org.jivesoftware.smack;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
import org.jivesoftware.smack.SmackException.NoResponseException;
|
import org.jivesoftware.smack.SmackException.NoResponseException;
|
||||||
import org.jivesoftware.smack.SmackException.NotConnectedException;
|
import org.jivesoftware.smack.SmackException.NotConnectedException;
|
||||||
import org.jivesoftware.smack.XMPPException.FailedNonzaException;
|
import org.jivesoftware.smack.XMPPException.FailedNonzaException;
|
||||||
import org.jivesoftware.smack.packet.Nonza;
|
import org.jivesoftware.smack.packet.Nonza;
|
||||||
import org.jivesoftware.smack.util.XmppElementUtil;
|
import org.jivesoftware.smack.util.XmppElementUtil;
|
||||||
|
|
||||||
import org.jxmpp.util.XmppStringUtils;
|
|
||||||
|
|
||||||
public class NonzaCallback {
|
public class NonzaCallback {
|
||||||
|
|
||||||
protected final AbstractXMPPConnection connection;
|
protected final AbstractXMPPConnection connection;
|
||||||
protected final Map<String, GenericElementListener<? extends Nonza>> filterAndListeners;
|
protected final Map<QName, GenericElementListener<? extends Nonza>> filterAndListeners;
|
||||||
|
|
||||||
private NonzaCallback(Builder builder) {
|
private NonzaCallback(Builder builder) {
|
||||||
this.connection = builder.connection;
|
this.connection = builder.connection;
|
||||||
|
@ -39,7 +39,7 @@ public class NonzaCallback {
|
||||||
}
|
}
|
||||||
|
|
||||||
void onNonzaReceived(Nonza nonza) {
|
void onNonzaReceived(Nonza nonza) {
|
||||||
String key = XmppStringUtils.generateKey(nonza.getElementName(), nonza.getNamespace());
|
QName key = nonza.getQName();
|
||||||
GenericElementListener<? extends Nonza> nonzaListener = filterAndListeners.get(key);
|
GenericElementListener<? extends Nonza> nonzaListener = filterAndListeners.get(key);
|
||||||
|
|
||||||
nonzaListener.processElement(nonza);
|
nonzaListener.processElement(nonza);
|
||||||
|
@ -47,8 +47,8 @@ public class NonzaCallback {
|
||||||
|
|
||||||
public void cancel() {
|
public void cancel() {
|
||||||
synchronized (connection.nonzaCallbacks) {
|
synchronized (connection.nonzaCallbacks) {
|
||||||
for (Map.Entry<String, GenericElementListener<? extends Nonza>> entry : filterAndListeners.entrySet()) {
|
for (Map.Entry<QName, GenericElementListener<? extends Nonza>> entry : filterAndListeners.entrySet()) {
|
||||||
String filterKey = entry.getKey();
|
QName filterKey = entry.getKey();
|
||||||
NonzaCallback installedCallback = connection.nonzaCallbacks.get(filterKey);
|
NonzaCallback installedCallback = connection.nonzaCallbacks.get(filterKey);
|
||||||
if (equals(installedCallback)) {
|
if (equals(installedCallback)) {
|
||||||
connection.nonzaCallbacks.remove(filterKey);
|
connection.nonzaCallbacks.remove(filterKey);
|
||||||
|
@ -63,7 +63,7 @@ public class NonzaCallback {
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized (connection.nonzaCallbacks) {
|
synchronized (connection.nonzaCallbacks) {
|
||||||
for (String key : filterAndListeners.keySet()) {
|
for (QName key : filterAndListeners.keySet()) {
|
||||||
connection.nonzaCallbacks.put(key, this);
|
connection.nonzaCallbacks.put(key, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,8 +78,8 @@ public class NonzaCallback {
|
||||||
Builder builder) {
|
Builder builder) {
|
||||||
super(builder);
|
super(builder);
|
||||||
|
|
||||||
final String successNonzaKey = XmppElementUtil.getKeyFor(successNonzaClass);
|
final QName successNonzaKey = XmppElementUtil.getQNameFor(successNonzaClass);
|
||||||
final String failedNonzaKey = XmppElementUtil.getKeyFor(failedNonzaClass);
|
final QName failedNonzaKey = XmppElementUtil.getQNameFor(failedNonzaClass);
|
||||||
|
|
||||||
final GenericElementListener<SN> successListener = new GenericElementListener<SN>(successNonzaClass) {
|
final GenericElementListener<SN> successListener = new GenericElementListener<SN>(successNonzaClass) {
|
||||||
@Override
|
@Override
|
||||||
|
@ -139,14 +139,14 @@ public class NonzaCallback {
|
||||||
public static final class Builder {
|
public static final class Builder {
|
||||||
private final AbstractXMPPConnection connection;
|
private final AbstractXMPPConnection connection;
|
||||||
|
|
||||||
private Map<String, GenericElementListener<? extends Nonza>> filterAndListeners = new HashMap<>();
|
private Map<QName, GenericElementListener<? extends Nonza>> filterAndListeners = new HashMap<>();
|
||||||
|
|
||||||
Builder(AbstractXMPPConnection connection) {
|
Builder(AbstractXMPPConnection connection) {
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <N extends Nonza> Builder listenFor(Class<? extends N> nonza, GenericElementListener<? extends N> nonzaListener) {
|
public <N extends Nonza> Builder listenFor(Class<? extends N> nonza, GenericElementListener<? extends N> nonzaListener) {
|
||||||
String key = XmppElementUtil.getKeyFor(nonza);
|
QName key = XmppElementUtil.getQNameFor(nonza);
|
||||||
filterAndListeners.put(key, nonzaListener);
|
filterAndListeners.put(key, nonzaListener);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2018 Florian Schmaus
|
* Copyright 2018-2019 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.
|
||||||
|
@ -16,6 +16,8 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smack.packet;
|
package org.jivesoftware.smack.packet;
|
||||||
|
|
||||||
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
public interface FullyQualifiedElement extends NamedElement {
|
public interface FullyQualifiedElement extends NamedElement {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -25,4 +27,9 @@ public interface FullyQualifiedElement extends NamedElement {
|
||||||
*/
|
*/
|
||||||
String getNamespace();
|
String getNamespace();
|
||||||
|
|
||||||
|
default QName getQName() {
|
||||||
|
String namespaceURI = getNamespace();
|
||||||
|
String localPart = getElementName();
|
||||||
|
return new QName(namespaceURI, localPart);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
import org.jivesoftware.smack.SmackConfiguration;
|
import org.jivesoftware.smack.SmackConfiguration;
|
||||||
import org.jivesoftware.smack.packet.ExtensionElement;
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
import org.jivesoftware.smack.packet.IQ;
|
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.StringUtils;
|
||||||
import org.jivesoftware.smack.util.XmppElementUtil;
|
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
|
* Manages providers for parsing custom XML sub-documents of XMPP packets. Two types of
|
||||||
* providers exist:<ul>
|
* providers exist:<ul>
|
||||||
|
@ -112,10 +112,10 @@ import org.jxmpp.util.XmppStringUtils;
|
||||||
*/
|
*/
|
||||||
public final class ProviderManager {
|
public final class ProviderManager {
|
||||||
|
|
||||||
private static final Map<String, ExtensionElementProvider<ExtensionElement>> extensionProviders = new ConcurrentHashMap<String, ExtensionElementProvider<ExtensionElement>>();
|
private static final Map<QName, ExtensionElementProvider<ExtensionElement>> extensionProviders = new ConcurrentHashMap<>();
|
||||||
private static final Map<String, IQProvider<IQ>> iqProviders = new ConcurrentHashMap<String, IQProvider<IQ>>();
|
private static final Map<QName, IQProvider<IQ>> iqProviders = new ConcurrentHashMap<>();
|
||||||
private static final Map<String, ExtensionElementProvider<ExtensionElement>> streamFeatureProviders = new ConcurrentHashMap<String, ExtensionElementProvider<ExtensionElement>>();
|
private static final Map<QName, ExtensionElementProvider<ExtensionElement>> streamFeatureProviders = new ConcurrentHashMap<>();
|
||||||
private static final Map<String, NonzaProvider<? extends Nonza>> nonzaProviders = new ConcurrentHashMap<>();
|
private static final Map<QName, NonzaProvider<? extends Nonza>> nonzaProviders = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// Ensure that Smack is initialized by calling getVersion, so that user
|
// Ensure that Smack is initialized by calling getVersion, so that user
|
||||||
|
@ -168,7 +168,7 @@ public final class ProviderManager {
|
||||||
* @return the IQ provider.
|
* @return the IQ provider.
|
||||||
*/
|
*/
|
||||||
public static IQProvider<IQ> getIQProvider(String elementName, String namespace) {
|
public static IQProvider<IQ> getIQProvider(String elementName, String namespace) {
|
||||||
String key = getKey(elementName, namespace);
|
QName key = getQName(elementName, namespace);
|
||||||
return iqProviders.get(key);
|
return iqProviders.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ public final class ProviderManager {
|
||||||
Object provider) {
|
Object provider) {
|
||||||
validate(elementName, namespace);
|
validate(elementName, namespace);
|
||||||
// First remove existing providers
|
// First remove existing providers
|
||||||
String key = removeIQProvider(elementName, namespace);
|
QName key = removeIQProvider(elementName, namespace);
|
||||||
if (provider instanceof IQProvider) {
|
if (provider instanceof IQProvider) {
|
||||||
iqProviders.put(key, (IQProvider<IQ>) provider);
|
iqProviders.put(key, (IQProvider<IQ>) provider);
|
||||||
} else {
|
} else {
|
||||||
|
@ -214,10 +214,10 @@ public final class ProviderManager {
|
||||||
*
|
*
|
||||||
* @param elementName the XML element name.
|
* @param elementName the XML element name.
|
||||||
* @param namespace the XML namespace.
|
* @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) {
|
public static QName removeIQProvider(String elementName, String namespace) {
|
||||||
String key = getKey(elementName, namespace);
|
QName key = getQName(elementName, namespace);
|
||||||
iqProviders.remove(key);
|
iqProviders.remove(key);
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ public final class ProviderManager {
|
||||||
* @return the extension provider.
|
* @return the extension provider.
|
||||||
*/
|
*/
|
||||||
public static ExtensionElementProvider<ExtensionElement> getExtensionProvider(String elementName, String namespace) {
|
public static ExtensionElementProvider<ExtensionElement> getExtensionProvider(String elementName, String namespace) {
|
||||||
String key = getKey(elementName, namespace);
|
QName key = getQName(elementName, namespace);
|
||||||
return extensionProviders.get(key);
|
return extensionProviders.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,7 +260,7 @@ public final class ProviderManager {
|
||||||
Object provider) {
|
Object provider) {
|
||||||
validate(elementName, namespace);
|
validate(elementName, namespace);
|
||||||
// First remove existing providers
|
// First remove existing providers
|
||||||
String key = removeExtensionProvider(elementName, namespace);
|
QName key = removeExtensionProvider(elementName, namespace);
|
||||||
if (provider instanceof ExtensionElementProvider) {
|
if (provider instanceof ExtensionElementProvider) {
|
||||||
extensionProviders.put(key, (ExtensionElementProvider<ExtensionElement>) provider);
|
extensionProviders.put(key, (ExtensionElementProvider<ExtensionElement>) provider);
|
||||||
} else {
|
} else {
|
||||||
|
@ -275,10 +275,10 @@ public final class ProviderManager {
|
||||||
*
|
*
|
||||||
* @param elementName the XML element name.
|
* @param elementName the XML element name.
|
||||||
* @param namespace the XML namespace.
|
* @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) {
|
public static QName removeExtensionProvider(String elementName, String namespace) {
|
||||||
String key = getKey(elementName, namespace);
|
QName key = getQName(elementName, namespace);
|
||||||
extensionProviders.remove(key);
|
extensionProviders.remove(key);
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
@ -297,48 +297,48 @@ public final class ProviderManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ExtensionElementProvider<ExtensionElement> getStreamFeatureProvider(String elementName, String namespace) {
|
public static ExtensionElementProvider<ExtensionElement> getStreamFeatureProvider(String elementName, String namespace) {
|
||||||
String key = getKey(elementName, namespace);
|
QName key = getQName(elementName, namespace);
|
||||||
return streamFeatureProviders.get(key);
|
return streamFeatureProviders.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addStreamFeatureProvider(String elementName, String namespace, ExtensionElementProvider<ExtensionElement> provider) {
|
public static void addStreamFeatureProvider(String elementName, String namespace, ExtensionElementProvider<ExtensionElement> provider) {
|
||||||
validate(elementName, namespace);
|
validate(elementName, namespace);
|
||||||
String key = getKey(elementName, namespace);
|
QName key = getQName(elementName, namespace);
|
||||||
streamFeatureProviders.put(key, provider);
|
streamFeatureProviders.put(key, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void removeStreamFeatureProvider(String elementName, String namespace) {
|
public static void removeStreamFeatureProvider(String elementName, String namespace) {
|
||||||
String key = getKey(elementName, namespace);
|
QName key = getQName(elementName, namespace);
|
||||||
streamFeatureProviders.remove(key);
|
streamFeatureProviders.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NonzaProvider<? extends Nonza> getNonzaProvider(String elementName, String namespace) {
|
public static NonzaProvider<? extends Nonza> getNonzaProvider(String elementName, String namespace) {
|
||||||
String key = getKey(elementName, namespace);
|
QName key = getQName(elementName, namespace);
|
||||||
return getNonzaProvider(key);
|
return getNonzaProvider(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NonzaProvider<? extends Nonza> getNonzaProvider(String key) {
|
public static NonzaProvider<? extends Nonza> getNonzaProvider(QName key) {
|
||||||
return nonzaProviders.get(key);
|
return nonzaProviders.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addNonzaProvider(NonzaProvider<? extends Nonza> nonzaProvider) {
|
public static void addNonzaProvider(NonzaProvider<? extends Nonza> nonzaProvider) {
|
||||||
Class<? extends Nonza> nonzaClass = nonzaProvider.getElementClass();
|
Class<? extends Nonza> nonzaClass = nonzaProvider.getElementClass();
|
||||||
String key = XmppElementUtil.getKeyFor(nonzaClass);
|
QName key = XmppElementUtil.getQNameFor(nonzaClass);
|
||||||
nonzaProviders.put(key, nonzaProvider);
|
nonzaProviders.put(key, nonzaProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void removeNonzaProvider(Class<? extends Nonza> nonzaClass) {
|
public static void removeNonzaProvider(Class<? extends Nonza> nonzaClass) {
|
||||||
String key = XmppElementUtil.getKeyFor(nonzaClass);
|
QName key = XmppElementUtil.getQNameFor(nonzaClass);
|
||||||
nonzaProviders.remove(key);
|
nonzaProviders.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void removeNonzaProvider(String elementName, String namespace) {
|
public static void removeNonzaProvider(String elementName, String namespace) {
|
||||||
String key = getKey(elementName, namespace);
|
QName key = getQName(elementName, namespace);
|
||||||
nonzaProviders.remove(key);
|
nonzaProviders.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getKey(String elementName, String namespace) {
|
private static QName getQName(String elementName, String namespace) {
|
||||||
return XmppStringUtils.generateKey(elementName, namespace);
|
return new QName(namespace, elementName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void validate(String elementName, String namespace) {
|
private static void validate(String elementName, String namespace) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2018 Florian Schmaus
|
* Copyright 2018-2019 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.
|
||||||
|
@ -16,13 +16,13 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smack.util;
|
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 class XmppElementUtil {
|
||||||
|
|
||||||
public static String getKeyFor(Class<? extends FullyQualifiedElement> fullyQualifiedElement) {
|
public static QName getQNameFor(Class<? extends FullyQualifiedElement> fullyQualifiedElement) {
|
||||||
String element, namespace;
|
String element, namespace;
|
||||||
try {
|
try {
|
||||||
element = (String) fullyQualifiedElement.getField("ELEMENT").get(null);
|
element = (String) fullyQualifiedElement.getField("ELEMENT").get(null);
|
||||||
|
@ -32,14 +32,7 @@ public class XmppElementUtil {
|
||||||
throw new IllegalArgumentException(e);
|
throw new IllegalArgumentException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
String key = XmppStringUtils.generateKey(element, namespace);
|
return new QName(namespace, element);
|
||||||
return key;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getKeyFor(FullyQualifiedElement fullyQualifiedElement) {
|
|
||||||
String element = fullyQualifiedElement.getElementName();
|
|
||||||
String namespace = fullyQualifiedElement.getNamespace();
|
|
||||||
String key = XmppStringUtils.generateKey(element, namespace);
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue