001/*
002 * CREDIT SUISSE IS WILLING TO LICENSE THIS SPECIFICATION TO YOU ONLY UPON THE
003 * CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS AGREEMENT.
004 * PLEASE READ THE TERMS AND CONDITIONS OF THIS AGREEMENT CAREFULLY. BY
005 * DOWNLOADING THIS SPECIFICATION, YOU ACCEPT THE TERMS AND CONDITIONS OF THE
006 * AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY IT, SELECT THE "DECLINE"
007 * BUTTON AT THE BOTTOM OF THIS PAGE.
008 * 
009 * Specification: JSR-354 Money and Currency API ("Specification")
010 * 
011 * Copyright (c) 2012-2013, Credit Suisse All rights reserved.
012 */
013package org.javamoney.moneta.internal;
014
015import java.util.Currency;
016import java.util.HashMap;
017import java.util.Locale;
018import java.util.Map;
019import java.util.logging.Level;
020import java.util.logging.Logger;
021
022import javax.money.CurrencyUnit;
023import javax.money.spi.CurrencyProviderSpi;
024
025/**
026 * Default implementation of a {@link CurrencyUnit} based on the using the JDK's
027 * {@link MoneyCurrency}, but also extendable using a {@link Builder} instance.
028 * 
029 * @version 0.5.1
030 * @author Anatole Tresch
031 * @author Werner Keil
032 */
033public class JDKCurrencyProvider implements CurrencyProviderSpi {
034
035        /** Internal shared cache of {@link MoneyCurrency} instances. */
036        private static final Map<String, CurrencyUnit> CACHED = new HashMap<String, CurrencyUnit>();
037
038        public JDKCurrencyProvider() {
039                for (Currency jdkCurrency : Currency.getAvailableCurrencies()) {
040                        CurrencyUnit cu = new JDKCurrencyAdapter(jdkCurrency);
041                        CACHED.put(cu.getCurrencyCode(), cu);
042                }
043        }
044
045        @Override
046        public CurrencyUnit getCurrencyUnit(String currencyCode) {
047                return CACHED.get(currencyCode);
048        }
049
050        @Override
051        public CurrencyUnit getCurrencyUnit(Locale locale) {
052                Currency cur = null;
053                try {
054                        cur = Currency.getInstance(locale);
055                        if(cur!=null){
056                                return getCurrencyUnit(cur.getCurrencyCode());
057                        }
058                } catch (Exception e) {
059                        if (Logger.getLogger(getClass().getName()).isLoggable(Level.FINEST)) {
060                                Logger.getLogger(getClass().getName()).finest(
061                                                "No currency for locale found: " + locale);
062                        }
063                }
064                return null;
065        }
066
067}