/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.notification.internal;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;
import de.rcenvironment.core.notification.NotificationSubscriber;
/**
* Objects of this class represent local notification topics used by the notification service. They
* are created when a {@link Notification} concerning that topic is sent or an
* {@link NotificationSubscriber} is registered for that topic. Local and remote
* {@link NotificationSubscriber}s for this {@link NotificationTopic} are stored here.
*
* @author Andre Nurzenski
* @author Doreen Seider
*/
public class NotificationTopic {
/** The identifier of this notification topic (can be an regEx). */
private String notificationId;
/** The cached, pre-compiled notification filter derived from the notificationId field. */
private Pattern compiledRegExp;
private Set<NotificationSubscriber> subscribers = Collections.synchronizedSet(new HashSet<NotificationSubscriber>());
protected NotificationTopic(String notificationIdentifier) {
notificationId = notificationIdentifier;
}
/**
* Adds a local {@link NotificationSubscriber} to this {@link NotificationTopic}.
*
* @param subscriber The {@link NotificationSubscriber} to add.
*/
protected synchronized void add(NotificationSubscriber subscriber) {
subscribers.add(subscriber);
}
/**
* Removes a local {@link NotificationSubscriber} from this {@link NotificationTopic}.
*
* @param subscriber The {@link NotificationSubscriber} to remove.
*/
protected synchronized void remove(NotificationSubscriber subscriber) {
subscribers.remove(subscriber);
}
/**
* Returns the identifier of this {@link NotificationTopic}.
*
* @return The identifier of this {@link NotificationTopic} (can be an regEx).
*/
protected String getName() {
return notificationId;
}
/**
* Returns the regular expression filter used to check other notification ids whether they match
* this topic.
*
* @return the compiled regular expression to filter other notification ids against
*/
public Pattern getNotificationIdFilter() {
// Note: not synchronized to avoid overhead; race conditions arising from this should be
// harmless, as regexp compilation is deterministic, the assignment is atomic,
// and the performance cost of duplicate compilation is negligible. -- misc_ro
if (compiledRegExp == null) {
compiledRegExp = Pattern.compile("^" + notificationId + "$");
}
return compiledRegExp;
}
/**
* Returns the {@link NotificationSubscriber}s for this {@link NotificationTopic}.
*
* @return the {@link NotificationSubscriber}s.
*/
protected synchronized Set<NotificationSubscriber> getSubscribers() {
return new HashSet<NotificationSubscriber>(subscribers);
}
@Override
public boolean equals(Object object) {
if (object instanceof NotificationTopic) {
return notificationId.equals(((NotificationTopic) object).getName());
} else {
return false;
}
}
@Override
public int hashCode() {
return notificationId.hashCode();
}
}