com.opengamma.strata.engine.marketdata.CalculationRequirements.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.strata.engine.marketdata.CalculationRequirements.java

Source

/**
 * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.strata.engine.marketdata;

import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;

import org.joda.beans.Bean;
import org.joda.beans.BeanBuilder;
import org.joda.beans.BeanDefinition;
import org.joda.beans.ImmutableBean;
import org.joda.beans.JodaBeanUtils;
import org.joda.beans.MetaProperty;
import org.joda.beans.Property;
import org.joda.beans.PropertyDefinition;
import org.joda.beans.impl.direct.DirectFieldsBeanBuilder;
import org.joda.beans.impl.direct.DirectMetaBean;
import org.joda.beans.impl.direct.DirectMetaProperty;
import org.joda.beans.impl.direct.DirectMetaPropertyMap;

import com.google.common.collect.ImmutableSet;
import com.opengamma.strata.basics.currency.Currency;
import com.opengamma.strata.basics.market.MarketDataId;
import com.opengamma.strata.basics.market.ObservableId;

/**
 * A collection of market data IDs specifying the market data required for performing a set of calculations.
 */
@BeanDefinition(builderScope = "private", constructorScope = "package")
public final class CalculationRequirements implements ImmutableBean {

    /** A set of requirements which specifies that no market data is required. */
    private static final CalculationRequirements EMPTY = CalculationRequirements.builder().build();

    /** Keys identifying the market data values required for the calculations. */
    @PropertyDefinition(validate = "notNull", builderType = "Set<? extends ObservableId>")
    private final ImmutableSet<ObservableId> observables;

    /** Keys identifying the market data values required for the calculations. */
    @PropertyDefinition(validate = "notNull", builderType = "Set<? extends MarketDataId<?>>")
    private final ImmutableSet<MarketDataId<?>> nonObservables;

    /** Keys identifying the time series of market data values required for the calculations. */
    @PropertyDefinition(validate = "notNull", builderType = "Set<? extends ObservableId>")
    private final ImmutableSet<ObservableId> timeSeries;

    /**
     * The currencies in the calculation results. The market data must include FX rates in the
     * to allow conversion into the reporting currency. The FX rates must have the output currency as the base
     * currency and the reporting currency as the counter currency.
     */
    @PropertyDefinition(validate = "notNull")
    private final ImmutableSet<Currency> outputCurrencies;

    /**
     * Returns an empty mutable builder for building up a set of requirements.
     *
     * @return an empty mutable builder for building up a set of requirements
     */
    public static CalculationRequirementsBuilder builder() {
        return new CalculationRequirementsBuilder();
    }

    /**
     * Returns a set of requirements specifying that no market data is required.
     *
     * @return a set of requirements specifying that no market data is required
     */
    public static CalculationRequirements empty() {
        return EMPTY;
    }

    /**
     * Returns a set of calculation requirements built from a set of market data requirements.
     *
     * @param marketDataRequirements  a set of requirements for market data
     * @return a set of calculation requirements built from a set of market data requirements
     */
    public static CalculationRequirements of(MarketDataRequirements marketDataRequirements) {
        return CalculationRequirements.builder().addValues(marketDataRequirements.getObservables())
                .addValues(marketDataRequirements.getNonObservables())
                .addTimeSeries(marketDataRequirements.getTimeSeries()).build();
    }

    /**
     * Merges multiple sets of requirements into a single set.
     *
     * @param requirements  market data requirements
     * @return a single set of requirements containing all the requirements from the input sets
     */
    public static CalculationRequirements combine(List<CalculationRequirements> requirements) {
        ImmutableSet.Builder<ObservableId> observablesBuilder = ImmutableSet.builder();
        ImmutableSet.Builder<MarketDataId<?>> nonObservablesBuilder = ImmutableSet.builder();
        ImmutableSet.Builder<ObservableId> timeSeriesBuilder = ImmutableSet.builder();
        ImmutableSet.Builder<Currency> outputCurrenciesBuilder = ImmutableSet.builder();

        for (CalculationRequirements req : requirements) {
            observablesBuilder.addAll(req.observables);
            nonObservablesBuilder.addAll(req.nonObservables);
            timeSeriesBuilder.addAll(req.timeSeries);
            outputCurrenciesBuilder.addAll(req.outputCurrencies);
        }
        return new CalculationRequirements(observablesBuilder.build(), nonObservablesBuilder.build(),
                timeSeriesBuilder.build(), outputCurrenciesBuilder.build());
    }

