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.Objects; 028 029/** 030 * Test ExchangeRateProvider. 031 */ 032public class TestRateProvider3 implements ExchangeRateProvider { 033 034 public static final int FACTOR = 3; 035 private static final ProviderContext PC = ProviderContextBuilder.of("TestRateProvider3", RateType.OTHER).build(); 036 private static final ConversionContext CC = ConversionContextBuilder.create(PC, RateType.OTHER).build(); 037 038 private static final class Conversion implements CurrencyConversion { 039 040 private CurrencyUnit term; 041 042 private Conversion(CurrencyUnit term) { 043 Objects.requireNonNull(term); 044 this.term = term; 045 } 046 047 @Override 048 public CurrencyUnit getCurrency() { 049 return term; 050 } 051 052 @Override 053 public ConversionContext getContext() { 054 return CC; 055 } 056 057 @Override 058 public ExchangeRate getExchangeRate(MonetaryAmount sourceAmount) { 059 return new TestExchangeRate.Builder(CC).setFactor(new TestNumberValue(FACTOR)) 060 .setBase(sourceAmount.getCurrency()).setTerm(term).build(); 061 } 062 063 @Override 064 public MonetaryAmount apply(MonetaryAmount value) { 065 return value.multiply(FACTOR).getFactory().setCurrency(term).create(); 066 } 067 068 @Override 069 public ExchangeRateProvider getExchangeRateProvider() { 070 return null; 071 } 072 } 073 074 @Override 075 public ProviderContext getContext() { 076 return PC; 077 } 078 079 @Override 080 public boolean isAvailable(ConversionQuery query) { 081 Objects.requireNonNull(query); 082 Objects.requireNonNull(query.getBaseCurrency()); 083 Objects.requireNonNull(query.getCurrency()); 084 return "USD".equals(query.getBaseCurrency().getCurrencyCode()); 085 } 086 087 @Override 088 public ExchangeRate getExchangeRate(CurrencyUnit base, CurrencyUnit term) { 089 return getExchangeRate(ConversionQueryBuilder.of().setBaseCurrency(base).setTermCurrency(term).build()); 090 } 091 092 @Override 093 public CurrencyConversion getCurrencyConversion(CurrencyUnit term) { 094 return new Conversion(term); 095 } 096 097 @Override 098 public boolean isAvailable(CurrencyUnit base, CurrencyUnit term) { 099 return isAvailable(ConversionQueryBuilder.of().setBaseCurrency(base).setTermCurrency(term).build()); 100 } 101 102 @Override 103 public boolean isAvailable(String baseCode, String termCode) { 104 return isAvailable(ConversionQueryBuilder.of().setBaseCurrency(Monetary.getCurrency(baseCode)) 105 .setTermCurrency(Monetary.getCurrency(termCode)).build()); 106 } 107 108 @Override 109 public ExchangeRate getExchangeRate(String baseCode, String termCode) { 110 return getExchangeRate(ConversionQueryBuilder.of().setBaseCurrency(Monetary.getCurrency(baseCode)) 111 .setTermCurrency(Monetary.getCurrency(termCode)).build()); 112 } 113 114 @Override 115 public ExchangeRate getReversed(ExchangeRate rate) { 116 ConversionQuery reverseQuery = rate.getContext().toQueryBuilder().setBaseCurrency(rate.getCurrency()) 117 .setTermCurrency(rate.getBaseCurrency()).build(); 118 if(isAvailable(reverseQuery)){ 119 return getExchangeRate(reverseQuery); 120 } 121 return null; 122 } 123 124 @Override 125 public CurrencyConversion getCurrencyConversion(String termCode) { 126 return new Conversion(Monetary.getCurrency(termCode)); 127 } 128 129 @Override 130 public ExchangeRate getExchangeRate(ConversionQuery query) { 131 if (isAvailable(query)) { 132 return new TestExchangeRate.Builder(PC.getProviderName(), RateType.OTHER).setFactor(new TestNumberValue(FACTOR)) 133 .setBase(query.getBaseCurrency()).setTerm(query.getCurrency()).build(); 134 } 135 return null; 136 } 137 138 @Override 139 public CurrencyConversion getCurrencyConversion(ConversionQuery conversionQuery) { 140 Objects.requireNonNull(conversionQuery); 141 Objects.requireNonNull(conversionQuery.getCurrency()); 142 return new Conversion(conversionQuery.getCurrency()); 143 } 144 145}