/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.analytics.push;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import com.opengamma.core.change.ChangeEvent;
import com.opengamma.core.change.ChangeListener;
import com.opengamma.core.change.ChangeProvider;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.web.analytics.rest.MasterType;
/**
* Dispatches notifications to listeners when data changes in a master.
*/
public class MasterChangeManager {
/** Listeners for changes in data in a master */
private final Set<MasterChangeListener> _listeners = new CopyOnWriteArraySet<MasterChangeListener>();
/**
* Creates a new instance that will receive change events from the change providers and dispatch them to its
* listeners.
* @param changeProviders Providers of change events from masters keyed by the type of the master which
* produces their events.
*/
public MasterChangeManager(Map<MasterType, ChangeProvider> changeProviders) {
for (Map.Entry<MasterType, ChangeProvider> entry : changeProviders.entrySet()) {
final MasterType masterType = entry.getKey();
ChangeProvider changeProvider = entry.getValue();
changeProvider.changeManager().addChangeListener(new ChangeListener() {
@Override
public void entityChanged(ChangeEvent event) {
MasterChangeManager.this.entityChanged(masterType);
}
});
}
}
/* package */ void addChangeListener(MasterChangeListener listener) {
ArgumentChecker.notNull(listener, "listener");
_listeners.add(listener);
}
/* package */ void removeChangeListener(MasterChangeListener listener) {
_listeners.remove(listener);
}
private void entityChanged(MasterType masterType) {
for (MasterChangeListener listener : _listeners) {
listener.masterChanged(masterType);
}
}
}