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.internal.convert; 017 018import java.math.BigDecimal; 019 020import javax.money.convert.*; 021 022import org.javamoney.moneta.ExchangeRateBuilder; 023import org.javamoney.moneta.spi.AbstractRateProvider; 024import org.javamoney.moneta.spi.DefaultNumberValue; 025 026/** 027 * This class implements an {@link javax.money.convert.ExchangeRateProvider} that provides exchange rate with factor 028 * one for identical base/term currencies. 029 * 030 * @author Anatole Tresch 031 * @author Werner Keil 032 */ 033public class IdentityRateProvider extends AbstractRateProvider { 034 035 /** 036 * The {@link javax.money.convert.ConversionContext} of this provider. 037 */ 038 private static final ProviderContext CONTEXT = 039 ProviderContextBuilder.of("IDENT", RateType.OTHER).set("providerDescription", "Identitiy Provider").build(); 040 041 /** 042 * Constructor, also loads initial data. 043 */ 044 public IdentityRateProvider() { 045 super(CONTEXT); 046 } 047 048 /** 049 * Check if this provider can provide a rate, which is only the case if base and term are equal. 050 * 051 * @param conversionQuery the required {@link ConversionQuery}, not {@code null} 052 * @return true, if the contained base and term currencies are known to this provider. 053 */ 054 public boolean isAvailable(ConversionQuery conversionQuery) { 055 return conversionQuery.getBaseCurrency().getCurrencyCode() 056 .equals(conversionQuery.getCurrency().getCurrencyCode()); 057 } 058 059 public ExchangeRate getExchangeRate(ConversionQuery conversionQuery) { 060 if (conversionQuery.getBaseCurrency().getCurrencyCode().equals(conversionQuery.getCurrency().getCurrencyCode())) { 061 ExchangeRateBuilder builder = new ExchangeRateBuilder(getContext().getProviderName(), RateType.OTHER) 062 .setBase(conversionQuery.getBaseCurrency()); 063 builder.setTerm(conversionQuery.getCurrency()); 064 builder.setFactor(DefaultNumberValue.of(BigDecimal.ONE)); 065 return builder.build(); 066 } 067 return null; 068 } 069 070 /* 071 * (non-Javadoc) 072 * 073 * @see 074 * javax.money.convert.ExchangeRateProvider#getReversed(javax.money.convert 075 * .ExchangeRate) 076 */ 077 @Override 078 public ExchangeRate getReversed(ExchangeRate rate) { 079 if (rate.getContext().getProviderName().equals(CONTEXT.getProviderName())) { 080 return new ExchangeRateBuilder(rate.getContext()).setTerm(rate.getBaseCurrency()) 081 .setBase(rate.getCurrency()).setFactor(new DefaultNumberValue(BigDecimal.ONE)).build(); 082 } 083 return null; 084 } 085 086}