    //------------------------- AUTOGENERATED START -------------------------
    ///CLOVER:OFF
    /**
     * The meta-bean for {@code CalculationRequirements}.
     * @return the meta-bean, not null
     */
    public static CalculationRequirements.Meta meta() {
        return CalculationRequirements.Meta.INSTANCE;
    }

    static {
        JodaBeanUtils.registerMetaBean(CalculationRequirements.Meta.INSTANCE);
    }

    /**
     * Creates an instance.
     * @param observables  the value of the property, not null
     * @param nonObservables  the value of the property, not null
     * @param timeSeries  the value of the property, not null
     * @param outputCurrencies  the value of the property, not null
     */
    CalculationRequirements(Set<? extends ObservableId> observables, Set<? extends MarketDataId<?>> nonObservables,
            Set<? extends ObservableId> timeSeries, Set<Currency> outputCurrencies) {
        JodaBeanUtils.notNull(observables, "observables");
        JodaBeanUtils.notNull(nonObservables, "nonObservables");
        JodaBeanUtils.notNull(timeSeries, "timeSeries");
        JodaBeanUtils.notNull(outputCurrencies, "outputCurrencies");
        this.observables = ImmutableSet.copyOf(observables);
        this.nonObservables = ImmutableSet.copyOf(nonObservables);
        this.timeSeries = ImmutableSet.copyOf(timeSeries);
        this.outputCurrencies = ImmutableSet.copyOf(outputCurrencies);
    }

    @Override
    public CalculationRequirements.Meta metaBean() {
        return CalculationRequirements.Meta.INSTANCE;
    }

    @Override
    public <R> Property<R> property(String propertyName) {
        return metaBean().<R>metaProperty(propertyName).createProperty(this);
    }

    @Override
    public Set<String> propertyNames() {
        return metaBean().metaPropertyMap().keySet();
    }

