/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.core.change;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.threeten.bp.Instant;
import com.opengamma.id.ObjectId;
/**
* Change manager that passes listeners to multiple underlying managers.
* <p>
* Unlike an {@link AggregatingChangeManager} no events can be generated locally for its immediate listeners.
*/
public class PassthroughChangeManager implements ChangeManager {
private final List<ChangeManager> _underlying = new CopyOnWriteArrayList<ChangeManager>();
/**
* Creates an instance.
*/
public PassthroughChangeManager() {
}
/**
* Creates an instance.
*
* @param changeProviders the underlying change providers, not null and not containing null
*/
public PassthroughChangeManager(final Iterable<? extends ChangeProvider> changeProviders) {
for (final ChangeProvider changeProvider : changeProviders) {
addChangeManager(changeProvider.changeManager());
}
}
/**
* Creates an instance.
*
* @param changeProviders the underlying change providers, not null and not containing null
*/
public PassthroughChangeManager(final ChangeProvider... changeProviders) {
for (final ChangeProvider changeProvider : changeProviders) {
addChangeManager(changeProvider.changeManager());
}
}
/**
* Adds the manager as an underlying. Once added as an underlying, the manager cannot be removed. Any requests to add or remove a listener made on this instance will be passed to all underlying
* change managers.
*
* @param changeManager the change manager to add, not null
*/
public void addChangeManager(final ChangeManager changeManager) {
_underlying.add(changeManager);
}
// ChangeManager
@Override
public void addChangeListener(final ChangeListener listener) {
for (final ChangeManager underlying : _underlying) {
underlying.addChangeListener(listener);
}
}
@Override
public void removeChangeListener(final ChangeListener listener) {
for (final ChangeManager underlying : _underlying) {
underlying.removeChangeListener(listener);
}
}
@Override
public void entityChanged(final ChangeType type, final ObjectId oid, final Instant versionFrom, final Instant versionTo, final Instant versionInstant) {
throw new UnsupportedOperationException();
}
}