001/**
002 * Copyright (c) 2012, 2014, Credit Suisse (Anatole Tresch), Werner Keil and others by the @author tag.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016package org.javamoney.moneta.spi;
017
018import javax.money.CurrencyUnit;
019import javax.money.MonetaryAmount;
020import javax.money.convert.ConversionContext;
021import javax.money.convert.ConversionQuery;
022import javax.money.convert.ConversionQueryBuilder;
023import javax.money.convert.CurrencyConversion;
024import javax.money.convert.ExchangeRate;
025import javax.money.convert.ExchangeRateProvider;
026
027/**
028 * This class defines a {@link CurrencyConversion} that is converting to a
029 * specific target {@link CurrencyUnit}. Each instance of this class is bound to
030 * a specific {@link ExchangeRateProvider}, a term {@link CurrencyUnit} and a
031 * target timestamp.
032 *
033 * @author Anatole Tresch
034 */
035public class LazyBoundCurrencyConversion extends AbstractCurrencyConversion implements CurrencyConversion {
036
037    private final ExchangeRateProvider rateProvider;
038
039    private final ConversionQuery conversionQuery;
040
041    public LazyBoundCurrencyConversion(ConversionQuery conversionQuery, ExchangeRateProvider rateProvider,
042                                       ConversionContext conversionContext) {
043
044        super(conversionQuery.getCurrency(), conversionContext);
045        this.conversionQuery = conversionQuery;
046        this.rateProvider = rateProvider;
047    }
048
049    /**
050     * Get the exchange rate type that this provider instance is providing data
051     * for.
052     *
053     * @return the exchange rate type if this instance.
054     */
055    @Override
056    public ExchangeRate getExchangeRate(MonetaryAmount amount) {
057        return this.rateProvider.getExchangeRate(ConversionQueryBuilder
058                .of(conversionQuery).setBaseCurrency(amount.getCurrency())
059                .build());
060        // return this.rateProvider.getExchangeRate(amount.getCurrency(),
061        // getCurrency());
062    }
063
064    @Override
065    public ExchangeRateProvider getExchangeRateProvider() {
066        return this.rateProvider;
067    }
068
069    /*
070     * (non-Javadoc)
071     *
072     * @see
073     * org.javamoney.moneta.conversion.AbstractCurrencyConversion#with(javax
074     * .money.convert.ConversionContext)
075     */
076    @Override
077    public CurrencyConversion with(ConversionContext conversionContext) {
078        return new LazyBoundCurrencyConversion(conversionQuery, rateProvider,
079                conversionContext);
080    }
081
082    /*
083     * (non-Javadoc)
084     *
085     * @see java.lang.Object#toString()
086     */
087    @Override
088    public String toString() {
089        return "CurrencyConversion [MonetaryAmount -> MonetaryAmount; provider=" + rateProvider + ", context=" +
090                getContext() + ", termCurrency=" + getCurrency() + ']';
091    }
092
093}