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}