/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.depgraph.rest;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.threeten.bp.Instant;
import com.opengamma.engine.depgraph.DependencyGraph;
import com.opengamma.engine.depgraph.DependencyGraphBuilder;
import com.opengamma.engine.depgraph.ResolutionFailure;
import com.opengamma.engine.depgraph.ResolutionFailureAccumulator;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.function.resolver.DefaultCompiledFunctionResolver;
import com.opengamma.engine.function.resolver.ResolutionRule;
import com.opengamma.engine.marketdata.CombinedMarketDataProvider;
import com.opengamma.engine.marketdata.MarketDataProvider;
import com.opengamma.engine.marketdata.availability.MarketDataAvailabilityProvider;
import com.opengamma.engine.marketdata.resolver.MarketDataProviderResolver;
import com.opengamma.engine.marketdata.spec.MarketData;
import com.opengamma.engine.marketdata.spec.MarketDataSpecification;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.view.ViewCalculationConfiguration;
import com.opengamma.engine.view.ViewDefinition;
import com.opengamma.engine.view.worker.SnapshottingViewExecutionDataProvider;
import com.opengamma.financial.depgraph.provider.LocalDependencyGraphTraceProvider;
import com.opengamma.livedata.UserPrincipal;
/**
* Helper class for {@link LocalDependencyGraphTraceProvider}.
*
* Implements builder pattern with defaults.
*/
public class DependencyGraphTraceBuilder {
private final DependencyGraphBuilderResourceContextBean _builderContext;
public DependencyGraphTraceBuilder(DependencyGraphBuilderResourceContextBean builderContext) {
_builderContext = builderContext;
}
/**
* Builds the dependency graph trace with the configured params.
* @param properties the properties to use
* @return the built trace object
*/
public DependencyGraphBuildTrace build(DependencyGraphTraceBuilderProperties properties) {
final DependencyGraphBuilder builder = _builderContext.getDependencyGraphBuilderFactory().newInstance();
builder.setCalculationConfigurationName(properties.getCalculationConfigurationName());
final FunctionCompilationContext context = _builderContext.getFunctionCompilationContext().clone();
final ViewDefinition definition = new ViewDefinition("Mock View", "Test");
final ViewCalculationConfiguration calcConfig = new ViewCalculationConfiguration(definition, properties.getCalculationConfigurationName());
calcConfig.setDefaultProperties(properties.getDefaultProperties());
context.setViewCalculationConfiguration(calcConfig);
context.setComputationTargetResolver(context.getRawComputationTargetResolver().atVersionCorrection(properties.getResolutionTime()));
builder.setCompilationContext(context);
final Collection<ResolutionRule> rules = _builderContext.getFunctionResolver().compile((properties.getValuationTime() != null) ? properties.getValuationTime() : Instant.now())
.getAllResolutionRules();
// TODO: allow transformation rules
final DefaultCompiledFunctionResolver functions = new DefaultCompiledFunctionResolver(context, rules);
functions.compileRules();
builder.setFunctionResolver(functions);
builder.setFunctionExclusionGroups(_builderContext.getFunctionExclusionGroups());
// TODO this isn't used. is this OK?
final UserPrincipal marketDataUser = UserPrincipal.getLocalUser();
final MarketDataProviderResolver resolver = _builderContext.getMarketDataProviderResolver();
List<MarketDataSpecification> marketData = properties.getMarketData();
if (marketData == null || marketData.isEmpty()) {
marketData = Collections.<MarketDataSpecification>singletonList(MarketData.live());
}
MarketDataAvailabilityProvider availabilityProvider = new SnapshottingViewExecutionDataProvider(marketDataUser, marketData, resolver).getAvailabilityProvider();
builder.setMarketDataAvailabilityProvider(availabilityProvider);
final ResolutionFailureAccumulator resolutionFailureAccumulator = new ResolutionFailureAccumulator();
builder.setResolutionFailureListener(resolutionFailureAccumulator);
builder.setDisableFailureReporting(false);
for (final ValueRequirement requirement : properties.getRequirements()) {
builder.addTarget(requirement);
}
DependencyGraph dependencyGraph = builder.getDependencyGraph();
List<ResolutionFailure> resolutionFailures = resolutionFailureAccumulator.getResolutionFailures();
DependencyGraphBuildTrace graphBuildTrace = DependencyGraphBuildTrace.of(
dependencyGraph,
builder.getExceptions(),
resolutionFailures,
builder.getValueRequirementMapping());
return graphBuildTrace;
}
}