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