1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2024-11-22 22:32:06 +01:00

Improve VCard API

move API out of VCard into VCardManager. Mark old methods as deprecated.
This commit is contained in:
Florian Schmaus 2015-01-17 11:38:15 +01:00
parent 2ea469be10
commit c36ffd18c2
2 changed files with 100 additions and 39 deletions

View file

@ -16,27 +16,51 @@
*/ */
package org.jivesoftware.smackx.vcardtemp; package org.jivesoftware.smackx.vcardtemp;
import java.util.Map;
import java.util.WeakHashMap;
import org.jivesoftware.smack.ConnectionCreationListener; import org.jivesoftware.smack.ConnectionCreationListener;
import org.jivesoftware.smack.Manager;
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.XMPPConnection; import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPConnectionRegistry; import org.jivesoftware.smack.XMPPConnectionRegistry;
import org.jivesoftware.smack.XMPPException.XMPPErrorException; import org.jivesoftware.smack.XMPPException.XMPPErrorException;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
import org.jivesoftware.smackx.vcardtemp.packet.VCard;
public class VCardManager { public class VCardManager extends Manager {
public static final String NAMESPACE = "vcard-temp"; public static final String NAMESPACE = VCard.NAMESPACE;
public static final String ELEMENT = "vCard"; public static final String ELEMENT = VCard.ELEMENT;
private static final Map<XMPPConnection, VCardManager> INSTANCES = new WeakHashMap<>();
static { static {
XMPPConnectionRegistry.addConnectionCreationListener(new ConnectionCreationListener() { XMPPConnectionRegistry.addConnectionCreationListener(new ConnectionCreationListener() {
@Override @Override
public void connectionCreated(XMPPConnection connection) { public void connectionCreated(XMPPConnection connection) {
ServiceDiscoveryManager.getInstanceFor(connection).addFeature(NAMESPACE); getInstanceFor(connection);
} }
}); });
} }
/**
* Retrieves a {@link VCardManager} for the specified {@link XMPPConnection}, creating one if it doesn't already
* exist.
*
* @param connection the connection the manager is attached to.
* @return The new or existing manager.
*/
public static synchronized VCardManager getInstanceFor(XMPPConnection connection) {
VCardManager vcardManager = INSTANCES.get(connection);
if (vcardManager == null) {
vcardManager = new VCardManager(connection);
INSTANCES.put(connection, vcardManager);
}
return vcardManager;
}
/** /**
* Returns true if the given entity understands the vCard-XML format and allows the exchange of such. * Returns true if the given entity understands the vCard-XML format and allows the exchange of such.
* *
@ -46,8 +70,66 @@ public class VCardManager {
* @throws XMPPErrorException * @throws XMPPErrorException
* @throws NoResponseException * @throws NoResponseException
* @throws NotConnectedException * @throws NotConnectedException
* @deprecated use {@link #isSupported(String)} instead.
*/ */
@Deprecated
public static boolean isSupported(String jid, XMPPConnection connection) throws NoResponseException, XMPPErrorException, NotConnectedException { public static boolean isSupported(String jid, XMPPConnection connection) throws NoResponseException, XMPPErrorException, NotConnectedException {
return ServiceDiscoveryManager.getInstanceFor(connection).supportsFeature(jid, NAMESPACE); return VCardManager.getInstanceFor(connection).isSupported(jid);
}
private VCardManager(XMPPConnection connection) {
super(connection);
ServiceDiscoveryManager.getInstanceFor(connection).addFeature(NAMESPACE);
}
/**
* Save this vCard for the user connected by 'connection'. XMPPConnection should be authenticated
* and not anonymous.
*
* @throws XMPPErrorException thrown if there was an issue setting the VCard in the server.
* @throws NoResponseException if there was no response from the server.
* @throws NotConnectedException
*/
public void saveVCard(VCard vcard) throws NoResponseException, XMPPErrorException, NotConnectedException {
vcard.setType(IQ.Type.set);
connection().createPacketCollectorAndSend(vcard).nextResultOrThrow();
}
/**
* Load the VCard of the current user.
*
* @throws XMPPErrorException
* @throws NoResponseException
* @throws NotConnectedException
*/
public VCard loadVCard() throws NoResponseException, XMPPErrorException, NotConnectedException {
return loadVCard(null);
}
/**
* Load VCard information for a given user.
*
* @throws XMPPErrorException
* @throws NoResponseException if there was no response from the server.
* @throws NotConnectedException
*/
public VCard loadVCard(String bareJid) throws NoResponseException, XMPPErrorException, NotConnectedException {
VCard vcardRequest = new VCard();
vcardRequest.setTo(bareJid);
VCard result = connection().createPacketCollectorAndSend(vcardRequest).nextResultOrThrow();
return result;
}
/**
* Returns true if the given entity understands the vCard-XML format and allows the exchange of such.
*
* @param jid
* @return true if the given entity understands the vCard-XML format and exchange.
* @throws XMPPErrorException
* @throws NoResponseException
* @throws NotConnectedException
*/
public boolean isSupported(String jid) throws NoResponseException, XMPPErrorException, NotConnectedException {
return ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature(jid, NAMESPACE);
} }
} }

