/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.marketdata; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CopyOnWriteArraySet; import org.threeten.bp.Duration; import org.threeten.bp.Instant; import com.opengamma.engine.value.ValueSpecification; /** * Abstract base class for {@link MarketDataProvider} implementations. */ public abstract class AbstractMarketDataProvider implements MarketDataProvider { private final CopyOnWriteArraySet<MarketDataListener> _listeners = new CopyOnWriteArraySet<MarketDataListener>(); @Override public void addListener(final MarketDataListener listener) { _listeners.add(listener); } @Override public void removeListener(final MarketDataListener listener) { _listeners.remove(listener); } @Override public Duration getRealTimeDuration(final Instant fromInstant, final Instant toInstant) { return Duration.between(fromInstant, toInstant); } //------------------------------------------------------------------------- protected void valueChanged(final ValueSpecification specification) { valuesChanged(Collections.singleton(specification)); } protected void valuesChanged(final Collection<ValueSpecification> specifications) { for (final MarketDataListener listener : getListeners()) { listener.valuesChanged(specifications); } } protected void subscriptionSucceeded(final ValueSpecification specification) { subscriptionsSucceeded(Collections.singleton(specification)); } protected void subscriptionsSucceeded(final Collection<ValueSpecification> specifications) { for (final MarketDataListener listener : getListeners()) { listener.subscriptionsSucceeded(specifications); } } protected void subscriptionFailed(final ValueSpecification specification, final String msg) { for (final MarketDataListener listener : getListeners()) { listener.subscriptionFailed(specification, msg); } } protected void subscriptionFailed(final Collection<ValueSpecification> specifications, final String msg) { for (final ValueSpecification specification : specifications) { subscriptionFailed(specification, msg); } } protected void subscriptionStopped(final ValueSpecification specification) { for (final MarketDataListener listener : getListeners()) { listener.subscriptionStopped(specification); } } protected void subscriptionStopped(final Collection<ValueSpecification> specifications) { for (final ValueSpecification specification : specifications) { subscriptionStopped(specification); } } //------------------------------------------------------------------------- /** * @return Collection will be unmodifiable. Iterating over it will not throw {link ConcurrentModificationException}. */ protected Collection<MarketDataListener> getListeners() { return Collections.unmodifiableCollection(_listeners); } }