mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-22 22:32:06 +01:00
Improve getMultipleRecipientServiceAddress
and MultipleRecipient (XEP-33) related code in general (e.g. use constants where possible). For getMultipleRecipientServiceAddress() this means that - the "synchronized (services)" block is removed - ServiceDiscoveryManager is only retrieved once
This commit is contained in:
parent
0680553ef7
commit
36a86f2dfc
2 changed files with 39 additions and 36 deletions
|
@ -22,7 +22,6 @@ import org.jivesoftware.smack.SmackException.NoResponseException;
|
||||||
import org.jivesoftware.smack.SmackException.FeatureNotSupportedException;
|
import org.jivesoftware.smack.SmackException.FeatureNotSupportedException;
|
||||||
import org.jivesoftware.smack.SmackException.NotConnectedException;
|
import org.jivesoftware.smack.SmackException.NotConnectedException;
|
||||||
import org.jivesoftware.smack.XMPPConnection;
|
import org.jivesoftware.smack.XMPPConnection;
|
||||||
import org.jivesoftware.smack.XMPPException;
|
|
||||||
import org.jivesoftware.smack.XMPPException.XMPPErrorException;
|
import org.jivesoftware.smack.XMPPException.XMPPErrorException;
|
||||||
import org.jivesoftware.smack.packet.Message;
|
import org.jivesoftware.smack.packet.Message;
|
||||||
import org.jivesoftware.smack.packet.Packet;
|
import org.jivesoftware.smack.packet.Packet;
|
||||||
|
@ -36,6 +35,8 @@ import org.jivesoftware.smackx.disco.packet.DiscoverItems;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A MultipleRecipientManager allows to send packets to multiple recipients by making use of
|
* A MultipleRecipientManager allows to send packets to multiple recipients by making use of
|
||||||
|
@ -46,6 +47,8 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public class MultipleRecipientManager {
|
public class MultipleRecipientManager {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(MultipleRecipientManager.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a cache to hold the 100 most recently accessed elements for a period of
|
* Create a cache to hold the 100 most recently accessed elements for a period of
|
||||||
* 24 hours.
|
* 24 hours.
|
||||||
|
@ -205,7 +208,7 @@ public class MultipleRecipientManager {
|
||||||
*/
|
*/
|
||||||
public static MultipleRecipientInfo getMultipleRecipientInfo(Packet packet) {
|
public static MultipleRecipientInfo getMultipleRecipientInfo(Packet packet) {
|
||||||
MultipleAddresses extension = (MultipleAddresses) packet
|
MultipleAddresses extension = (MultipleAddresses) packet
|
||||||
.getExtension("addresses", "http://jabber.org/protocol/address");
|
.getExtension(MultipleAddresses.ELEMENT, MultipleAddresses.NAMESPACE);
|
||||||
return extension == null ? null : new MultipleRecipientInfo(extension);
|
return extension == null ? null : new MultipleRecipientInfo(extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,40 +298,37 @@ public class MultipleRecipientManager {
|
||||||
String serviceName = connection.getServiceName();
|
String serviceName = connection.getServiceName();
|
||||||
String serviceAddress = (String) services.get(serviceName);
|
String serviceAddress = (String) services.get(serviceName);
|
||||||
if (serviceAddress == null) {
|
if (serviceAddress == null) {
|
||||||
synchronized (services) {
|
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);
|
||||||
serviceAddress = (String) services.get(serviceName);
|
|
||||||
if (serviceAddress == null) {
|
|
||||||
|
|
||||||
// Send the disco packet to the server itself
|
// Send the disco packet to the server itself
|
||||||
DiscoverInfo info = ServiceDiscoveryManager.getInstanceFor(connection).discoverInfo(
|
DiscoverInfo info = sdm.discoverInfo(serviceName);
|
||||||
serviceName);
|
// Check if the server supports XEP-33
|
||||||
// Check if the server supports JEP-33
|
if (info.containsFeature(MultipleAddresses.NAMESPACE)) {
|
||||||
if (info.containsFeature("http://jabber.org/protocol/address")) {
|
|
||||||
serviceAddress = serviceName;
|
serviceAddress = serviceName;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Get the disco items and send the disco packet to each server item
|
// Get the disco items and send the disco packet to each server item
|
||||||
DiscoverItems items = ServiceDiscoveryManager.getInstanceFor(connection).discoverItems(
|
DiscoverItems items = sdm.discoverItems(serviceName);
|
||||||
serviceName);
|
|
||||||
for (DiscoverItems.Item item : items.getItems()) {
|
for (DiscoverItems.Item item : items.getItems()) {
|
||||||
try {
|
try {
|
||||||
info = ServiceDiscoveryManager.getInstanceFor(connection).discoverInfo(
|
info = sdm.discoverInfo(item.getEntityID(), item.getNode());
|
||||||
item.getEntityID(), item.getNode());
|
|
||||||
}
|
}
|
||||||
catch (XMPPErrorException|NoResponseException e) {
|
catch (XMPPErrorException|NoResponseException e) {
|
||||||
// Don't throw this exceptions if one of the server's items fail
|
// Don't throw this exceptions if one of the server's items fail
|
||||||
|
LOGGER.log(Level.WARNING,
|
||||||
|
"Exception while discovering info of " + item.getEntityID()
|
||||||
|
+ " node: " + item.getNode(), e);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (info.containsFeature("http://jabber.org/protocol/address")) {
|
if (info.containsFeature(MultipleAddresses.NAMESPACE)) {
|
||||||
serviceAddress = serviceName;
|
serviceAddress = serviceName;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Use the empty string to indicate that no service is known for this connection
|
||||||
|
serviceAddress = serviceAddress == null ? "" : serviceAddress;
|
||||||
// Cache the discovered information
|
// Cache the discovered information
|
||||||
services.put(serviceName, serviceAddress == null ? "" : serviceAddress);
|
services.put(serviceName, serviceAddress);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return "".equals(serviceAddress) ? null : serviceAddress;
|
return "".equals(serviceAddress) ? null : serviceAddress;
|
||||||
|
|
|
@ -30,6 +30,9 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public class MultipleAddresses implements PacketExtension {
|
public class MultipleAddresses implements PacketExtension {
|
||||||
|
|
||||||
|
public static final String NAMESPACE = "http://jabber.org/protocol/address";
|
||||||
|
public static final String ELEMENT = "addresses";
|
||||||
|
|
||||||
public static final String BCC = "bcc";
|
public static final String BCC = "bcc";
|
||||||
public static final String CC = "cc";
|
public static final String CC = "cc";
|
||||||
public static final String NO_REPLY = "noreply";
|
public static final String NO_REPLY = "noreply";
|
||||||
|
@ -94,17 +97,17 @@ public class MultipleAddresses implements PacketExtension {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getElementName() {
|
public String getElementName() {
|
||||||
return "addresses";
|
return ELEMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getNamespace() {
|
public String getNamespace() {
|
||||||
return "http://jabber.org/protocol/address";
|
return NAMESPACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toXML() {
|
public String toXML() {
|
||||||
StringBuilder buf = new StringBuilder();
|
StringBuilder buf = new StringBuilder();
|
||||||
buf.append("<").append(getElementName());
|
buf.append("<").append(getElementName());
|
||||||
buf.append(" xmlns=\"").append(getNamespace()).append("\">");
|
buf.append(" xmlns=\"").append(NAMESPACE).append("\">");
|
||||||
// Loop through all the addresses and append them to the string buffer
|
// Loop through all the addresses and append them to the string buffer
|
||||||
for (Iterator<Address> i = addresses.iterator(); i.hasNext();) {
|
for (Iterator<Address> i = addresses.iterator(); i.hasNext();) {
|
||||||
Address address = (Address) i.next();
|
Address address = (Address) i.next();
|
||||||
|
|
Loading…
Reference in a new issue