/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.view.execution; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.threeten.bp.Instant; import com.opengamma.util.ArgumentChecker; /** * Provides a finite sequence of view cycles. */ public class ArbitraryViewCycleExecutionSequence extends MergingViewCycleExecutionSequence { /** * Node in a singly linked list of cycles. This makes the copy operation cheaper. */ private static final class Cycle { private final ViewCycleExecutionOptions _options; private Cycle _next; public Cycle(final ViewCycleExecutionOptions options) { _options = options; } public ViewCycleExecutionOptions getOptions() { return _options; } public void setNext(final Cycle next) { _next = next; } public Cycle getNext() { return _next; } } private Cycle _executionSequenceHead; private int _size; public ArbitraryViewCycleExecutionSequence(Collection<ViewCycleExecutionOptions> executionSequence) { ArgumentChecker.notNull(executionSequence, "executionSequence"); final Iterator<ViewCycleExecutionOptions> itr = executionSequence.iterator(); if (itr.hasNext()) { _size = 1; _executionSequenceHead = new Cycle(itr.next()); Cycle tail = _executionSequenceHead; while (itr.hasNext()) { final Cycle next = new Cycle(itr.next()); tail.setNext(next); tail = next; _size++; } } } protected ArbitraryViewCycleExecutionSequence(ArbitraryViewCycleExecutionSequence copyFrom) { _executionSequenceHead = copyFrom._executionSequenceHead; _size = copyFrom._size; } /** * Gets a sequence for a single cycle which relies on default cycle execution options. * * @return the sequence, not null */ public static ArbitraryViewCycleExecutionSequence single() { return new ArbitraryViewCycleExecutionSequence(Collections.singletonList(new ViewCycleExecutionOptions())); } /** * Gets a sequence for a single cycle. * * @param executionOptions the execution options for the single cycle, not null * @return the sequence, not null */ public static ArbitraryViewCycleExecutionSequence single(ViewCycleExecutionOptions executionOptions) { return new ArbitraryViewCycleExecutionSequence(Collections.singletonList(executionOptions)); } /** * Gets a sequence for a collection of valuation times. * * @param valuationTimeProviders the valuation times, not null * @return the sequence, not null */ public static ArbitraryViewCycleExecutionSequence of(Instant... valuationTimeProviders) { return of(Arrays.asList(valuationTimeProviders)); } /** * Gets a sequence for a collection of valuation times. * * @param valuationTimeProviders the valuation times, not null * @return the sequence, not null */ public static ArbitraryViewCycleExecutionSequence of(Collection<Instant> valuationTimeProviders) { ArgumentChecker.notNull(valuationTimeProviders, "valuationTimeProviders"); List<ViewCycleExecutionOptions> executionSequence = new ArrayList<ViewCycleExecutionOptions>(valuationTimeProviders.size()); final ViewCycleExecutionOptions.Builder builder = ViewCycleExecutionOptions.builder(); for (Instant valuationTimeProvider : valuationTimeProviders) { ViewCycleExecutionOptions options = builder.setValuationTime(valuationTimeProvider).create(); executionSequence.add(options); } return new ArbitraryViewCycleExecutionSequence(executionSequence); } /** * Gets a sequence for a collection of cycles. * * @param executionSequence the sequence, not null * @return the sequence, not null */ public static ArbitraryViewCycleExecutionSequence of(ViewCycleExecutionOptions... executionSequence) { return new ArbitraryViewCycleExecutionSequence(Arrays.asList(executionSequence)); } public List<ViewCycleExecutionOptions> getRemainingSequence() { final List<ViewCycleExecutionOptions> result = new ArrayList<ViewCycleExecutionOptions>(_size); Cycle itr = _executionSequenceHead; while (itr != null) { result.add(itr.getOptions()); itr = itr.getNext(); } return result; } @Override public ViewCycleExecutionOptions poll(ViewCycleExecutionOptions defaultExecutionOptions) { Cycle head = _executionSequenceHead; if (head != null) { _executionSequenceHead = head.getNext(); _size--; return merge(head.getOptions(), defaultExecutionOptions); } else { return null; } } @Override public boolean isEmpty() { return _executionSequenceHead == null; } @Override public int estimateRemaining() { return _size; } @Override public ViewCycleExecutionSequence copy() { return new ArbitraryViewCycleExecutionSequence(this); } }