/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.function.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.threeten.bp.Instant;
import com.opengamma.core.change.BasicChangeManager;
import com.opengamma.core.change.ChangeEvent;
import com.opengamma.core.change.ChangeListener;
import com.opengamma.core.change.ChangeManager;
import com.opengamma.core.change.ChangeProvider;
import com.opengamma.core.change.ChangeType;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.ArgumentChecker;
/**
* Partial implementation of {@link FunctionConfigurationSource} that supports listening to changes from an underlying provider.
*/
public abstract class DynamicFunctionConfigurationSource implements FunctionConfigurationSource {
private static final Logger s_logger = LoggerFactory.getLogger(DynamicFunctionConfigurationSource.class);
private final ChangeManager _underlying;
private final ChangeListener _changeListener = new ChangeListener() {
@Override
public void entityChanged(final ChangeEvent event) {
if (isPropogateEvent(event)) {
s_logger.info("Function configuration change at {} caused by {}", DynamicFunctionConfigurationSource.this, event);
_changeManager.entityChanged(ChangeType.CHANGED, FunctionConfigurationSource.OBJECT_ID, event.getVersionFrom(), event.getVersionTo(), event.getVersionInstant());
} else {
s_logger.debug("Ignoring event {} at {}", event, DynamicFunctionConfigurationSource.this);
}
}
};
private final BasicChangeManager _changeManager = new BasicChangeManager() {
@Override
public synchronized void addChangeListener(final ChangeListener listener) {
ArgumentChecker.notNull(listener, "listener");
if (getListeners().isEmpty()) {
s_logger.info("Registering listener for {}", DynamicFunctionConfigurationSource.this);
_underlying.addChangeListener(_changeListener);
}
super.addChangeListener(listener);
}
@Override
public synchronized void removeChangeListener(final ChangeListener listener) {
super.removeChangeListener(listener);
if (getListeners().isEmpty()) {
s_logger.info("Removing listener for {}", DynamicFunctionConfigurationSource.this);
_underlying.removeChangeListener(_changeListener);
}
}
};
public DynamicFunctionConfigurationSource(final ChangeManager underlying) {
_underlying = ArgumentChecker.notNull(underlying, "underlying");
}
public DynamicFunctionConfigurationSource(final ChangeProvider underlying) {
this(underlying.changeManager());
}
protected abstract boolean isPropogateEvent(ChangeEvent event);
protected abstract FunctionConfigurationBundle getFunctionConfiguration(VersionCorrection version);
@Override
public FunctionConfigurationBundle getFunctionConfiguration(Instant version) {
return getFunctionConfiguration(VersionCorrection.of(version, version));
}
@Override
public final ChangeManager changeManager() {
return _changeManager;
}
}