/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame;
import java.util.List;
import java.util.Objects;
import org.threeten.bp.LocalDate;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.sesame.function.scenarios.FilteredScenarioDefinition;
import com.opengamma.sesame.function.scenarios.ScenarioArgument;
import com.opengamma.sesame.function.scenarios.ScenarioFunction;
import com.opengamma.sesame.marketdata.MarketDataBundle;
import com.opengamma.util.ArgumentChecker;
/**
* <p>Simple immutable {@link Environment} implementation.
* Functions should not create instances of this directly. If a function needs to modify the environment
* before calling another function it should use the helper methods on the {@link Environment} interface, e.g.
* {@link Environment#withValuationTime(ZonedDateTime)} etc.</p>
*
* <p>Instances should only be created in test cases or for passing to functions executing outside the engine.
* If a function directly creates its own environments in a running engine it could dramatically affect performance
* by preventing caching of shared values and forcing them to be recalculated every time they are used.</p>
*/
public final class SimpleEnvironment implements Environment {
// TODO an inner class used by all environment impls that is used for hashCode and equals
// makes it explicit which parts of the environment are part of the cache key and which ones are ignored
/** The valuation time. */
private final ZonedDateTime _valuationTime;
/** The function that provides market data. */
private final MarketDataBundle _marketDataBundle;
/** Scenario definition. */
private final FilteredScenarioDefinition _scenarioDefinition;
public SimpleEnvironment(ZonedDateTime valuationTime,
MarketDataBundle marketDataBundle) {
this(valuationTime, marketDataBundle, FilteredScenarioDefinition.EMPTY);
}
public SimpleEnvironment(ZonedDateTime valuationTime,
MarketDataBundle marketDataBundle,
FilteredScenarioDefinition scenarioDefinition) {
_valuationTime = ArgumentChecker.notNull(valuationTime, "valuationTime");
_marketDataBundle = ArgumentChecker.notNull(marketDataBundle, "marketDataSource");
_scenarioDefinition = ArgumentChecker.notNull(scenarioDefinition, "scenarioDefinition");
}
@Override
public LocalDate getValuationDate() {
return _valuationTime.toLocalDate();
}
@Override
public ZonedDateTime getValuationTime() {
return _valuationTime;
}
@Override
public MarketDataBundle getMarketDataBundle() {
return _marketDataBundle;
}
@Override
public <A extends ScenarioArgument<A, F>, F extends ScenarioFunction<A, F>> List<A> getScenarioArguments(
ScenarioFunction<A, F> scenarioFunction) {
return _scenarioDefinition.getArguments(scenarioFunction);
}
@Override
public FilteredScenarioDefinition getScenarioDefinition() {
return _scenarioDefinition;
}
@Override
public Environment withValuationTime(ZonedDateTime valuationTime) {
return new SimpleEnvironment(
ArgumentChecker.notNull(valuationTime, "valuationTime"), _marketDataBundle.withTime(valuationTime), _scenarioDefinition);
}
@Override
public Environment withValuationTimeAndFixedMarketData(ZonedDateTime valuationTime) {
return new SimpleEnvironment(
ArgumentChecker.notNull(valuationTime, "valuationTime"), _marketDataBundle, _scenarioDefinition);
}
@Override
public Environment withMarketData(MarketDataBundle marketData) {
return new SimpleEnvironment(_valuationTime, ArgumentChecker.notNull(marketData, "marketData"), _scenarioDefinition);
}
@Override
public Environment withScenarioDefinition(FilteredScenarioDefinition scenarioDefinition) {
return new SimpleEnvironment(_valuationTime, _marketDataBundle, scenarioDefinition);
}
@Override
public int hashCode() {
return Objects.hash(_valuationTime, _marketDataBundle, _scenarioDefinition);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final SimpleEnvironment other = (SimpleEnvironment) obj;
return Objects.equals(this._valuationTime, other._valuationTime) &&
Objects.equals(this._marketDataBundle, other._marketDataBundle) &&
Objects.equals(this._scenarioDefinition, other._scenarioDefinition);
}
@Override
public String toString() {
return "SimpleEnvironment [" +
"_valuationTime=" + _valuationTime +
", _marketDataSource=" + _marketDataBundle +
", _scenarioArguments=" + _scenarioDefinition +
"]";
}
}