View file

@ -39,6 +39,7 @@ import org.jivesoftware.smack.XMPPException.XMPPErrorException;
import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smack.util.stringencoder.Base64; import org.jivesoftware.smack.util.stringencoder.Base64;
import org.jivesoftware.smackx.vcardtemp.VCardManager;
/** /**
* A VCard class for use with the * A VCard class for use with the
@ -398,6 +399,7 @@ public class VCard extends IQ {
* @param encodedAvatar the encoded avatar string. * @param encodedAvatar the encoded avatar string.
* @deprecated Use {@link #setAvatar(String, String)} instead. * @deprecated Use {@link #setAvatar(String, String)} instead.
*/ */
@Deprecated
public void setEncodedImage(String encodedAvatar) { public void setEncodedImage(String encodedAvatar) {
setAvatar(encodedAvatar, DEFAULT_MIME_TYPE); setAvatar(encodedAvatar, DEFAULT_MIME_TYPE);
} }
@ -515,21 +517,17 @@ public class VCard extends IQ {
/** /**
* Save this vCard for the user connected by 'connection'. XMPPConnection should be authenticated * Save this vCard for the user connected by 'connection'. XMPPConnection should be authenticated
* and not anonymous.<p> * and not anonymous.
* <p/>
* NOTE: the method is asynchronous and does not wait for the returned value.
* *
* @param connection the XMPPConnection to use. * @param connection the XMPPConnection to use.
* @throws XMPPErrorException thrown if there was an issue setting the VCard in the server. * @throws XMPPErrorException thrown if there was an issue setting the VCard in the server.
* @throws NoResponseException if there was no response from the server. * @throws NoResponseException if there was no response from the server.
* @throws NotConnectedException * @throws NotConnectedException
* @deprecated use {@link VCardManager#saveVCard(VCard)} instead.
*/ */
@Deprecated
public void save(XMPPConnection connection) throws NoResponseException, XMPPErrorException, NotConnectedException { public void save(XMPPConnection connection) throws NoResponseException, XMPPErrorException, NotConnectedException {
checkAuthenticated(connection, true); VCardManager.getInstanceFor(connection).saveVCard(this);
setType(IQ.Type.set);
setFrom(connection.getUser());
connection.createPacketCollectorAndSend(this).nextResultOrThrow();
} }
/** /**
@ -538,12 +536,11 @@ public class VCard extends IQ {
* @throws XMPPErrorException * @throws XMPPErrorException
* @throws NoResponseException * @throws NoResponseException
* @throws NotConnectedException * @throws NotConnectedException
* @deprecated use {@link VCardManager#loadVCard()} instead.
*/ */
@Deprecated
public void load(XMPPConnection connection) throws NoResponseException, XMPPErrorException, NotConnectedException { public void load(XMPPConnection connection) throws NoResponseException, XMPPErrorException, NotConnectedException {
checkAuthenticated(connection, true); load(connection, null);
setFrom(connection.getUser());
doLoad(connection, connection.getUser());
} }
/** /**
@ -551,17 +548,11 @@ public class VCard extends IQ {
* @throws XMPPErrorException * @throws XMPPErrorException
* @throws NoResponseException if there was no response from the server. * @throws NoResponseException if there was no response from the server.
* @throws NotConnectedException * @throws NotConnectedException
* @deprecated use {@link VCardManager#loadVCard(String)} instead.
*/ */
@Deprecated
public void load(XMPPConnection connection, String user) throws NoResponseException, XMPPErrorException, NotConnectedException { public void load(XMPPConnection connection, String user) throws NoResponseException, XMPPErrorException, NotConnectedException {
checkAuthenticated(connection, false); VCard result = VCardManager.getInstanceFor(connection).loadVCard(user);
setTo(user);
doLoad(connection, user);
}
private void doLoad(XMPPConnection connection, String user) throws NoResponseException, XMPPErrorException, NotConnectedException {
setType(Type.get);
VCard result = (VCard) connection.createPacketCollectorAndSend(this).nextResultOrThrow();
copyFieldsFrom(result); copyFieldsFrom(result);
} }
@ -664,18 +655,6 @@ public class VCard extends IQ {
} }
} }
private void checkAuthenticated(XMPPConnection connection, boolean checkForAnonymous) {
if (connection == null) {
throw new IllegalArgumentException("No connection was provided");
}
if (!connection.isAuthenticated()) {
throw new IllegalArgumentException("XMPPConnection is not authenticated");
}
if (checkForAnonymous && connection.isAnonymous()) {
throw new IllegalArgumentException("XMPPConnection cannot be anonymous");
}
}
private boolean hasContent() { private boolean hasContent() {
//noinspection OverlyComplexBooleanExpression //noinspection OverlyComplexBooleanExpression
return hasNameField() return hasNameField()