Skip to content

Commit

Permalink
KAA-823: Implement topic list hash algorithm. Get rid of sequence num…
Browse files Browse the repository at this point in the history
…bers in configuration and notification features.
  • Loading branch information
Denis Kimcherenko committed Jan 21, 2016
1 parent bf9f647 commit 7727372
Show file tree
Hide file tree
Showing 16 changed files with 294 additions and 246 deletions.
Expand Up @@ -78,7 +78,11 @@
import org.kaaproject.kaa.client.exceptions.KaaClusterConnectionException; import org.kaaproject.kaa.client.exceptions.KaaClusterConnectionException;
import org.kaaproject.kaa.client.exceptions.KaaException; import org.kaaproject.kaa.client.exceptions.KaaException;
import org.kaaproject.kaa.client.exceptions.KaaRuntimeException; import org.kaaproject.kaa.client.exceptions.KaaRuntimeException;
import org.kaaproject.kaa.client.logging.*; import org.kaaproject.kaa.client.logging.AbstractLogCollector;
import org.kaaproject.kaa.client.logging.DefaultLogCollector;
import org.kaaproject.kaa.client.logging.LogDeliveryListener;
import org.kaaproject.kaa.client.logging.LogStorage;
import org.kaaproject.kaa.client.logging.LogUploadStrategy;
import org.kaaproject.kaa.client.notification.DefaultNotificationManager; import org.kaaproject.kaa.client.notification.DefaultNotificationManager;
import org.kaaproject.kaa.client.notification.NotificationListener; import org.kaaproject.kaa.client.notification.NotificationListener;
import org.kaaproject.kaa.client.notification.NotificationTopicListListener; import org.kaaproject.kaa.client.notification.NotificationTopicListListener;
Expand Down Expand Up @@ -405,7 +409,7 @@ public void addNotificationListener(NotificationListener listener) {
} }


@Override @Override
public void addNotificationListener(String topicId, NotificationListener listener) throws UnavailableTopicException { public void addNotificationListener(Long topicId, NotificationListener listener) throws UnavailableTopicException {
this.notificationManager.addNotificationListener(topicId, listener); this.notificationManager.addNotificationListener(topicId, listener);
} }


Expand All @@ -415,50 +419,50 @@ public void removeNotificationListener(NotificationListener listener) {
} }


@Override @Override
public void removeNotificationListener(String topicId, NotificationListener listener) throws UnavailableTopicException { public void removeNotificationListener(Long topicId, NotificationListener listener) throws UnavailableTopicException {
this.notificationManager.removeNotificationListener(topicId, listener); this.notificationManager.removeNotificationListener(topicId, listener);
} }


@Override @Override
public void subscribeToTopic(String topicId) throws UnavailableTopicException { public void subscribeToTopic(Long topicId) throws UnavailableTopicException {
subscribeToTopic(topicId, FORCE_SYNC); subscribeToTopic(topicId, FORCE_SYNC);
} }


@Override @Override
public void subscribeToTopic(String topicId, boolean forceSync) throws UnavailableTopicException { public void subscribeToTopic(Long topicId, boolean forceSync) throws UnavailableTopicException {
checkClientState(State.STARTED, "Kaa client isn't started"); checkClientState(State.STARTED, "Kaa client isn't started");
notificationManager.subscribeToTopic(topicId, forceSync); notificationManager.subscribeToTopic(topicId, forceSync);
} }


@Override @Override
public void subscribeToTopics(List<String> topicIds) throws UnavailableTopicException { public void subscribeToTopics(List<Long> topicIds) throws UnavailableTopicException {
subscribeToTopics(topicIds, FORCE_SYNC); subscribeToTopics(topicIds, FORCE_SYNC);
} }


@Override @Override
public void subscribeToTopics(List<String> topicIds, boolean forceSync) throws UnavailableTopicException { public void subscribeToTopics(List<Long> topicIds, boolean forceSync) throws UnavailableTopicException {
checkClientState(State.STARTED, "Kaa client isn't started"); checkClientState(State.STARTED, "Kaa client isn't started");
notificationManager.subscribeToTopics(topicIds, forceSync); notificationManager.subscribeToTopics(topicIds, forceSync);
} }


@Override @Override
public void unsubscribeFromTopic(String topicId) throws UnavailableTopicException { public void unsubscribeFromTopic(Long topicId) throws UnavailableTopicException {
unsubscribeFromTopic(topicId, FORCE_SYNC); unsubscribeFromTopic(topicId, FORCE_SYNC);
} }


