001/*
002 * Copyright (c) 2012, 2013, Werner Keil, Credit Suisse (Anatole Tresch). Licensed under the Apache
003 * License, Version 2.0 (the "License"); you may not use this file except in compliance with the
004 * License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
005 * Unless required by applicable law or agreed to in writing, software distributed under the License
006 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
007 * or implied. See the License for the specific language governing permissions and limitations under
008 * the License. Contributors: Anatole Tresch - initial version.
009 */
010package org.javamoney.tck.tests.internal;
011
012import org.javamoney.tck.tests.conversion.TestExchangeRate;
013
014import javax.money.CurrencyUnit;
015import javax.money.MonetaryAmount;
016import javax.money.Monetary;
017import javax.money.convert.ConversionContext;
018import javax.money.convert.ConversionContextBuilder;
019import javax.money.convert.ConversionQuery;
020import javax.money.convert.ConversionQueryBuilder;
021import javax.money.convert.CurrencyConversion;
022import javax.money.convert.ExchangeRate;
023import javax.money.convert.ExchangeRateProvider;
024import javax.money.convert.ProviderContext;
025import javax.money.convert.ProviderContextBuilder;
026import javax.money.convert.RateType;
027import java.util.Calendar;
028import java.util.Objects;
029
030/**
031 * Test ExchangeProvider. Created by Anatole on 26.04.2014.
032 */
033public class TestRateProvider2 implements ExchangeRateProvider {
034
035    public static final int FACTOR = 2;
036    private static final ProviderContext PC = ProviderContextBuilder.of("TestRateProvider2", RateType.OTHER).build();
037    private static final ConversionContext CC = ConversionContextBuilder.create(PC, RateType.OTHER).build();
038
039    private static final class Conversion implements CurrencyConversion {
040
041        private CurrencyUnit term;
042
043        private Conversion(CurrencyUnit term) {
044            Objects.requireNonNull(term);
045            this.term = term;
046        }
047
048        @Override
049        public CurrencyUnit getCurrency() {
050            return term;
051        }
052
053        @Override
054        public ConversionContext getContext() {
055            return CC;
056        }
057
058        @Override
059        public ExchangeRate getExchangeRate(MonetaryAmount sourceAmount) {
060            return new TestExchangeRate.Builder(CC).setFactor(new TestNumberValue(FACTOR))
061                    .setBase(sourceAmount.getCurrency()).setTerm(term).build();
062        }
063
064        @Override
065        public MonetaryAmount apply(MonetaryAmount value) {
066            return value.multiply(FACTOR).getFactory().setCurrency(term).create();
067        }
068
069        @Override
070        public ExchangeRateProvider getExchangeRateProvider() {
071            return null;
072        }
073    }
074
075    @Override
076    public ProviderContext getContext() {
077        return PC;
078    }
079
080    @Override
081    public boolean isAvailable(ConversionQuery conversionQuery) {
082        Objects.requireNonNull(conversionQuery);
083        Objects.requireNonNull(conversionQuery.getBaseCurrency());
084        Objects.requireNonNull(conversionQuery.getCurrency());
085        return "EUR".equals(conversionQuery.getBaseCurrency().getCurrencyCode());
086    }
087
088    @Override
089    public ExchangeRate getExchangeRate(ConversionQuery conversionQuery) {
090        if (isAvailable(conversionQuery)) {
091            if (conversionQuery.get(Calendar.class) != null) {
092                return new TestExchangeRate.Builder("TestRateProvider2", RateType.OTHER)
093                        .setFactor(new TestNumberValue(FACTOR * 100)).setBase(conversionQuery.getBaseCurrency())
094                        .setTerm(conversionQuery.getCurrency()).build();
095            }
096            return new TestExchangeRate.Builder("TestRateProvider2", RateType.OTHER)
097                    .setFactor(new TestNumberValue(FACTOR)).setBase(conversionQuery.getBaseCurrency())
098                    .setTerm(conversionQuery.getCurrency()).build();
099        }
100        return null;
101    }
102
103    @Override
104    public CurrencyConversion getCurrencyConversion(ConversionQuery conversionContext) {
105        Objects.requireNonNull(conversionContext);
106        Objects.requireNonNull(conversionContext.getCurrency());
107        return new Conversion(conversionContext.getCurrency());
108    }
109
110    @Override
111    public ExchangeRate getExchangeRate(CurrencyUnit base, CurrencyUnit term) {
112        return getExchangeRate(ConversionQueryBuilder.of().setBaseCurrency(base).setTermCurrency(term).build());
113    }
114
115    @Override
116    public CurrencyConversion getCurrencyConversion(CurrencyUnit term) {
117        return new Conversion(term);
118    }
119
120    @Override
121    public boolean isAvailable(CurrencyUnit base, CurrencyUnit term) {
122        return isAvailable(ConversionQueryBuilder.of().setBaseCurrency(base).setTermCurrency(term).build());
123    }
124
125    @Override
126    public boolean isAvailable(String baseCode, String termCode) {
127        return isAvailable(ConversionQueryBuilder.of().setBaseCurrency(Monetary.getCurrency(baseCode))
128                .setTermCurrency(Monetary.getCurrency(termCode)).build());
129    }
130
131    @Override
132    public ExchangeRate getExchangeRate(String baseCode, String termCode) {
133        return getExchangeRate(ConversionQueryBuilder.of().setBaseCurrency(Monetary.getCurrency(baseCode))
134                .setTermCurrency(Monetary.getCurrency(termCode)).build());
135    }
136
137    @Override
138    public ExchangeRate getReversed(ExchangeRate rate) {
139        ConversionQuery reverseQuery = rate.getContext().toQueryBuilder().setBaseCurrency(rate.getCurrency())
140                .setTermCurrency(rate.getBaseCurrency()).build();
141        if(isAvailable(reverseQuery)){
142            return getExchangeRate(reverseQuery);
143        }
144        return null;
145    }
146
147    @Override
148    public CurrencyConversion getCurrencyConversion(String termCode) {
149        return new Conversion(Monetary.getCurrency(termCode));
150    }
151
152}