All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.javamoney.moneta.internal.DefaultMonetaryAmountsSingletonSpi Maven / Gradle / Ivy

Go to download

JSR 354 provides an API for representing, transporting, and performing comprehensive calculations with Money and Currency. This module implements JSR 354.

There is a newer version: 1.4.4
Show newest version
/**
 * Copyright (c) 2012, 2014, Credit Suisse (Anatole Tresch), Werner Keil and others by the @author tag.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.javamoney.moneta.internal;

import javax.money.MonetaryAmount;
import javax.money.MonetaryAmountFactory;
import javax.money.MonetaryException;
import javax.money.spi.Bootstrap;
import javax.money.spi.MonetaryAmountFactoryProviderSpi;
import javax.money.spi.MonetaryAmountsSingletonSpi;

import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Default implementation ot {@link javax.money.spi.MonetaryAmountsSingletonSpi} loading the SPIs on startup
 * initially once, using the
 * JSR's {@link javax.money.spi.Bootstrap} mechanism.
 */
public class DefaultMonetaryAmountsSingletonSpi implements MonetaryAmountsSingletonSpi {

    private final Map, MonetaryAmountFactoryProviderSpi> factories =
            new ConcurrentHashMap<>();

    private Class configuredDefaultAmountType = loadDefaultAmountType();

    public DefaultMonetaryAmountsSingletonSpi() {
        for (MonetaryAmountFactoryProviderSpi f : Bootstrap.getServices(MonetaryAmountFactoryProviderSpi.class)) {
            factories.putIfAbsent(f.getAmountType(), f);
        }
    }

    /**
     * Tries to load the default {@link MonetaryAmount} class from
     * {@code javamoney.properties} with contents as follows:
* * javax.money.defaults.amount.class=my.fully.qualified.ClassName * * * @return the loaded default class, or {@code null} */ // type check should be safe, exception will be logged if not. private Class loadDefaultAmountType() { return null; } // save cast, since members are managed by this instance @SuppressWarnings("unchecked") @Override public MonetaryAmountFactory getAmountFactory(Class amountType) { MonetaryAmountFactoryProviderSpi f = MonetaryAmountFactoryProviderSpi.class.cast(factories.get(amountType)); if (Objects.nonNull(f)) { return f.createMonetaryAmountFactory(); } throw new MonetaryException("No matching MonetaryAmountFactory found, type=" + amountType.getName()); } @Override public Set> getAmountTypes() { return factories.keySet(); } /* * (non-Javadoc) * * @see javax.money.spi.MonetaryAmountsSpi#getDefaultAmountType() */ @Override public Class getDefaultAmountType() { if (Objects.isNull(configuredDefaultAmountType)) { for (MonetaryAmountFactoryProviderSpi f : Bootstrap.getServices(MonetaryAmountFactoryProviderSpi.class)) { if (f.getQueryInclusionPolicy() == MonetaryAmountFactoryProviderSpi.QueryInclusionPolicy.ALWAYS) { configuredDefaultAmountType = f.getAmountType(); break; } } } return Optional.ofNullable(configuredDefaultAmountType) .orElseThrow(() -> new MonetaryException("No MonetaryAmountFactoryProviderSpi registered.")); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy