/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.master.historicaltimeseries.impl; import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicBoolean; import org.threeten.bp.LocalDate; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdWithDates; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult; import com.opengamma.util.ArgumentChecker; /** * Represents a cache item for storing {@link HistoricalTimeSeriesResolutionResult} instances for the same * {@link ExternalId} with differing validity periods. */ public class HistoricalTimeSeriesResolutionCacheItem { private final ExternalId _externalId; private final AtomicBoolean _allInvalid = new AtomicBoolean(); private final Set<LocalDate> _invalidDates = Collections.newSetFromMap(new ConcurrentHashMap<LocalDate, Boolean>()); private final ConcurrentMap<ExternalIdWithDates, HistoricalTimeSeriesResolutionResult> _results = new ConcurrentHashMap<>(); public HistoricalTimeSeriesResolutionCacheItem(ExternalId externalId) { _externalId = externalId; } //------------------------------------------------------------------------- public boolean isInvalid(LocalDate validityDate) { if (_allInvalid.get()) { return true; } if (validityDate == null) { return false; } return _invalidDates.contains(validityDate); } public void putInvalid(LocalDate validityDate) { if (validityDate == null) { if (_results.size() != 0) { throw new OpenGammaRuntimeException("Already have " + _results.size() + " valid results for " + _externalId + " but attempted to mark every date as invalid"); } _allInvalid.set(true); _invalidDates.clear(); } else { _invalidDates.add(validityDate); } } //------------------------------------------------------------------------- public HistoricalTimeSeriesResolutionResult get(LocalDate validityDate) { for (Map.Entry<ExternalIdWithDates, HistoricalTimeSeriesResolutionResult> result : _results.entrySet()) { if (result.getKey().isValidOn(validityDate)) { return result.getValue(); } } return null; } public void put(ExternalIdWithDates externalIdWithDates, HistoricalTimeSeriesResolutionResult result) { ArgumentChecker.notNull(externalIdWithDates, "externalIdWithDates"); ArgumentChecker.notNull(result, "result"); if (!_externalId.equals(externalIdWithDates.getExternalId())) { throw new IllegalArgumentException(externalIdWithDates + " is not compatible with " + _externalId); } if (!result.getHistoricalTimeSeriesInfo().getExternalIdBundle().contains(externalIdWithDates)) { throw new IllegalArgumentException("Result " + result + " does not contain " + externalIdWithDates); } _results.putIfAbsent(externalIdWithDates, result); } }