    //-----------------------------------------------------------------------
    /**
     * Gets keys identifying the market data values required for the calculations.
     * @return the value of the property, not null
     */
    public ImmutableSet<ObservableId> getObservables() {
        return observables;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets keys identifying the market data values required for the calculations.
     * @return the value of the property, not null
     */
    public ImmutableSet<MarketDataId<?>> getNonObservables() {
        return nonObservables;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets keys identifying the time series of market data values required for the calculations.
     * @return the value of the property, not null
     */
    public ImmutableSet<ObservableId> getTimeSeries() {
        return timeSeries;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the currencies in the calculation results. The market data must include FX rates in the
     * to allow conversion into the reporting currency. The FX rates must have the output currency as the base
     * currency and the reporting currency as the counter currency.
     * @return the value of the property, not null
     */
    public ImmutableSet<Currency> getOutputCurrencies() {
        return outputCurrencies;
    }

    //-----------------------------------------------------------------------
    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj != null && obj.getClass() == this.getClass()) {
            CalculationRequirements other = (CalculationRequirements) obj;
            return JodaBeanUtils.equal(getObservables(), other.getObservables())
                    && JodaBeanUtils.equal(getNonObservables(), other.getNonObservables())
                    && JodaBeanUtils.equal(getTimeSeries(), other.getTimeSeries())
                    && JodaBeanUtils.equal(getOutputCurrencies(), other.getOutputCurrencies());
        }
        return false;
    }

    @Override
    public int hashCode() {
        int hash = getClass().hashCode();
        hash = hash * 31 + JodaBeanUtils.hashCode(getObservables());
        hash = hash * 31 + JodaBeanUtils.hashCode(getNonObservables());
        hash = hash * 31 + JodaBeanUtils.hashCode(getTimeSeries());
        hash = hash * 31 + JodaBeanUtils.hashCode(getOutputCurrencies());
        return hash;
    }

    @Override
    public String toString() {
        StringBuilder buf = new StringBuilder(160);
        buf.append("CalculationRequirements{");
        buf.append("observables").append('=').append(getObservables()).append(',').append(' ');
        buf.append("nonObservables").append('=').append(getNonObservables()).append(',').append(' ');
        buf.append("timeSeries").append('=').append(getTimeSeries()).append(',').append(' ');
        buf.append("outputCurrencies").append('=').append(JodaBeanUtils.toString(getOutputCurrencies()));
        buf.append('}');
        return buf.toString();
    }

    //-----------------------------------------------------------------------
    /**
     * The meta-bean for {@code CalculationRequirements}.
     */
    public static final class Meta extends DirectMetaBean {
        /**
         * The singleton instance of the meta-bean.
         */
        static final Meta INSTANCE = new Meta();

        /**
         * The meta-property for the {@code observables} property.
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        private final MetaProperty<ImmutableSet<ObservableId>> observables = DirectMetaProperty.ofImmutable(this,
                "observables", CalculationRequirements.class, (Class) ImmutableSet.class);
        /**
         * The meta-property for the {@code nonObservables} property.
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        private final MetaProperty<ImmutableSet<MarketDataId<?>>> nonObservables = DirectMetaProperty
                .ofImmutable(this, "nonObservables", CalculationRequirements.class, (Class) ImmutableSet.class);
        /**
         * The meta-property for the {@code timeSeries} property.
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        private final MetaProperty<ImmutableSet<ObservableId>> timeSeries = DirectMetaProperty.ofImmutable(this,
                "timeSeries", CalculationRequirements.class, (Class) ImmutableSet.class);
        /**
         * The meta-property for the {@code outputCurrencies} property.
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        private final MetaProperty<ImmutableSet<Currency>> outputCurrencies = DirectMetaProperty.ofImmutable(this,
                "outputCurrencies", CalculationRequirements.class, (Class) ImmutableSet.class);
        /**
         * The meta-properties.
         */
        private final Map<String, MetaProperty<?>> metaPropertyMap$ = new DirectMetaPropertyMap(this, null,
                "observables", "nonObservables", "timeSeries", "outputCurrencies");

        /**
         * Restricted constructor.
         */
        private Meta() {
        }

        @Override
        protected MetaProperty<?> metaPropertyGet(String propertyName) {
            switch (propertyName.hashCode()) {
            case 121811856: // observables
                return observables;
            case 824041091: // nonObservables
                return nonObservables;
            case 779431844: // timeSeries
                return timeSeries;
            case -1022597040: // outputCurrencies
                return outputCurrencies;
            }
            return super.metaPropertyGet(propertyName);
        }

        @Override
        public BeanBuilder<? extends CalculationRequirements> builder() {
            return new CalculationRequirements.Builder();
        }

        @Override
        public Class<? extends CalculationRequirements> beanType() {
            return CalculationRequirements.class;
        }

        @Override
        public Map<String, MetaProperty<?>> metaPropertyMap() {
            return metaPropertyMap$;
        }

        //-----------------------------------------------------------------------
        /**
         * The meta-property for the {@code observables} property.
         * @return the meta-property, not null
         */
        public MetaProperty<ImmutableSet<ObservableId>> observables() {
            return observables;
        }

        /**
         * The meta-property for the {@code nonObservables} property.
         * @return the meta-property, not null
         */
        public MetaProperty<ImmutableSet<MarketDataId<?>>> nonObservables() {
            return nonObservables;
        }

        /**
         * The meta-property for the {@code timeSeries} property.
         * @return the meta-property, not null
         */
        public MetaProperty<ImmutableSet<ObservableId>> timeSeries() {
            return timeSeries;
        }

        /**
         * The meta-property for the {@code outputCurrencies} property.
         * @return the meta-property, not null
         */
        public MetaProperty<ImmutableSet<Currency>> outputCurrencies() {
            return outputCurrencies;
        }

        //-----------------------------------------------------------------------
        @Override
        protected Object propertyGet(Bean bean, String propertyName, boolean quiet) {
            switch (propertyName.hashCode()) {
            case 121811856: // observables
                return ((CalculationRequirements) bean).getObservables();
            case 824041091: // nonObservables
                return ((CalculationRequirements) bean).getNonObservables();
            case 779431844: // timeSeries
                return ((CalculationRequirements) bean).getTimeSeries();
            case -1022597040: // outputCurrencies
                return ((CalculationRequirements) bean).getOutputCurrencies();
            }
            return super.propertyGet(bean, propertyName, quiet);
        }

        @Override
        protected void propertySet(Bean bean, String propertyName, Object newValue, boolean quiet) {
            metaProperty(propertyName);
            if (quiet) {
                return;
            }
            throw new UnsupportedOperationException("Property cannot be written: " + propertyName);
        }

    }

    //-----------------------------------------------------------------------
    /**
     * The bean-builder for {@code CalculationRequirements}.
     */
    private static final class Builder extends DirectFieldsBeanBuilder<CalculationRequirements> {

        private Set<? extends ObservableId> observables = ImmutableSet.of();
        private Set<? extends MarketDataId<?>> nonObservables = ImmutableSet.of();
        private Set<? extends ObservableId> timeSeries = ImmutableSet.of();
        private Set<Currency> outputCurrencies = ImmutableSet.of();

        /**
         * Restricted constructor.
         */
        private Builder() {
        }

        //-----------------------------------------------------------------------
        @Override
        public Object get(String propertyName) {
            switch (propertyName.hashCode()) {
            case 121811856: // observables
                return observables;
            case 824041091: // nonObservables
                return nonObservables;
            case 779431844: // timeSeries
                return timeSeries;
            case -1022597040: // outputCurrencies
                return outputCurrencies;
            default:
                throw new NoSuchElementException("Unknown property: " + propertyName);
            }
        }

        @SuppressWarnings("unchecked")
        @Override
        public Builder set(String propertyName, Object newValue) {
            switch (propertyName.hashCode()) {
            case 121811856: // observables
                this.observables = (Set<? extends ObservableId>) newValue;
                break;
            case 824041091: // nonObservables
                this.nonObservables = (Set<? extends MarketDataId<?>>) newValue;
                break;
            case 779431844: // timeSeries
                this.timeSeries = (Set<? extends ObservableId>) newValue;
                break;
            case -1022597040: // outputCurrencies
                this.outputCurrencies = (Set<Currency>) newValue;
                break;
            default:
                throw new NoSuchElementException("Unknown property: " + propertyName);
            }
            return this;
        }

        @Override
        public Builder set(MetaProperty<?> property, Object value) {
            super.set(property, value);
            return this;
        }

        @Override
        public Builder setString(String propertyName, String value) {
            setString(meta().metaProperty(propertyName), value);
            return this;
        }

        @Override
        public Builder setString(MetaProperty<?> property, String value) {
            super.setString(property, value);
            return this;
        }

        @Override
        public Builder setAll(Map<String, ? extends Object> propertyValueMap) {
            super.setAll(propertyValueMap);
            return this;
        }

        @Override
        public CalculationRequirements build() {
            return new CalculationRequirements(observables, nonObservables, timeSeries, outputCurrencies);
        }

        //-----------------------------------------------------------------------
        @Override
        public String toString() {
            StringBuilder buf = new StringBuilder(160);
            buf.append("CalculationRequirements.Builder{");
            buf.append("observables").append('=').append(JodaBeanUtils.toString(observables)).append(',')
                    .append(' ');
            buf.append("nonObservables").append('=').append(JodaBeanUtils.toString(nonObservables)).append(',')
                    .append(' ');
            buf.append("timeSeries").append('=').append(JodaBeanUtils.toString(timeSeries)).append(',').append(' ');
            buf.append("outputCurrencies").append('=').append(JodaBeanUtils.toString(outputCurrencies));
            buf.append('}');
            return buf.toString();
        }

    }

    ///CLOVER:ON
    //-------------------------- AUTOGENERATED END --------------------------
}