/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.config; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import javax.inject.Provider; import com.google.common.collect.Maps; import com.opengamma.sesame.OutputName; import com.opengamma.sesame.function.scenarios.ScenarioDefinition; /** * Mini DSL for building instances of {@link ViewConfig} and related classes in code. */ public final class ConfigBuilder { private static final Map<Class<?>, FunctionArguments> EMPTY_ARGUMENTS = Collections.emptyMap(); private static final Map<Class<?>, Class<?>> EMPTY_OVERRIDES = Collections.emptyMap(); private ConfigBuilder() { } public static ViewConfig configureView(String name, ViewColumn... columns) { return new ViewConfig(name, FunctionModelConfig.EMPTY, Arrays.asList(columns)); } public static ViewConfig configureView(String name, FunctionModelConfig defaultConfig, ViewColumn... columns) { return new ViewConfig(name, defaultConfig, Arrays.asList(columns)); } public static ViewConfig configureView(String name, NonPortfolioOutput... nonPortfolioOutputs) { return new ViewConfig(name, FunctionModelConfig.EMPTY, Collections.<ViewColumn>emptyList(), Arrays.asList(nonPortfolioOutputs), ScenarioDefinition.EMPTY); } public static ViewConfig configureView(String name, Columns columns, OtherOutputs otherOutputs) { return new ViewConfig(name, columns.getDefaultConfig(), columns.getViewColumns(), otherOutputs.getNonPortfolioOutputs(), ScenarioDefinition.EMPTY); } public static ViewConfig configureView(String name, FunctionModelConfig defaultConfig, Columns columns, OtherOutputs otherOutputs) { return new ViewConfig(name, defaultConfig, columns.getViewColumns(), otherOutputs.getNonPortfolioOutputs(), ScenarioDefinition.EMPTY); } public static Columns columns(ViewColumn... columns) { return new Columns(FunctionModelConfig.EMPTY, columns); } public static OtherOutputs nonPortfolioOutputs(NonPortfolioOutput... nonPortfolioOutputs) { return new OtherOutputs(nonPortfolioOutputs); } private static Map<Class<?>, ViewOutput> createTargetOutputs(TargetOutput... outputs) { Map<Class<?>, ViewOutput> targetOutputs = Maps.newHashMap(); for (TargetOutput output : outputs) { targetOutputs.put(output._inputType, output._output); } return targetOutputs; } public static ViewColumn column(String name) { return new ViewColumn(name, new ViewOutput(OutputName.of(name)), Collections.<Class<?>, ViewOutput>emptyMap()); } public static ViewColumn column(String name, String outputName) { return new ViewColumn(name, new ViewOutput(OutputName.of(outputName)), Collections.<Class<?>, ViewOutput>emptyMap()); } public static ViewColumn column(String name, FunctionModelConfig config) { return new ViewColumn(name, new ViewOutput(OutputName.of(name), config), Collections.<Class<?>, ViewOutput>emptyMap()); } public static ViewColumn column(String name, TargetOutput... outputs) { return new ViewColumn(name, new ViewOutput(OutputName.of(name)), createTargetOutputs(outputs)); } public static ViewColumn column(String name, String outputName, TargetOutput... outputs) { return new ViewColumn(name, new ViewOutput(OutputName.of(outputName)), createTargetOutputs(outputs)); } public static ViewColumn column(String name, String outputName, FunctionModelConfig config) { return new ViewColumn(name, new ViewOutput(OutputName.of(outputName), config), Collections.<Class<?>, ViewOutput>emptyMap()); } public static ViewColumn column(String name, FunctionModelConfig config, TargetOutput... targetOutputs) { return new ViewColumn(name, new ViewOutput(OutputName.of(name), config), createTargetOutputs(targetOutputs)); } public static ViewColumn column(String name, String outputName, FunctionModelConfig config, TargetOutput... targetOutputs) { return new ViewColumn(name, new ViewOutput(OutputName.of(outputName), config), createTargetOutputs(targetOutputs)); } public static TargetOutput output(String outputName, Class<?> inputType) { return new TargetOutput(new ViewOutput(OutputName.of(outputName)), inputType); } public static TargetOutput output(String outputName, Class<?> inputType, FunctionModelConfig config) { return new TargetOutput(new ViewOutput(OutputName.of(outputName), config), inputType); } public static ViewOutput output(String outputName, FunctionModelConfig config) { return new ViewOutput(OutputName.of(outputName), config); } public static ViewOutput output(String outputName) { return new ViewOutput(OutputName.of(outputName), FunctionModelConfig.EMPTY); } public static NonPortfolioOutput nonPortfolioOutput(String name, ViewOutput output) { return new NonPortfolioOutput(name, output); } public static TargetOutput output(Class<?> inputType, FunctionModelConfig config) { return new TargetOutput(new ViewOutput(config), inputType); } public static TargetOutput output(Class<?> inputType) { return new TargetOutput(new ViewOutput(FunctionModelConfig.EMPTY), inputType); } public static FunctionModelConfig config(Implementations implementations, Arguments arguments) { return createConfig(implementations._implementations, arguments._arguments); } public static FunctionModelConfig config() { return createConfig(EMPTY_OVERRIDES, EMPTY_ARGUMENTS); } public static FunctionModelConfig config(Implementations implementations) { return createConfig(implementations._implementations, EMPTY_ARGUMENTS); } public static FunctionModelConfig config(Arguments arguments) { return createConfig(EMPTY_OVERRIDES, arguments._arguments); } public static FunctionModelConfig config(Arguments arguments, Implementations implementations) { return createConfig(implementations._implementations, arguments._arguments); } private static FunctionModelConfig createConfig(Map<Class<?>, Class<?>> implementations, Map<Class<?>, FunctionArguments> arguments) { return new FunctionModelConfig(implementations, arguments); } public static Implementations implementations(Class<?>... impls) { return new Implementations(impls); } public static FnArgs function(Class<?> functionType, Arg... args) { return new FnArgs(functionType, args); } public static Arguments arguments(FnArgs... args) { return new Arguments(args); } public static Arg argument(String name, Object value) { return new Arg(name, value); } //------------------------------------------------------------------------- /** * Builder class for implementations. */ public static final class Implementations { private final Map<Class<?>, Class<?>> _implementations = Maps.newHashMap(); private Implementations(Class<?>... implementations) { if ((implementations.length % 2) != 0) { throw new IllegalArgumentException("Overrides must be specified in pairs of interface implementation"); } for (int i = 0; i < implementations.length; i += 2) { Class<?> parent = implementations[i]; Class<?> impl = implementations[i + 1]; if (!parent.isAssignableFrom(impl) && !Provider.class.isAssignableFrom(impl)) { throw new IllegalArgumentException(impl + " function not an implementation of " + parent); } _implementations.put(parent, impl); } } } //------------------------------------------------------------------------- /** * Builder class for arguments. */ public static final class Arguments { private final Map<Class<?>, FunctionArguments> _arguments = Maps.newHashMap(); private Arguments(FnArgs... args) { for (FnArgs arg : args) { _arguments.put(arg._function, arg._args); } } } //------------------------------------------------------------------------- /** * Builder class for function arguments. */ public static final class FnArgs { private final Class<?> _function; private final FunctionArguments _args; private FnArgs(Class<?> function, Arg... args) { _function = function; Map<String, Object> argVals = Maps.newHashMap(); for (Arg arg : args) { argVals.put(arg._name, arg._value); } _args = new FunctionArguments(argVals); } } //------------------------------------------------------------------------- /** * Builder class for argument. */ public static final class Arg { private final String _name; private final Object _value; private Arg(String name, Object value) { _name = name; _value = value; } } //------------------------------------------------------------------------- /** * Builder class for target outputs. */ public static final class TargetOutput { private final ViewOutput _output; private final Class<?> _inputType; private TargetOutput(ViewOutput output, Class<?> inputType) { _output = output; _inputType = inputType; } } //------------------------------------------------------------------------- /** * Builder class for columns. */ private static final class Columns { private final FunctionModelConfig _defaultConfig; private final List<ViewColumn> _viewColumns; private Columns(FunctionModelConfig defaultConfig, ViewColumn... viewColumns) { _defaultConfig = defaultConfig; _viewColumns = Arrays.asList(viewColumns); } public FunctionModelConfig getDefaultConfig() { return _defaultConfig; } public List<ViewColumn> getViewColumns() { return _viewColumns; } } //------------------------------------------------------------------------- /** * Builder class for other outputs. */ private static final class OtherOutputs { private final List<NonPortfolioOutput> _nonPortfolioOutputs; private OtherOutputs(NonPortfolioOutput... nonPortfolioOutputs) { _nonPortfolioOutputs = Arrays.asList(nonPortfolioOutputs); } public List<NonPortfolioOutput> getNonPortfolioOutputs() { return _nonPortfolioOutputs; } } }