/* * Copyright (c) 2012, 2013, Werner Keil, Credit Suisse (Anatole Tresch). * * 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. * * * Contributors: Anatole Tresch - initial version. */ package org.javamoney.cdi.internal; import javax.money.spi.ServiceProvider; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.ServiceLoader; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; /** * Default SE ServiceLoader based ServiceProvider implementation. */ public class DefaultServiceProvider implements ServiceProvider { /** * List of services loaded, per class. */ private final ConcurrentHashMap<Class, List<Object>> servicesLoaded = new ConcurrentHashMap<>(); /** * Loads and registers services. * * @param serviceType The service type. * @param <T> the concrete type. * @param defaultList the list of items returned, if no services were found. * @return the items found, never {@code null}. */ public <T> List<T> getServices(final Class<T> serviceType, final List<T> defaultList) { @SuppressWarnings("unchecked") List<T> found = (List<T>) servicesLoaded.get(serviceType); if (found != null) { return found; } return loadServices(serviceType, defaultList); } /** * Loads and registers services. * * @param serviceType The service type. * @param <T> the concrete type. * @param defaultList the list of items returned, if no services were found. * @return the items found, never {@code null}. */ private <T> List<T> loadServices(final Class<T> serviceType, final List<T> defaultList) { try { List<T> services = new ArrayList<>(); for (T t : ServiceLoader.load(serviceType)) { services.add(t); } if (services.isEmpty()) { services.addAll(defaultList); } @SuppressWarnings("unchecked") final List<T> previousServices = (List<T>) servicesLoaded.putIfAbsent(serviceType, (List<Object>) services); return Collections.unmodifiableList(previousServices != null ? previousServices : services); } catch (Exception e) { Logger.getLogger(DefaultServiceProvider.class.getName()).log(Level.WARNING, "Error loading services of type " + serviceType, e); return defaultList; } } @Override public int getPriority() { return 0; } @Override public <T> List<T> getServices(Class<T> serviceType) { // TODO Auto-generated method stub return null; } }