*/
package org.opendaylight.controller.sal.binding.impl;
-import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
-import com.google.common.collect.SetMultimap;
public class NotificationBrokerImpl implements NotificationProviderService, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(NotificationBrokerImpl.class);
private final ListenerRegistry<NotificationInterestListener> interestListeners =
ListenerRegistry.create();
- private final Multimap<Class<? extends Notification>,NotificationListener<? extends Object>> listeners;
+ private final Multimap<Class<? extends Notification>, NotificationListener<?>> listeners =
+ Multimaps.synchronizedSetMultimap(HashMultimap.<Class<? extends Notification>, NotificationListener<?>>create());
private ExecutorService executor;
- public NotificationBrokerImpl() {
- HashMultimap<Class<? extends Notification>,NotificationListener<? extends Object>> _create = HashMultimap.<Class<? extends Notification>, NotificationListener<? extends Object>>create();
- SetMultimap<Class<? extends Notification>,NotificationListener<? extends Object>> _synchronizedSetMultimap = Multimaps.<Class<? extends Notification>, NotificationListener<? extends Object>>synchronizedSetMultimap(_create);
- this.listeners = _synchronizedSetMultimap;
- }
-
@Deprecated
public NotificationBrokerImpl(final ExecutorService executor) {
- HashMultimap<Class<? extends Notification>,NotificationListener<? extends Object>> _create = HashMultimap.<Class<? extends Notification>, NotificationListener<? extends Object>>create();
- SetMultimap<Class<? extends Notification>,NotificationListener<? extends Object>> _synchronizedSetMultimap = Multimaps.<Class<? extends Notification>, NotificationListener<? extends Object>>synchronizedSetMultimap(_create);
- this.listeners = _synchronizedSetMultimap;
this.setExecutor(executor);
}
this.executor = Preconditions.checkNotNull(executor);
}
- public Iterable<Class<? extends Object>> getNotificationTypes(final Notification notification) {
- Class<? extends Notification> _class = notification.getClass();
- Class<? extends Object>[] _interfaces = _class.getInterfaces();
- final Function1<Class<? extends Object>,Boolean> _function = new Function1<Class<? extends Object>,Boolean>() {
+ public Iterable<Class<?>> getNotificationTypes(final Notification notification) {
+ Class<?>[] _interfaces = notification.getClass().getInterfaces();
+ final Function1<Class<?>, Boolean> _function = new Function1<Class<?>, Boolean>() {
@Override
- public Boolean apply(final Class<? extends Object> it) {
- boolean _and = false;
- boolean _notEquals = (!Objects.equal(it, Notification.class));
- if (!_notEquals) {
- _and = false;
- } else {
- boolean _isAssignableFrom = Notification.class.isAssignableFrom(it);
- _and = (_notEquals && _isAssignableFrom);
+ public Boolean apply(final Class<?> it) {
+ if (Notification.class.equals(it)) {
+ return false;
}
- return Boolean.valueOf(_and);
+ return Notification.class.isAssignableFrom(it);
}
};
- Iterable<Class<? extends Object>> _filter = IterableExtensions.<Class<? extends Object>>filter(((Iterable<Class<? extends Object>>)Conversions.doWrapArray(_interfaces)), _function);
- return _filter;
+ return IterableExtensions.filter(((Iterable<Class<?>>)Conversions.doWrapArray(_interfaces)), _function);
}
@Override
@Override
public void publish(final Notification notification, final ExecutorService service) {
- final Iterable<Class<? extends Object>> allTypes = this.getNotificationTypes(notification);
- Iterable<NotificationListener<? extends Object>> listenerToNotify = Collections.<NotificationListener<? extends Object>>emptySet();
- for (final Class<? extends Object> type : allTypes) {
- Collection<NotificationListener<? extends Object>> _get = this.listeners.get(((Class<? extends Notification>) type));
- Iterable<NotificationListener<? extends Object>> _plus = Iterables.<NotificationListener<? extends Object>>concat(listenerToNotify, _get);
- listenerToNotify = _plus;
+ Iterable<NotificationListener<?>> listenerToNotify = Collections.emptySet();
+ for (final Class<?> type : getNotificationTypes(notification)) {
+ listenerToNotify = Iterables.concat(listenerToNotify, listeners.get(((Class<? extends Notification>) type)));
}
- final Function1<NotificationListener<? extends Object>,NotifyTask> _function = new Function1<NotificationListener<? extends Object>,NotifyTask>() {
+ final Function1<NotificationListener<?>,NotifyTask> _function = new Function1<NotificationListener<?>, NotifyTask>() {
@Override
- public NotifyTask apply(final NotificationListener<? extends Object> it) {
- NotifyTask _notifyTask = new NotifyTask(it, notification);
- return _notifyTask;
+ public NotifyTask apply(final NotificationListener<?> it) {
+ return new NotifyTask(it, notification);
}
};
- Iterable<NotifyTask> _map = IterableExtensions.<NotificationListener<? extends Object>, NotifyTask>map(listenerToNotify, _function);
- final Set<NotifyTask> tasks = IterableExtensions.<NotifyTask>toSet(_map);
+ final Set<NotifyTask> tasks = IterableExtensions.<NotifyTask>toSet(
+ IterableExtensions.<NotificationListener<?>, NotifyTask>map(listenerToNotify, _function));
this.submitAll(executor, tasks);
}
- public ImmutableSet<Future<Object>> submitAll(final ExecutorService service, final Set<NotifyTask> tasks) {
+ private ImmutableSet<Future<Object>> submitAll(final ExecutorService service, final Set<NotifyTask> tasks) {
final Builder<Future<Object>> ret = ImmutableSet.<Future<Object>>builder();
for (final NotifyTask task : tasks) {
- Future<Object> _submit = service.<Object>submit(task);
- ret.add(_submit);
+ ret.add(service.submit(task));
}
return ret.build();
}
@Override
public <T extends Notification> Registration<NotificationListener<T>> registerNotificationListener(final Class<T> notificationType, final NotificationListener<T> listener) {
- GenericNotificationRegistration<T> _genericNotificationRegistration = new GenericNotificationRegistration<T>(notificationType, listener, this);
- final GenericNotificationRegistration<T> reg = _genericNotificationRegistration;
+ final GenericNotificationRegistration<T> reg = new GenericNotificationRegistration<T>(notificationType, listener, this);
this.listeners.put(notificationType, listener);
this.announceNotificationSubscription(notificationType);
return reg;
@Override
public Registration<org.opendaylight.yangtools.yang.binding.NotificationListener> registerNotificationListener(final org.opendaylight.yangtools.yang.binding.NotificationListener listener) {
final NotificationInvoker invoker = SingletonHolder.INVOKER_FACTORY.invokerFor(listener);
- Set<Class<? extends Notification>> _supportedNotifications = invoker.getSupportedNotifications();
- for (final Class<? extends Notification> notifyType : _supportedNotifications) {
- {
- NotificationListener<Notification> _invocationProxy = invoker.getInvocationProxy();
- this.listeners.put(notifyType, _invocationProxy);
- this.announceNotificationSubscription(notifyType);
- }
+ for (final Class<? extends Notification> notifyType : invoker.getSupportedNotifications()) {
+ listeners.put(notifyType, invoker.getInvocationProxy());
+ announceNotificationSubscription(notifyType);
}
- GeneratedListenerRegistration _generatedListenerRegistration = new GeneratedListenerRegistration(listener, invoker, this);
- final GeneratedListenerRegistration registration = _generatedListenerRegistration;
- return (registration);
+
+ return new GeneratedListenerRegistration(listener, invoker, this);
}
- protected boolean unregisterListener(final GenericNotificationRegistration<? extends Object> reg) {
- Class<? extends Notification> _type = reg.getType();
- NotificationListener<? extends Notification> _instance = reg.getInstance();
- boolean _remove = this.listeners.remove(_type, _instance);
- return _remove;
+ protected boolean unregisterListener(final GenericNotificationRegistration<?> reg) {
+ return listeners.remove(reg.getType(), reg.getInstance());
}
protected void unregisterListener(final GeneratedListenerRegistration reg) {
- NotificationInvoker _invoker = reg.getInvoker();
- Set<Class<? extends Notification>> _supportedNotifications = _invoker.getSupportedNotifications();
- for (final Class<? extends Notification> notifyType : _supportedNotifications) {
- NotificationInvoker _invoker_1 = reg.getInvoker();
- NotificationListener<Notification> _invocationProxy = _invoker_1.getInvocationProxy();
- this.listeners.remove(notifyType, _invocationProxy);
+ final NotificationInvoker invoker = reg.getInvoker();
+ for (final Class<? extends Notification> notifyType : invoker.getSupportedNotifications()) {
+ this.listeners.remove(notifyType, invoker.getInvocationProxy());
}
}
@Override
public ListenerRegistration<NotificationInterestListener> registerInterestListener(final NotificationInterestListener interestListener) {
final ListenerRegistration<NotificationInterestListener> registration = this.interestListeners.register(interestListener);
- Set<Class<? extends Notification>> _keySet = this.listeners.keySet();
- for (final Class<? extends Notification> notification : _keySet) {
+ for (final Class<? extends Notification> notification : listeners.keySet()) {
interestListener.onNotificationSubscribtion(notification);
}
return registration;
import java.util.concurrent.Callable;
-import org.eclipse.xtext.xbase.lib.Exceptions;
-import org.eclipse.xtext.xbase.lib.Functions.Function0;
-import org.eclipse.xtext.xbase.lib.util.ToStringHelper;
import org.opendaylight.controller.sal.binding.api.NotificationListener;
import org.opendaylight.yangtools.yang.binding.Notification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class NotifyTask implements Callable<Object> {
- private static Logger log = new Function0<Logger>() {
- @Override
- public Logger apply() {
- Logger _logger = LoggerFactory.getLogger(NotifyTask.class);
- return _logger;
- }
- }.apply();
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
- @SuppressWarnings("rawtypes")
- private final NotificationListener _listener;
+class NotifyTask implements Callable<Object> {
+ private static final Logger LOG = LoggerFactory.getLogger(NotifyTask.class);
- public NotificationListener getListener() {
- return this._listener;
- }
+ private final NotificationListener<?> listener;
+ private final Notification notification;
- private final Notification _notification;
+ public NotifyTask(final NotificationListener<?> listener, final Notification notification) {
+ this.listener = Preconditions.checkNotNull(listener);
+ this.notification = Preconditions.checkNotNull(notification);
+ }
- public Notification getNotification() {
- return this._notification;
+ @SuppressWarnings("unchecked")
+ private <T extends Notification> NotificationListener<T> getListener() {
+ return (NotificationListener<T>)listener;
}
@Override
public Object call() {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Delivering notification {} to {}", notification, listener);
+ } else {
+ LOG.trace("Delivering notification {} to {}", notification.getClass().getName(), listener);
+ }
+
try {
- boolean _isDebugEnabled = NotifyTask.log.isDebugEnabled();
- if (_isDebugEnabled) {
- Notification _notification = this.getNotification();
- NotificationListener _listener = this.getListener();
- NotifyTask.log.debug("Delivering notification {} to {}", _notification, _listener);
- } else {
- Notification _notification_1 = this.getNotification();
- Class<? extends Notification> _class = _notification_1.getClass();
- String _name = _class.getName();
- NotificationListener _listener_1 = this.getListener();
- NotifyTask.log.trace("Delivering notification {} to {}", _name, _listener_1);
- }
- NotificationListener _listener_2 = this.getListener();
- Notification _notification_2 = this.getNotification();
- _listener_2.onNotification(_notification_2);
- boolean _isDebugEnabled_1 = NotifyTask.log.isDebugEnabled();
- if (_isDebugEnabled_1) {
- Notification _notification_3 = this.getNotification();
- NotificationListener _listener_3 = this.getListener();
- NotifyTask.log.debug("Notification delivered {} to {}", _notification_3, _listener_3);
- } else {
- Notification _notification_4 = this.getNotification();
- Class<? extends Notification> _class_1 = _notification_4.getClass();
- String _name_1 = _class_1.getName();
- NotificationListener _listener_4 = this.getListener();
- NotifyTask.log.trace("Notification delivered {} to {}", _name_1, _listener_4);
- }
- } catch (final Throwable _t) {
- if (_t instanceof Exception) {
- final Exception e = (Exception)_t;
- NotificationListener _listener_5 = this.getListener();
- NotifyTask.log.error("Unhandled exception thrown by listener: {}", _listener_5, e);
- } else {
- throw Exceptions.sneakyThrow(_t);
- }
+ getListener().onNotification(notification);
+ } catch (final Exception e) {
+ LOG.error("Unhandled exception thrown by listener: {}", listener, e);
+ }
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Notification delivered {} to {}", notification, listener);
+ } else {
+ LOG.trace("Notification delivered {} to {}", notification.getClass().getName(), listener);
}
- return null;
- }
- public NotifyTask(final NotificationListener listener, final Notification notification) {
- super();
- this._listener = listener;
- this._notification = notification;
+ return null;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + ((_listener== null) ? 0 : _listener.hashCode());
- result = prime * result + ((_notification== null) ? 0 : _notification.hashCode());
+ result = prime * result + ((listener== null) ? 0 : listener.hashCode());
+ result = prime * result + ((notification== null) ? 0 : notification.hashCode());
return result;
}
if (getClass() != obj.getClass())
return false;
NotifyTask other = (NotifyTask) obj;
- if (_listener == null) {
- if (other._listener != null)
+ if (listener == null) {
+ if (other.listener != null)
return false;
- } else if (!_listener.equals(other._listener))
+ } else if (!listener.equals(other.listener))
return false;
- if (_notification == null) {
- if (other._notification != null)
+ if (notification == null) {
+ if (other.notification != null)
return false;
- } else if (!_notification.equals(other._notification))
+ } else if (!notification.equals(other.notification))
return false;
return true;
}
@Override
public String toString() {
- String result = new ToStringHelper().toString(this);
- return result;
+ return Objects.toStringHelper(this)
+ .add("listener", listener)
+ .add("notification", notification.getClass())
+ .toString();
}
}