/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.server;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.view.ViewCalculationConfiguration;
import com.opengamma.engine.view.ViewDefinition;
import com.opengamma.id.UniqueId;
import com.opengamma.livedata.UserPrincipal;
import com.opengamma.util.SingletonFactoryBean;
import com.opengamma.util.money.Currency;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
/**
* Creates a ViewDefinition.
*/
public class ViewDefinitionFactoryBean extends SingletonFactoryBean<ViewDefinition> {
private String _name;
private String _portfolioScheme;
private String _portfolioId;
private String _userName;
private Map<String, Map<String, String[]>> _portfolioRequirements;
private Long _minDeltaCalculationPeriod;
private Long _maxDeltaCalculationPeriod;
private Long _minFullCalculationPeriod;
private Long _maxFullCalculationPeriod;
private Map<String, Set<String[]>> _specificRequirements;
private Map<String, Map<String, String[]>> _tradeRequirements;
private Map<String, Map<String, String>> _defaultProperties;
private String _defaultCurrency = "GBP";
public void setName(final String name) {
_name = name;
}
public String getName() {
return _name;
}
public void setPortfolioScheme(final String portfolioScheme) {
_portfolioScheme = portfolioScheme;
}
public String getPortfolioScheme() {
return _portfolioScheme;
}
public void setPortfolioId(final String portfolioId) {
_portfolioId = portfolioId;
}
public String getPortfolioId() {
return _portfolioId;
}
public void setUserName(final String userName) {
_userName = userName;
}
public String getUserName() {
return _userName;
}
public void setUser(final UserPrincipal user) {
setUserName(user.getUserName());
}
public Long getMinDeltaCalculationPeriod() {
return _minDeltaCalculationPeriod;
}
public void setMinDeltaCalculationPeriod(Long period) {
_minDeltaCalculationPeriod = period;
}
public Long getMaxDeltaCalculationPeriod() {
return _maxDeltaCalculationPeriod;
}
public void setMaxDeltaCalculationPeriod(Long period) {
_maxDeltaCalculationPeriod = period;
}
public void setDeltaCalculationPeriod(Long deltaCalcPeriod) {
setMinDeltaCalculationPeriod(deltaCalcPeriod);
setMaxDeltaCalculationPeriod(deltaCalcPeriod);
}
public Long getMinFullCalculationPeriod() {
return _minFullCalculationPeriod;
}
public void setMinFullCalculationPeriod(Long period) {
_minFullCalculationPeriod = period;
}
public Long getMaxFullCalculationPeriod() {
return _maxFullCalculationPeriod;
}
public void setMaxFullCalculationPeriod(Long period) {
_maxFullCalculationPeriod = period;
}
public void setFullCalculationPeriod(Long fullCalcPeriod) {
setMinFullCalculationPeriod(fullCalcPeriod);
setMaxFullCalculationPeriod(fullCalcPeriod);
}
public String getDefaultCurrency() {
return _defaultCurrency;
}
public void setDefaultCurrency(final String defaultCurrency) {
_defaultCurrency = defaultCurrency;
}
/**
* Sets the value definitions as calcConfig -> (securityType -> requirementName).
*
* @param portfolioRequirements value definitions to set
*/
public void setPortfolioRequirements(final Map<String, Map<String, String[]>> portfolioRequirements) {
_portfolioRequirements = portfolioRequirements;
}
public Map<String, Map<String, String[]>> getPortfolioRequirements() {
return _portfolioRequirements;
}
public void setTradeRequirements(final Map<String, Map<String, String[]>> tradeRequirements) {
_tradeRequirements = tradeRequirements;
}
public Map<String, Map<String, String[]>> getTradeRequirements() {
return _tradeRequirements;
}
public void setDefaultProperties(final Map<String, Map<String, String>> defaultProperties) {
_defaultProperties = defaultProperties;
}
public Map<String, Map<String, String>> getDefaultProperties() {
return _defaultProperties;
}
public void setSpecificRequirements(final Map<String, Set<String[]>> specificRequirements) {
_specificRequirements = specificRequirements;
}
public Map<String, Set<String[]>> getSpecificRequirements() {
return _specificRequirements;
}
/**
* Parses a requirement written in the form {@code valueName[constraint=value;constraint=value;...]}.
*
* @param requirement string to parse
* @return the value name and constraints
*/
private Pair<String, ValueProperties> parseValueRequirement(final String requirement) {
// NOTE -- This is not at all robust as it is just a quick measure to drop constraints into the Spring config XML
int i = requirement.indexOf('[');
if (i < 0) {
return Pairs.of(requirement, ValueProperties.none());
}
final String valueName = requirement.substring(0, i);
final ValueProperties.Builder builder = ValueProperties.builder();
for (String constraint : requirement.substring(i + 1, requirement.length() - 1).split(";")) {
final String[] pair = constraint.split("=");
builder.with(pair[0], pair[1]);
}
return Pairs.of(valueName, builder.get());
}
@Override
protected ViewDefinition createObject() {
ViewDefinition viewDefinition;
if (getPortfolioScheme() != null && getPortfolioId() != null) {
viewDefinition = new ViewDefinition(getName(), UniqueId.of(getPortfolioScheme(), getPortfolioId()), getUserName());
if (getPortfolioRequirements() != null) {
for (Map.Entry<String, Map<String, String[]>> config : getPortfolioRequirements().entrySet()) {
ViewCalculationConfiguration calcConfig = getOrCreateCalcConfig(viewDefinition, config.getKey());
for (Map.Entry<String, String[]> security : config.getValue().entrySet()) {
for (String value : security.getValue()) {
final Pair<String, ValueProperties> requirement = parseValueRequirement(value);
calcConfig.addPortfolioRequirement(security.getKey(), requirement.getFirst(), requirement.getSecond());
}
}
}
}
} else {
viewDefinition = new ViewDefinition(getName(), getUserName());
}
viewDefinition.setMinDeltaCalculationPeriod(getMinDeltaCalculationPeriod());
viewDefinition.setMaxDeltaCalculationPeriod(getMaxDeltaCalculationPeriod());
viewDefinition.setMinFullCalculationPeriod(getMinFullCalculationPeriod());
viewDefinition.setMaxFullCalculationPeriod(getMaxFullCalculationPeriod());
if (getSpecificRequirements() != null) {
for (Entry<String, Set<String[]>> config : getSpecificRequirements().entrySet()) {
ViewCalculationConfiguration calcConfig = getOrCreateCalcConfig(viewDefinition, config.getKey());
for (String[] entry : config.getValue()) {
if (entry.length < 4) {
throw new OpenGammaRuntimeException("Not enough members of array in specific requirements. Need [0]=Name [1]=ComputationTargetType [2]=UniqueIdScheme [3]=UniqueIdValue");
}
final Pair<String, ValueProperties> requirement = parseValueRequirement(entry[0]);
String type = entry[1];
String scheme = entry[2];
String value = entry[3];
calcConfig.addSpecificRequirement(new ValueRequirement(requirement.getFirst(), ComputationTargetType.parse(type), UniqueId.of(scheme, value), requirement.getSecond()));
}
}
}
if (getDefaultCurrency() != null) {
viewDefinition.setDefaultCurrency(Currency.of(getDefaultCurrency()));
}
if (getDefaultProperties() != null) {
for (Entry<String, Map<String, String>> defaultProperties : getDefaultProperties().entrySet()) {
ViewCalculationConfiguration calcConfig = getOrCreateCalcConfig(viewDefinition, defaultProperties.getKey());
final ValueProperties.Builder properties = ValueProperties.builder();
for (Entry<String, String> property : defaultProperties.getValue().entrySet()) {
properties.with(property.getKey(), property.getValue());
}
calcConfig.setDefaultProperties(properties.get());
}
}
for (ViewCalculationConfiguration calcConfig : viewDefinition.getAllCalculationConfigurations()) {
if (calcConfig.getDefaultProperties().getValues(ValuePropertyNames.CURRENCY) == null) {
calcConfig.setDefaultProperties(calcConfig.getDefaultProperties().copy().with(ValuePropertyNames.CURRENCY, getDefaultCurrency()).get());
}
}
return viewDefinition;
}
private ViewCalculationConfiguration getOrCreateCalcConfig(ViewDefinition viewDefinition, String configName) {
ViewCalculationConfiguration calcConfig = viewDefinition.getCalculationConfiguration(configName);
if (calcConfig == null) {
calcConfig = new ViewCalculationConfiguration(viewDefinition, configName);
viewDefinition.addViewCalculationConfiguration(calcConfig);
}
return calcConfig;
}
}