diff --git a/experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java b/experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java index 4152569dd..e6e135f12 100644 --- a/experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java +++ b/experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java @@ -16,13 +16,13 @@ */ package org.jivesoftware.smackx.carbons; -import java.lang.ref.WeakReference; import java.util.Collections; import java.util.Map; import java.util.WeakHashMap; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.ConnectionCreationListener; +import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.IQReplyFilter; @@ -31,7 +31,6 @@ import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smackx.carbons.packet.CarbonExtension; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; -import org.jivesoftware.smackx.disco.packet.DiscoverInfo; /** * Packet extension for XEP-0280: Message Carbons. This class implements @@ -43,7 +42,7 @@ import org.jivesoftware.smackx.disco.packet.DiscoverInfo; * * @author Georg Lukas */ -public class CarbonManager { +public class CarbonManager extends Manager { private static Map instances = Collections.synchronizedMap(new WeakHashMap()); @@ -56,13 +55,12 @@ public class CarbonManager { }); } - private WeakReference weakRefConnection; private volatile boolean enabled_state = false; private CarbonManager(Connection connection) { + super(connection); ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection); sdm.addFeature(CarbonExtension.NAMESPACE); - weakRefConnection = new WeakReference(connection); instances.put(connection, this); } @@ -99,11 +97,9 @@ public class CarbonManager { * @return true if supported */ public boolean isSupportedByServer() { - Connection connection = weakRefConnection.get(); try { - DiscoverInfo result = ServiceDiscoveryManager - .getInstanceFor(connection).discoverInfo(connection.getServiceName()); - return result.containsFeature(CarbonExtension.NAMESPACE); + return ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature( + connection().getServiceName(), CarbonExtension.NAMESPACE); } catch (XMPPException e) { return false; @@ -119,20 +115,19 @@ public class CarbonManager { * @param new_state whether carbons should be enabled or disabled */ public void sendCarbonsEnabled(final boolean new_state) { - final Connection connection = weakRefConnection.get(); IQ setIQ = carbonsEnabledIQ(new_state); - connection.addPacketListener(new PacketListener() { + connection().addPacketListener(new PacketListener() { public void processPacket(Packet packet) { IQ result = (IQ)packet; if (result.getType() == IQ.Type.RESULT) { enabled_state = new_state; } - connection.removePacketListener(this); + connection().removePacketListener(this); } - }, new IQReplyFilter(setIQ, connection)); + }, new IQReplyFilter(setIQ, connection())); - connection.sendPacket(setIQ); + connection().sendPacket(setIQ); } /** @@ -150,10 +145,9 @@ public class CarbonManager { public void setCarbonsEnabled(final boolean new_state) throws XMPPException { if (enabled_state == new_state) return; - Connection connection = weakRefConnection.get(); IQ setIQ = carbonsEnabledIQ(new_state); - connection.createPacketCollectorAndSend(setIQ).nextResultOrThrow(); + connection().createPacketCollectorAndSend(setIQ).nextResultOrThrow(); enabled_state = new_state; } diff --git a/extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java b/extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java index 7d632da60..1293962d1 100644 --- a/extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java +++ b/extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java @@ -1,6 +1,6 @@ /** * - * Copyright © 2009 Jonas Ådahl, 2011-2013 Florian Schmaus + * Copyright © 2009 Jonas Ådahl, 2011-2014 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,6 +19,7 @@ package org.jivesoftware.smackx.caps; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.ConnectionCreationListener; import org.jivesoftware.smack.ConnectionListener; +import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.PacketInterceptor; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.XMPPException; @@ -58,7 +59,6 @@ import java.util.TreeSet; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.io.IOException; -import java.lang.ref.WeakReference; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -67,7 +67,7 @@ import java.security.NoSuchAlgorithmException; * * @author Florian Schmaus */ -public class EntityCapsManager { +public class EntityCapsManager extends Manager { public static final String NAMESPACE = "http://jabber.org/protocol/caps"; public static final String ELEMENT = "c"; @@ -110,7 +110,6 @@ public class EntityCapsManager { } } - private WeakReference weakRefConnection; private ServiceDiscoveryManager sdm; private boolean entityCapsEnabled; private String currentCapsVersion; @@ -221,7 +220,7 @@ public class EntityCapsManager { } private EntityCapsManager(Connection connection) { - this.weakRefConnection = new WeakReference(connection); + super(connection); this.sdm = ServiceDiscoveryManager.getInstanceFor(connection); instances.put(connection, this); @@ -384,16 +383,8 @@ public class EntityCapsManager { * @param jid * @return */ - public boolean areEntityCapsSupported(String jid) { - if (jid == null) - return false; - - try { - DiscoverInfo result = sdm.discoverInfo(jid); - return result.containsFeature(NAMESPACE); - } catch (XMPPException e) { - return false; - } + public boolean areEntityCapsSupported(String jid) throws XMPPException { + return sdm.supportsFeature(jid, NAMESPACE); } /** @@ -401,8 +392,8 @@ public class EntityCapsManager { * * @return */ - public boolean areEntityCapsSupportedByServer() { - return areEntityCapsSupported(weakRefConnection.get().getServiceName()); + public boolean areEntityCapsSupportedByServer() throws XMPPException { + return areEntityCapsSupported(connection().getServiceName()); } /** @@ -422,7 +413,7 @@ public class EntityCapsManager { * the local users extended info */ public void updateLocalEntityCaps() { - Connection connection = weakRefConnection.get(); + Connection connection = connection(); DiscoverInfo discoverInfo = new DiscoverInfo(); discoverInfo.setType(IQ.Type.RESULT); diff --git a/extensions/src/main/java/org/jivesoftware/smackx/chatstates/ChatStateManager.java b/extensions/src/main/java/org/jivesoftware/smackx/chatstates/ChatStateManager.java index 47c37ae43..c4e4b94fd 100644 --- a/extensions/src/main/java/org/jivesoftware/smackx/chatstates/ChatStateManager.java +++ b/extensions/src/main/java/org/jivesoftware/smackx/chatstates/ChatStateManager.java @@ -17,13 +17,13 @@ package org.jivesoftware.smackx.chatstates; -import java.lang.ref.WeakReference; import java.util.Map; import java.util.WeakHashMap; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ChatManagerListener; import org.jivesoftware.smack.Connection; +import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.PacketInterceptor; import org.jivesoftware.smack.XMPPException; @@ -50,13 +50,13 @@ import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; * @see org.jivesoftware.smackx.chatstates.ChatState * @see org.jivesoftware.smackx.chatstates.packet.ChatStateExtension */ -public class ChatStateManager { +public class ChatStateManager extends Manager { + public static final String NAMESPACE = "http://jabber.org/protocol/chatstates"; - private static final Map> managers = - new WeakHashMap>(); + private static final Map INSTANCES = + new WeakHashMap(); - private static final PacketFilter filter = new NotFilter( - new PacketExtensionFilter("http://jabber.org/protocol/chatstates")); + private static final PacketFilter filter = new NotFilter(new PacketExtensionFilter(NAMESPACE)); /** * Returns the ChatStateManager related to the Connection and it will create one if it does @@ -65,28 +65,14 @@ public class ChatStateManager { * @param connection the connection to return the ChatStateManager * @return the ChatStateManager related the the connection. */ - public static ChatStateManager getInstance(final Connection connection) { - if(connection == null) { - return null; - } - synchronized (managers) { - ChatStateManager manager; - WeakReference ref = managers.get(connection); - - if (ref == null) { + public static synchronized ChatStateManager getInstance(final Connection connection) { + ChatStateManager manager = INSTANCES.get(connection); + if (manager == null) { manager = new ChatStateManager(connection); - manager.init(); - managers.put(connection, new WeakReference(manager)); } - else - manager = ref.get(); - return manager; - } } - private final Connection connection; - private final OutgoingMessageInterceptor outgoingInterceptor = new OutgoingMessageInterceptor(); private final IncomingMessageInterceptor incomingInterceptor = new IncomingMessageInterceptor(); @@ -98,18 +84,15 @@ public class ChatStateManager { new ReferenceMap(ReferenceMap.WEAK, ReferenceMap.HARD); private ChatStateManager(Connection connection) { - this.connection = connection; - } - - private void init() { - connection.getChatManager().addOutgoingMessageInterceptor(outgoingInterceptor, - filter); + super(connection); + connection.getChatManager().addOutgoingMessageInterceptor(outgoingInterceptor, filter); connection.getChatManager().addChatListener(incomingInterceptor); - ServiceDiscoveryManager.getInstanceFor(connection) - .addFeature("http://jabber.org/protocol/chatstates"); + ServiceDiscoveryManager.getInstanceFor(connection).addFeature(NAMESPACE); + INSTANCES.put(connection, this); } + /** * Sets the current state of the provided chat. This method will send an empty bodied Message * packet with the state attached as a {@link org.jivesoftware.smack.packet.PacketExtension}, if @@ -142,12 +125,12 @@ public class ChatStateManager { ChatStateManager that = (ChatStateManager) o; - return connection.equals(that.connection); + return connection().equals(that.connection()); } public int hashCode() { - return connection.hashCode(); + return connection().hashCode(); } private boolean updateChatState(Chat chat, ChatState newState) { @@ -171,7 +154,7 @@ public class ChatStateManager { public void interceptPacket(Packet packet) { Message message = (Message) packet; - Chat chat = connection.getChatManager().getThreadChat(message.getThread()); + Chat chat = connection().getChatManager().getThreadChat(message.getThread()); if (chat == null) { return; } @@ -188,8 +171,7 @@ public class ChatStateManager { } public void processMessage(Chat chat, Message message) { - PacketExtension extension - = message.getExtension("http://jabber.org/protocol/chatstates"); + PacketExtension extension = message.getExtension(NAMESPACE); if (extension == null) { return; } diff --git a/extensions/src/main/java/org/jivesoftware/smackx/commands/AdHocCommandManager.java b/extensions/src/main/java/org/jivesoftware/smackx/commands/AdHocCommandManager.java index e9e07f5fc..f8e3dda76 100755 --- a/extensions/src/main/java/org/jivesoftware/smackx/commands/AdHocCommandManager.java +++ b/extensions/src/main/java/org/jivesoftware/smackx/commands/AdHocCommandManager.java @@ -35,7 +35,6 @@ import org.jivesoftware.smackx.disco.packet.DiscoverItems; import org.jivesoftware.smackx.disco.packet.DiscoverInfo.Identity; import org.jivesoftware.smackx.xdata.Form; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -54,10 +53,8 @@ import java.util.concurrent.ConcurrentHashMap; * * @author Gabriel Guardincerri */ -public class AdHocCommandManager { - private static final String DISCO_NAMESPACE = "http://jabber.org/protocol/commands"; - - private static final String discoNode = DISCO_NAMESPACE; +public class AdHocCommandManager extends Manager { + public static final String NAMESPACE = "http://jabber.org/protocol/commands"; /** * The session time out in seconds. @@ -97,11 +94,6 @@ public class AdHocCommandManager { return ahcm; } - /** - * The Connection that this instances of AdHocCommandManager manages - */ - private final WeakReference connection; - /** * Map a command node with its AdHocCommandInfo. Note: Key=command node, * Value=command. Command node matches the node attribute sent by command @@ -125,7 +117,7 @@ public class AdHocCommandManager { private Thread sessionsSweeper; private AdHocCommandManager(Connection connection) { - this.connection = new WeakReference(connection); + super(connection); this.serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection); // Register the new instance and associate it with the connection @@ -136,13 +128,13 @@ public class AdHocCommandManager { // This information will be used when another client tries to // discover whether this client supports AdHoc-Commands or not. ServiceDiscoveryManager.getInstanceFor(connection).addFeature( - DISCO_NAMESPACE); + NAMESPACE); // Set the NodeInformationProvider that will provide information about // which AdHoc-Commands are registered, whenever a disco request is // received ServiceDiscoveryManager.getInstanceFor(connection) - .setNodeInformationProvider(discoNode, + .setNodeInformationProvider(NAMESPACE, new NodeInformationProvider() { public List getNodeItems() { @@ -221,7 +213,7 @@ public class AdHocCommandManager { * @param factory a factory to create new instances of the command. */ public void registerCommand(String node, final String name, LocalCommandFactory factory) { - AdHocCommandInfo commandInfo = new AdHocCommandInfo(node, name, connection.get().getUser(), factory); + AdHocCommandInfo commandInfo = new AdHocCommandInfo(node, name, connection().getUser(), factory); commands.put(node, commandInfo); // Set the NodeInformationProvider that will provide information about @@ -234,7 +226,7 @@ public class AdHocCommandManager { public List getNodeFeatures() { List answer = new ArrayList(); - answer.add(DISCO_NAMESPACE); + answer.add(NAMESPACE); // TODO: check if this service is provided by the // TODO: current connection. answer.add("jabber:x:data"); @@ -266,7 +258,7 @@ public class AdHocCommandManager { * @throws XMPPException if the operation failed for some reason. */ public DiscoverItems discoverCommands(String jid) throws XMPPException { - return serviceDiscoveryManager.discoverItems(jid, discoNode); + return serviceDiscoveryManager.discoverItems(jid, NAMESPACE); } /** @@ -287,7 +279,7 @@ public class AdHocCommandManager { discoverItems.addItem(item); } - serviceDiscoveryManager.publishItems(jid, discoNode, discoverItems); + serviceDiscoveryManager.publishItems(jid, NAMESPACE, discoverItems); } /** @@ -301,7 +293,7 @@ public class AdHocCommandManager { * @return a local instance equivalent to the remote command. */ public RemoteCommand getRemoteCommand(String jid, String node) { - return new RemoteCommand(connection.get(), node, jid); + return new RemoteCommand(connection(), node, jid); } /** @@ -449,7 +441,7 @@ public class AdHocCommandManager { } // Sends the response packet - connection.get().sendPacket(response); + connection().sendPacket(response); } catch (XMPPException e) { @@ -564,7 +556,7 @@ public class AdHocCommandManager { executingCommands.remove(sessionId); } - connection.get().sendPacket(response); + connection().sendPacket(response); } catch (XMPPException e) { // If there is an exception caused by the next, complete, @@ -620,7 +612,7 @@ public class AdHocCommandManager { private void respondError(AdHocCommandData response, XMPPError error) { response.setType(IQ.Type.ERROR); response.setError(error); - connection.get().sendPacket(response); + connection().sendPacket(response); } /** diff --git a/extensions/src/main/java/org/jivesoftware/smackx/disco/ServiceDiscoveryManager.java b/extensions/src/main/java/org/jivesoftware/smackx/disco/ServiceDiscoveryManager.java index 9022ef08b..f9018308b 100644 --- a/extensions/src/main/java/org/jivesoftware/smackx/disco/ServiceDiscoveryManager.java +++ b/extensions/src/main/java/org/jivesoftware/smackx/disco/ServiceDiscoveryManager.java @@ -17,7 +17,11 @@ package org.jivesoftware.smackx.disco; -import org.jivesoftware.smack.*; +import org.jivesoftware.smack.Connection; +import org.jivesoftware.smack.ConnectionCreationListener; +import org.jivesoftware.smack.Manager; +import org.jivesoftware.smack.PacketListener; +import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.filter.PacketTypeFilter; import org.jivesoftware.smack.packet.IQ; @@ -30,8 +34,15 @@ import org.jivesoftware.smackx.disco.packet.DiscoverItems; import org.jivesoftware.smackx.disco.packet.DiscoverInfo.Identity; import org.jivesoftware.smackx.xdata.packet.DataForm; -import java.lang.ref.WeakReference; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; /** @@ -45,7 +56,7 @@ import java.util.concurrent.ConcurrentHashMap; * * @author Gaston Dombiak */ -public class ServiceDiscoveryManager { +public class ServiceDiscoveryManager extends Manager { private static final String DEFAULT_IDENTITY_NAME = "Smack"; private static final String DEFAULT_IDENTITY_CATEGORY = "client"; @@ -61,7 +72,6 @@ public class ServiceDiscoveryManager { private static Map instances = Collections.synchronizedMap(new WeakHashMap()); - private WeakReference connection; private final Set features = new HashSet(); private DataForm extendedInfo = null; private Map nodeInformationProviders = @@ -94,8 +104,7 @@ public class ServiceDiscoveryManager { * @param connection the connection to which a ServiceDiscoveryManager is going to be created. */ private ServiceDiscoveryManager(Connection connection) { - this.connection = new WeakReference(connection); - + super(connection); // Register the new instance and associate it with the connection instances.put(connection, this); @@ -106,7 +115,7 @@ public class ServiceDiscoveryManager { PacketFilter packetFilter = new PacketTypeFilter(DiscoverItems.class); PacketListener packetListener = new PacketListener() { public void processPacket(Packet packet) { - Connection connection = ServiceDiscoveryManager.this.connection.get(); + Connection connection = connection(); if (connection == null) return; DiscoverItems discoverItems = (DiscoverItems) packet; // Send back the items defined in the client if the request is of type GET @@ -143,7 +152,7 @@ public class ServiceDiscoveryManager { packetFilter = new PacketTypeFilter(DiscoverInfo.class); packetListener = new PacketListener() { public void processPacket(Packet packet) { - Connection connection = ServiceDiscoveryManager.this.connection.get(); + Connection connection = connection(); if (connection == null) return; DiscoverInfo discoverInfo = (DiscoverInfo) packet; // Answer the client's supported features if the request is of the GET type @@ -530,16 +539,13 @@ public class ServiceDiscoveryManager { * @throws XMPPException if the operation failed for some reason. */ public DiscoverInfo discoverInfo(String entityID, String node) throws XMPPException { - Connection connection = ServiceDiscoveryManager.this.connection.get(); - if (connection == null) throw new XMPPException("Connection instance already gc'ed"); - // Discover the entity's info DiscoverInfo disco = new DiscoverInfo(); disco.setType(IQ.Type.GET); disco.setTo(entityID); disco.setNode(node); - Packet result = connection.createPacketCollectorAndSend(disco).nextResultOrThrow(); + Packet result = connection().createPacketCollectorAndSend(disco).nextResultOrThrow(); return (DiscoverInfo) result; } @@ -566,16 +572,13 @@ public class ServiceDiscoveryManager { * @throws XMPPException if the operation failed for some reason. */ public DiscoverItems discoverItems(String entityID, String node) throws XMPPException { - Connection connection = ServiceDiscoveryManager.this.connection.get(); - if (connection == null) throw new XMPPException("Connection instance already gc'ed"); - // Discover the entity's items DiscoverItems disco = new DiscoverItems(); disco.setType(IQ.Type.GET); disco.setTo(entityID); disco.setNode(node); - Packet result = connection.createPacketCollectorAndSend(disco).nextResultOrThrow(); + Packet result = connection().createPacketCollectorAndSend(disco).nextResultOrThrow(); return (DiscoverItems) result; } @@ -635,14 +638,11 @@ public class ServiceDiscoveryManager { */ public void publishItems(String entityID, String node, DiscoverItems discoverItems) throws XMPPException { - Connection connection = ServiceDiscoveryManager.this.connection.get(); - if (connection == null) throw new XMPPException("Connection instance already gc'ed"); - discoverItems.setType(IQ.Type.SET); discoverItems.setTo(entityID); discoverItems.setNode(node); - connection.createPacketCollectorAndSend(discoverItems).nextResultOrThrow(); + connection().createPacketCollectorAndSend(discoverItems).nextResultOrThrow(); } /** diff --git a/extensions/src/main/java/org/jivesoftware/smackx/iqversion/VersionManager.java b/extensions/src/main/java/org/jivesoftware/smackx/iqversion/VersionManager.java index 547f3f0a7..e47304321 100644 --- a/extensions/src/main/java/org/jivesoftware/smackx/iqversion/VersionManager.java +++ b/extensions/src/main/java/org/jivesoftware/smackx/iqversion/VersionManager.java @@ -17,12 +17,12 @@ package org.jivesoftware.smackx.iqversion; -import java.lang.ref.WeakReference; import java.util.Collections; import java.util.Map; import java.util.WeakHashMap; import org.jivesoftware.smack.Connection; +import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.filter.AndFilter; import org.jivesoftware.smack.filter.IQTypeFilter; @@ -48,15 +48,14 @@ import org.jivesoftware.smackx.iqversion.packet.Version; * * @author Georg Lukas */ -public class VersionManager { +public class VersionManager extends Manager { private static final Map instances = Collections.synchronizedMap(new WeakHashMap()); private Version own_version; - private WeakReference weakRefConnection; private VersionManager(final Connection connection) { - this.weakRefConnection = new WeakReference(connection); + super(connection); instances.put(connection, this); ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection); @@ -73,7 +72,7 @@ public class VersionManager { Version reply = new Version(own_version); reply.setPacketID(packet.getPacketID()); reply.setTo(packet.getFrom()); - weakRefConnection.get().sendPacket(reply); + connection().sendPacket(reply); } } , new AndFilter(new PacketTypeFilter(Version.class), new IQTypeFilter(Type.GET))); diff --git a/extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java b/extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java index 36e49e961..e51ee5558 100644 --- a/extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java +++ b/extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java @@ -16,7 +16,6 @@ */ package org.jivesoftware.smackx.ping; -import java.lang.ref.WeakReference; import java.util.Collections; import java.util.HashSet; import java.util.Map; @@ -29,6 +28,7 @@ import java.util.logging.Logger; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.ConnectionCreationListener; import org.jivesoftware.smack.ConnectionListener; +import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.SmackError; import org.jivesoftware.smack.XMPPException; @@ -39,7 +39,6 @@ import org.jivesoftware.smack.filter.PacketTypeFilter; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.IQ.Type; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; -import org.jivesoftware.smackx.disco.packet.DiscoverInfo; import org.jivesoftware.smackx.ping.packet.Ping; import org.jivesoftware.smackx.ping.packet.Pong; @@ -52,7 +51,7 @@ import org.jivesoftware.smackx.ping.packet.Pong; * @author Florian Schmaus * @see XEP-0199:XMPP Ping */ -public class PingManager { +public class PingManager extends Manager { public static final String NAMESPACE = "urn:xmpp:ping"; private static final Logger LOGGER = Logger.getLogger(PingManager.class.getName()); @@ -118,10 +117,8 @@ public class PingManager { */ private long lastSuccessfulManualPing = -1; - private WeakReference weakRefConnection; - private PingManager(Connection connection) { - weakRefConnection = new WeakReference(connection); + super(connection); ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection); sdm.addFeature(PingManager.NAMESPACE); INSTANCES.put(connection, this); @@ -130,9 +127,8 @@ public class PingManager { // Send a Pong for every Ping @Override public void processPacket(Packet packet) { - Connection connection = weakRefConnection.get(); Pong pong = new Pong(packet); - connection.sendPacket(pong); + connection().sendPacket(pong); } }, PING_PACKET_FILTER); connection.addConnectionListener(new ConnectionListener() { @@ -170,12 +166,11 @@ public class PingManager { */ public boolean ping(String jid, long pingTimeout) { Ping ping = new Ping(jid); - Connection connection = weakRefConnection.get(); try { - connection.createPacketCollectorAndSend(ping).nextResultOrThrow(); + connection().createPacketCollectorAndSend(ping).nextResultOrThrow(); } catch (XMPPException exc) { - return (jid.equals(connection.getServiceName()) && (exc.getSmackError() != SmackError.NO_RESPONSE_FROM_SERVER)); + return (jid.equals(connection().getServiceName()) && (exc.getSmackError() != SmackError.NO_RESPONSE_FROM_SERVER)); } return true; } @@ -188,8 +183,7 @@ public class PingManager { * @return true if a reply was received from the entity, false otherwise. */ public boolean ping(String jid) { - Connection connection = weakRefConnection.get(); - return ping(jid, connection.getPacketReplyTimeout()); + return ping(jid, connection().getPacketReplyTimeout()); } /** @@ -200,9 +194,7 @@ public class PingManager { * @throws XMPPException An XMPP related error occurred during the request */ public boolean isPingSupported(String jid) throws XMPPException { - Connection connection = weakRefConnection.get(); - DiscoverInfo result = ServiceDiscoveryManager.getInstanceFor(connection).discoverInfo(jid); - return result.containsFeature(PingManager.NAMESPACE); + return ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature(jid, PingManager.NAMESPACE); } /** @@ -229,8 +221,7 @@ public class PingManager { * @return */ public boolean pingMyServer(boolean notifyListeners) { - Connection connection = weakRefConnection.get(); - boolean res = ping(connection.getServiceName()); + boolean res = ping(connection().getServiceName()); if (res) { pongReceived(); } else if (notifyListeners) { @@ -296,8 +287,7 @@ public class PingManager { maybeStopPingServerTask(); if (pingInterval > 0) { LOGGER.fine("Scheduling ServerPingTask in " + pingInterval + " seconds"); - Connection connection = weakRefConnection.get(); - nextAutomaticPing = connection.schedule(pingServerRunnable, pingInterval, TimeUnit.SECONDS); + nextAutomaticPing = connection().schedule(pingServerRunnable, pingInterval, TimeUnit.SECONDS); } } @@ -318,7 +308,7 @@ public class PingManager { public void run() { LOGGER.fine("ServerPingTask run()"); - Connection connection = weakRefConnection.get(); + Connection connection = connection(); if (connection == null) { // connection has been collected by GC // which means we can stop the thread by breaking the loop diff --git a/extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java b/extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java index f3468be6d..cfd120d29 100644 --- a/extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java +++ b/extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java @@ -16,8 +16,16 @@ */ package org.jivesoftware.smackx.privacy; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; + import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.ConnectionCreationListener; +import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.*; @@ -26,9 +34,6 @@ import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smackx.privacy.packet.Privacy; import org.jivesoftware.smackx.privacy.packet.PrivacyItem; -import java.lang.ref.WeakReference; -import java.util.*; - /** * A PrivacyListManager is used by XMPP clients to block or allow communications from other * users. Use the manager to:
    @@ -42,13 +47,12 @@ import java.util.*; * * @author Francisco Vives */ -public class PrivacyListManager { +public class PrivacyListManager extends Manager { // Keep the list of instances of this class. private static Map instances = Collections .synchronizedMap(new WeakHashMap()); - private WeakReference connection; private final List listeners = new ArrayList(); PacketFilter packetFilter = new AndFilter(new IQTypeFilter(IQ.Type.SET), new PacketExtensionFilter("query", "jabber:iq:privacy")); @@ -71,7 +75,7 @@ public class PrivacyListManager { * @param connection the XMPP connection. */ private PrivacyListManager(final Connection connection) { - this.connection = new WeakReference(connection); + super(connection); // Register the new instance and associate it with the connection instances.put(connection, this); @@ -121,7 +125,7 @@ public class PrivacyListManager { * @return the userJID that owns the privacy */ private String getUser() { - return connection.get().getUser(); + return connection().getUser(); } /** @@ -146,13 +150,11 @@ public class PrivacyListManager { * @exception XMPPException if the request or the answer failed, it raises an exception. */ private Privacy getRequest(Privacy requestPrivacy) throws XMPPException { - Connection connection = PrivacyListManager.this.connection.get(); - if (connection == null) throw new XMPPException("Connection instance already gc'ed"); // The request is a get iq type requestPrivacy.setType(Privacy.Type.GET); requestPrivacy.setFrom(this.getUser()); - Privacy privacyAnswer = (Privacy) connection.createPacketCollectorAndSend(requestPrivacy).nextResultOrThrow(); + Privacy privacyAnswer = (Privacy) connection().createPacketCollectorAndSend(requestPrivacy).nextResultOrThrow(); return privacyAnswer; } @@ -166,14 +168,11 @@ public class PrivacyListManager { * @exception XMPPException if the request or the answer failed, it raises an exception. */ private Packet setRequest(Privacy requestPrivacy) throws XMPPException { - Connection connection = PrivacyListManager.this.connection.get(); - if (connection == null) - throw new XMPPException("Connection instance already gc'ed"); // The request is a get iq type requestPrivacy.setType(Privacy.Type.SET); requestPrivacy.setFrom(this.getUser()); - return connection.createPacketCollectorAndSend(requestPrivacy).nextResultOrThrow(); + return connection().createPacketCollectorAndSend(requestPrivacy).nextResultOrThrow(); } /** diff --git a/extensions/src/main/java/org/jivesoftware/smackx/receipts/DeliveryReceiptManager.java b/extensions/src/main/java/org/jivesoftware/smackx/receipts/DeliveryReceiptManager.java index c76040741..2ee08f725 100644 --- a/extensions/src/main/java/org/jivesoftware/smackx/receipts/DeliveryReceiptManager.java +++ b/extensions/src/main/java/org/jivesoftware/smackx/receipts/DeliveryReceiptManager.java @@ -16,7 +16,6 @@ */ package org.jivesoftware.smackx.receipts; -import java.lang.ref.WeakReference; import java.util.Collections; import java.util.HashSet; import java.util.Map; @@ -25,13 +24,13 @@ import java.util.WeakHashMap; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.ConnectionCreationListener; +import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.PacketExtensionFilter; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; -import org.jivesoftware.smackx.disco.packet.DiscoverInfo; /** * Manager for XEP-0184: Message Delivery Receipts. This class implements @@ -40,7 +39,7 @@ import org.jivesoftware.smackx.disco.packet.DiscoverInfo; * * @author Georg Lukas */ -public class DeliveryReceiptManager implements PacketListener { +public class DeliveryReceiptManager extends Manager implements PacketListener { private static Map instances = Collections.synchronizedMap(new WeakHashMap()); @@ -53,15 +52,14 @@ public class DeliveryReceiptManager implements PacketListener { }); } - private WeakReference weakRefConnection; private boolean auto_receipts_enabled = false; private Set receiptReceivedListeners = Collections .synchronizedSet(new HashSet()); private DeliveryReceiptManager(Connection connection) { + super(connection); ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection); sdm.addFeature(DeliveryReceipt.NAMESPACE); - weakRefConnection = new WeakReference(connection); instances.put(connection, this); // register listener for delivery receipts and requests @@ -92,11 +90,9 @@ public class DeliveryReceiptManager implements PacketListener { * @return true if supported */ public boolean isSupported(String jid) { - Connection connection = weakRefConnection.get(); try { - DiscoverInfo result = - ServiceDiscoveryManager.getInstanceFor(connection).discoverInfo(jid); - return result.containsFeature(DeliveryReceipt.NAMESPACE); + return ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature(jid, + DeliveryReceipt.NAMESPACE); } catch (XMPPException e) { return false; @@ -121,7 +117,7 @@ public class DeliveryReceiptManager implements PacketListener { DeliveryReceiptRequest drr = (DeliveryReceiptRequest)packet.getExtension( DeliveryReceiptRequest.ELEMENT, DeliveryReceipt.NAMESPACE); if (drr != null) { - Connection connection = weakRefConnection.get(); + Connection connection = connection(); Message ack = new Message(packet.getFrom(), Message.Type.normal); ack.addExtension(new DeliveryReceipt(packet.getPacketID())); connection.sendPacket(ack);