@Override @Override
public void unsubscribeFromTopic(String topicId, boolean forceSync) throws UnavailableTopicException { public void unsubscribeFromTopic(Long topicId, boolean forceSync) throws UnavailableTopicException {
checkClientState(State.STARTED, "Kaa client isn't started"); checkClientState(State.STARTED, "Kaa client isn't started");
notificationManager.unsubscribeFromTopic(topicId, forceSync); notificationManager.unsubscribeFromTopic(topicId, forceSync);
} }


@Override @Override
public void unsubscribeFromTopics(List<String> topicIds) throws UnavailableTopicException { public void unsubscribeFromTopics(List<Long> topicIds) throws UnavailableTopicException {
unsubscribeFromTopics(topicIds, FORCE_SYNC); unsubscribeFromTopics(topicIds, FORCE_SYNC);
} }


@Override @Override
public void unsubscribeFromTopics(List<String> topicIds, boolean forceSync) throws UnavailableTopicException { public void unsubscribeFromTopics(List<Long> topicIds, boolean forceSync) throws UnavailableTopicException {
checkClientState(State.STARTED, "Kaa client isn't started"); checkClientState(State.STARTED, "Kaa client isn't started");
this.notificationManager.unsubscribeFromTopics(topicIds, forceSync); this.notificationManager.unsubscribeFromTopics(topicIds, forceSync);
} }
Expand Down
Expand Up @@ -195,7 +195,7 @@ public interface GenericKaaClient {
* *
* @see NotificationListener * @see NotificationListener
*/ */
void addNotificationListener(String topicId, NotificationListener listener) throws UnavailableTopicException; void addNotificationListener(Long topicId, NotificationListener listener) throws UnavailableTopicException;


/** /**
* <p> * <p>
Expand Down Expand Up @@ -230,7 +230,7 @@ public interface GenericKaaClient {
* *
* @see NotificationListener * @see NotificationListener
*/ */
void removeNotificationListener(String topicId, NotificationListener listener) throws UnavailableTopicException; void removeNotificationListener(Long topicId, NotificationListener listener) throws UnavailableTopicException;


/** /**
* <p> * <p>
Expand All @@ -244,7 +244,7 @@ public interface GenericKaaClient {
* Throw if unknown topic id is provided or topic isn't * Throw if unknown topic id is provided or topic isn't
* optional. * optional.
*/ */
void subscribeToTopic(String topicId) throws UnavailableTopicException; void subscribeToTopic(Long topicId) throws UnavailableTopicException;


/** /**
* <p> * <p>
Expand All @@ -263,7 +263,7 @@ public interface GenericKaaClient {
* *
* @see #syncTopicsList() * @see #syncTopicsList()
*/ */
void subscribeToTopic(String topicId, boolean forceSync) throws UnavailableTopicException; void subscribeToTopic(Long topicId, boolean forceSync) throws UnavailableTopicException;


/** /**
* <p> * <p>
Expand All @@ -278,7 +278,7 @@ public interface GenericKaaClient {
* Throw if unknown topic id is provided or topic isn't * Throw if unknown topic id is provided or topic isn't
* optional. * optional.
*/ */
void subscribeToTopics(List<String> topicIds) throws UnavailableTopicException; void subscribeToTopics(List<Long> topicIds) throws UnavailableTopicException;


/** /**
* <p> * <p>
Expand All @@ -298,7 +298,7 @@ public interface GenericKaaClient {
* *
* @see #syncTopicsList() * @see #syncTopicsList()
*/ */
void subscribeToTopics(List<String> topicIds, boolean forceSync) throws UnavailableTopicException; void subscribeToTopics(List<Long> topicIds, boolean forceSync) throws UnavailableTopicException;


/** /**
* <p> * <p>
Expand All @@ -316,7 +316,7 @@ public interface GenericKaaClient {
* Throw if unknown topic id is provided or topic isn't * Throw if unknown topic id is provided or topic isn't
* optional. * optional.
*/ */
void unsubscribeFromTopic(String topicId) throws UnavailableTopicException; void unsubscribeFromTopic(Long topicId) throws UnavailableTopicException;


/** /**
* <p> * <p>
Expand All @@ -339,7 +339,7 @@ public interface GenericKaaClient {
* *
* @see #syncTopicsList() * @see #syncTopicsList()
*/ */
void unsubscribeFromTopic(String topicId, boolean forceSync) throws UnavailableTopicException; void unsubscribeFromTopic(Long topicId, boolean forceSync) throws UnavailableTopicException;


/** /**
* <p> * <p>
Expand All @@ -358,7 +358,7 @@ public interface GenericKaaClient {
* Throw if unknown topic id is provided or topic isn't * Throw if unknown topic id is provided or topic isn't
* optional. * optional.
*/ */
void unsubscribeFromTopics(List<String> topicIds) throws UnavailableTopicException; void unsubscribeFromTopics(List<Long> topicIds) throws UnavailableTopicException;


/** /**
* <p> * <p>
Expand All @@ -382,17 +382,17 @@ public interface GenericKaaClient {
* *
* @see #syncTopicsList() * @see #syncTopicsList()
*/ */
void unsubscribeFromTopics(List<String> topicIds, boolean forceSync) throws UnavailableTopicException; void unsubscribeFromTopics(List<Long> topicIds, boolean forceSync) throws UnavailableTopicException;


/** /**
* <p> * <p>
* Force sync of pending subscription changes with server. * Force sync of pending subscription changes with server.
* </p> * </p>
* *
* <p> * <p>
* Should be used after all {@link #subscribeToTopic(String, boolean)}, * Should be used after all {@link #subscribeToTopic(Long, boolean)},
* {@link #subscribeToTopics(List, boolean)}, * {@link #subscribeToTopics(List, boolean)},
* {@link #unsubscribeFromTopic(String, boolean)}, * {@link #unsubscribeFromTopic(Long, boolean)},
* {@link #unsubscribeFromTopics(List, boolean)} calls with parameter * {@link #unsubscribeFromTopics(List, boolean)} calls with parameter
* {@code forceSync} set to {@code false}. * {@code forceSync} set to {@code false}.
* </p> * </p>
Expand Down
Expand Up @@ -84,7 +84,6 @@ public ConfigurationSyncRequest createConfigurationRequest() {
if (hash != null) { if (hash != null) {
request.setConfigurationHash(ByteBuffer.wrap(hash.getData())); request.setConfigurationHash(ByteBuffer.wrap(hash.getData()));
} }
request.setAppStateSeqNumber(clientState.getConfigSeqNumber());
request.setResyncOnly(resyncOnly); request.setResyncOnly(resyncOnly);
return request; return request;
} }
Expand All @@ -94,7 +93,6 @@ public ConfigurationSyncRequest createConfigurationRequest() {
@Override @Override
public void onConfigurationResponse(ConfigurationSyncResponse response) throws IOException { public void onConfigurationResponse(ConfigurationSyncResponse response) throws IOException {
if (clientState != null && configProcessor != null) { if (clientState != null && configProcessor != null) {
clientState.setConfigSeqNumber(response.getAppStateSeqNumber());
ByteBuffer schemaBody = response.getConfSchemaBody(); ByteBuffer schemaBody = response.getConfSchemaBody();
if (schemaBody != null && schemaProcessor != null) { if (schemaBody != null && schemaProcessor != null) {
schemaProcessor.loadSchema(schemaBody); schemaProcessor.loadSchema(schemaBody);
Expand Down
Expand Up @@ -29,6 +29,7 @@


import org.kaaproject.kaa.client.channel.NotificationTransport; import org.kaaproject.kaa.client.channel.NotificationTransport;
import org.kaaproject.kaa.client.notification.NotificationProcessor; import org.kaaproject.kaa.client.notification.NotificationProcessor;
import org.kaaproject.kaa.client.notification.TopicListHashCalculator;
import org.kaaproject.kaa.common.TransportType; import org.kaaproject.kaa.common.TransportType;
import org.kaaproject.kaa.common.endpoint.gen.Notification; import org.kaaproject.kaa.common.endpoint.gen.Notification;
import org.kaaproject.kaa.common.endpoint.gen.NotificationSyncRequest; import org.kaaproject.kaa.common.endpoint.gen.NotificationSyncRequest;
Expand All @@ -47,14 +48,15 @@ public class DefaultNotificationTransport extends AbstractKaaTransport implement
private NotificationProcessor processor; private NotificationProcessor processor;
private final Set<String> acceptedUnicastNotificationIds = new HashSet<>(); private final Set<String> acceptedUnicastNotificationIds = new HashSet<>();
private final List<SubscriptionCommand> sentNotificationCommands = new LinkedList<SubscriptionCommand>(); private final List<SubscriptionCommand> sentNotificationCommands = new LinkedList<SubscriptionCommand>();
private Integer topicListHash = TopicListHashCalculator.calculateTopicListHash(null);


private List<TopicState> getTopicStates() { private List<TopicState> getTopicStates() {
List<TopicState> states = null; List<TopicState> states = null;
Map<String, Integer> nfSubscriptions = clientState.getNfSubscriptions(); Map<Long, Integer> nfSubscriptions = clientState.getNfSubscriptions();
if(!nfSubscriptions.isEmpty()){ if(!nfSubscriptions.isEmpty()){
states = new ArrayList<>(); states = new ArrayList<>();
LOG.info("Topic States:"); LOG.info("Topic States:");
for(Entry<String, Integer> nfSubscription : nfSubscriptions.entrySet()){ for(Entry<Long, Integer> nfSubscription : nfSubscriptions.entrySet()){
TopicState state = new TopicState(nfSubscription.getKey(), nfSubscription.getValue()); TopicState state = new TopicState(nfSubscription.getKey(), nfSubscription.getValue());
states.add(state); states.add(state);
LOG.info("{} : {}", state.getTopicId(), state.getSeqNumber()); LOG.info("{} : {}", state.getTopicId(), state.getSeqNumber());
Expand All @@ -68,7 +70,7 @@ private List<TopicState> getTopicStates() {
public NotificationSyncRequest createEmptyNotificationRequest() { public NotificationSyncRequest createEmptyNotificationRequest() {
if (clientState != null) { if (clientState != null) {
NotificationSyncRequest request = new NotificationSyncRequest(); NotificationSyncRequest request = new NotificationSyncRequest();
request.setAppStateSeqNumber(clientState.getNotificationSeqNumber()); request.setTopicListHash(topicListHash);
request.setTopicStates(getTopicStates()); request.setTopicStates(getTopicStates());
return request; return request;
} }
Expand All @@ -79,12 +81,13 @@ public NotificationSyncRequest createEmptyNotificationRequest() {
public NotificationSyncRequest createNotificationRequest() { public NotificationSyncRequest createNotificationRequest() {
if (clientState != null) { if (clientState != null) {
NotificationSyncRequest request = new NotificationSyncRequest(); NotificationSyncRequest request = new NotificationSyncRequest();
request.setAppStateSeqNumber(clientState.getNotificationSeqNumber());
if(!acceptedUnicastNotificationIds.isEmpty()){ if(!acceptedUnicastNotificationIds.isEmpty()){
LOG.info("Accepted unicast Notifications: {}", acceptedUnicastNotificationIds.size()); LOG.info("Accepted unicast Notifications: {}", acceptedUnicastNotificationIds.size());
request.setAcceptedUnicastNotifications(new ArrayList<>(acceptedUnicastNotificationIds)); request.setAcceptedUnicastNotifications(new ArrayList<>(acceptedUnicastNotificationIds));
} }
request.setSubscriptionCommands(sentNotificationCommands); request.setSubscriptionCommands(sentNotificationCommands);
request.setTopicListHash(topicListHash);
request.setTopicStates(getTopicStates()); request.setTopicStates(getTopicStates());
return request; return request;
} }
Expand All @@ -98,6 +101,8 @@ public void onNotificationResponse(NotificationSyncResponse response) throws IOE
acceptedUnicastNotificationIds.clear(); acceptedUnicastNotificationIds.clear();
} }
List<Topic> topics = response.getAvailableTopics(); List<Topic> topics = response.getAvailableTopics();
topicListHash = TopicListHashCalculator.calculateTopicListHash(topics);

if (topics != null) { if (topics != null) {
for (Topic topic : topics) { for (Topic topic : topics) {
clientState.addTopic(topic); clientState.addTopic(topic);
Expand Down Expand Up @@ -131,7 +136,6 @@ public void onNotificationResponse(NotificationSyncResponse response) throws IOE
processor.notificationReceived(newNotifications); processor.notificationReceived(newNotifications);
} }
sentNotificationCommands.clear(); sentNotificationCommands.clear();
clientState.setNotificationSeqNumber(response.getAppStateSeqNumber());


syncAck(response.getResponseStatus()); syncAck(response.getResponseStatus());


Expand Down
Expand Up @@ -47,12 +47,12 @@
public class DefaultNotificationManager implements NotificationManager, NotificationProcessor { public class DefaultNotificationManager implements NotificationManager, NotificationProcessor {
private static final Logger LOG = LoggerFactory.getLogger(DefaultNotificationManager.class); private static final Logger LOG = LoggerFactory.getLogger(DefaultNotificationManager.class);


private Map<String, Topic> topics = new HashMap<String, Topic>(); private Map<Long, Topic> topics = new HashMap<>();


private final ExecutorContext executorContext; private final ExecutorContext executorContext;
private final NotificationDeserializer deserializer; private final NotificationDeserializer deserializer;
private final Set<NotificationListener> mandatoryListeners = new HashSet<NotificationListener>(); private final Set<NotificationListener> mandatoryListeners = new HashSet<NotificationListener>();
private final Map<String, List<NotificationListener>> optionalListeners = new HashMap<String, List<NotificationListener>>(); private final Map<Long, List<NotificationListener>> optionalListeners = new HashMap<>();
private final Set<NotificationTopicListListener> topicsListeners = new HashSet<NotificationTopicListListener>(); private final Set<NotificationTopicListListener> topicsListeners = new HashSet<NotificationTopicListListener>();


private final List<SubscriptionCommand> subscriptionInfo = new LinkedList<SubscriptionCommand>(); private final List<SubscriptionCommand> subscriptionInfo = new LinkedList<SubscriptionCommand>();
Expand Down Expand Up @@ -140,7 +140,7 @@ public List<Topic> getTopics() {
} }


@Override @Override
public void subscribeToTopic(String topicId, boolean forceSync) throws UnavailableTopicException { public void subscribeToTopic(Long topicId, boolean forceSync) throws UnavailableTopicException {
Topic topic = findTopicById(topicId); Topic topic = findTopicById(topicId);
if (topic.getSubscriptionType() != SubscriptionType.OPTIONAL_SUBSCRIPTION) { if (topic.getSubscriptionType() != SubscriptionType.OPTIONAL_SUBSCRIPTION) {
LOG.warn("Failed to subscribe: topic '{}' isn't optional", topicId); LOG.warn("Failed to subscribe: topic '{}' isn't optional", topicId);
Expand All @@ -155,10 +155,10 @@ public void subscribeToTopic(String topicId, boolean forceSync) throws Unavailab
} }


@Override @Override
public void subscribeToTopics(List<String> topicIds, boolean forceSync) throws UnavailableTopicException { public void subscribeToTopics(List<Long> topicIds, boolean forceSync) throws UnavailableTopicException {
List<SubscriptionCommand> subscriptionUpdate = new LinkedList<>(); List<SubscriptionCommand> subscriptionUpdate = new LinkedList<>();


for (String id : topicIds) { for (Long id : topicIds) {
Topic topic = findTopicById(id); Topic topic = findTopicById(id);
if (topic.getSubscriptionType() != SubscriptionType.OPTIONAL_SUBSCRIPTION) { if (topic.getSubscriptionType() != SubscriptionType.OPTIONAL_SUBSCRIPTION) {
LOG.warn("Failed to subscribe: topic '{}' isn't optional", id); LOG.warn("Failed to subscribe: topic '{}' isn't optional", id);
Expand All @@ -176,7 +176,7 @@ public void subscribeToTopics(List<String> topicIds, boolean forceSync) throws U
} }


@Override @Override
public void unsubscribeFromTopic(String topicId, boolean forceSync) throws UnavailableTopicException { public void unsubscribeFromTopic(Long topicId, boolean forceSync) throws UnavailableTopicException {
Topic topic = findTopicById(topicId); Topic topic = findTopicById(topicId);
if (topic.getSubscriptionType() != SubscriptionType.OPTIONAL_SUBSCRIPTION) { if (topic.getSubscriptionType() != SubscriptionType.OPTIONAL_SUBSCRIPTION) {
LOG.warn("Failed to unsubscribe: topic '{}' isn't optional", topicId); LOG.warn("Failed to unsubscribe: topic '{}' isn't optional", topicId);
Expand All @@ -191,10 +191,10 @@ public void unsubscribeFromTopic(String topicId, boolean forceSync) throws Unava
} }


@Override @Override
public void unsubscribeFromTopics(List<String> topicIds, boolean forceSync) throws UnavailableTopicException { public void unsubscribeFromTopics(List<Long> topicIds, boolean forceSync) throws UnavailableTopicException {
List<SubscriptionCommand> subscriptionUpdate = new LinkedList<>(); List<SubscriptionCommand> subscriptionUpdate = new LinkedList<>();


for (String id : topicIds) { for (Long id : topicIds) {
Topic topic = findTopicById(id); Topic topic = findTopicById(id);
if (topic.getSubscriptionType() != SubscriptionType.OPTIONAL_SUBSCRIPTION) { if (topic.getSubscriptionType() != SubscriptionType.OPTIONAL_SUBSCRIPTION) {
LOG.warn("Failed to unsubscribe: topic '{}' isn't optional", id); LOG.warn("Failed to unsubscribe: topic '{}' isn't optional", id);
Expand All @@ -212,8 +212,8 @@ public void unsubscribeFromTopics(List<String> topicIds, boolean forceSync) thro
} }


@Override @Override
public void addNotificationListener(String topicId, NotificationListener listener) throws UnavailableTopicException { public void addNotificationListener(Long topicId, NotificationListener listener) throws UnavailableTopicException {
if (topicId == null || listener == null) { if (listener == null) {
LOG.warn("Failed to add listener: id={}, listener={}", topicId, listener); LOG.warn("Failed to add listener: id={}, listener={}", topicId, listener);
throw new IllegalArgumentException("Bad listener data"); throw new IllegalArgumentException("Bad listener data");
} }
Expand All @@ -233,7 +233,7 @@ public void addNotificationListener(String topicId, NotificationListener listene
} }


@Override @Override
public void removeNotificationListener(String topicId, NotificationListener listener) throws UnavailableTopicException { public void removeNotificationListener(Long topicId, NotificationListener listener) throws UnavailableTopicException {
if (topicId == null || listener == null) { if (topicId == null || listener == null) {
LOG.warn("Failed to remove listener: id={}, listener={}", topicId, listener); LOG.warn("Failed to remove listener: id={}, listener={}", topicId, listener);
throw new IllegalArgumentException("Bad listener data"); throw new IllegalArgumentException("Bad listener data");
Expand All @@ -257,7 +257,7 @@ public void sync() {


@Override @Override
public void topicsListUpdated(final List<Topic> list) { public void topicsListUpdated(final List<Topic> list) {
Map<String, Topic> newTopics = new HashMap<String, Topic>(); Map<Long, Topic> newTopics = new HashMap<>();


synchronized (topics) { synchronized (topics) {
for (Topic topic : list) { for (Topic topic : list) {
Expand Down Expand Up @@ -329,7 +329,7 @@ public void run() {
} }
} }


private void updateSubscriptionInfo(String id, SubscriptionCommandType type) { private void updateSubscriptionInfo(Long id, SubscriptionCommandType type) {
synchronized (subscriptionInfo) { synchronized (subscriptionInfo) {
subscriptionInfo.add(new SubscriptionCommand(id, type)); subscriptionInfo.add(new SubscriptionCommand(id, type));
} }
Expand All @@ -341,7 +341,7 @@ private void updateSubscriptionInfo(List<SubscriptionCommand> subscriptionUpdate
} }
} }


private Topic findTopicById(String id) throws UnavailableTopicException { private Topic findTopicById(Long id) throws UnavailableTopicException {
synchronized (topics) { synchronized (topics) {
Topic topic = topics.get(id); Topic topic = topics.get(id);
if (topic == null) { if (topic == null) {
Expand Down
Expand Up @@ -37,6 +37,6 @@ public interface NotificationListener {
* @param notification the notification object. * @param notification the notification object.
* *
*/ */
void onNotification(String topicId, Notification notification); void onNotification(long topicId, Notification notification);


} }
Expand Up @@ -20,8 +20,8 @@
* <p>Wrapper class for a topic subscription stuff.</p> * <p>Wrapper class for a topic subscription stuff.</p>
* *
* <p><b>This class is deprecated</b>. Use instead: * <p><b>This class is deprecated</b>. Use instead:
* {@link NotificationManager#subscribeToTopic(String, boolean)}, * {@link NotificationManager#subscribeToTopic(Long, boolean)},
* {@link NotificationManager#addNotificationListener(String, NotificationListener)}, * {@link NotificationManager#addNotificationListener(Long, NotificationListener)},
* {@link NotificationManager#subscribeToTopics(java.util.List, boolean)}, * {@link NotificationManager#subscribeToTopics(java.util.List, boolean)},
* {@link NotificationManager#addTopicListListener(NotificationTopicListListener)}.</p> * {@link NotificationManager#addTopicListListener(NotificationTopicListListener)}.</p>
* *
Expand Down

0 comments on commit 7727372

Please sign in to comment.