/* * Copyright (c) 2012, 2015, 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. * Werner Keil - adjusted to 1.0. */ package org.javamoney.cdi.internal; import static org.javamoney.cdi.internal.Constants.PRIO; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Priority; import javax.money.spi.ServiceProvider; import org.javamoney.moneta.internal.PriorityAwareServiceProvider; /** * Overriding ServiceProvider that actually tries to satisfy component requests from CDI, * where possible. Additionally ServiceLoader based service are loaded and are returned * ONLY, when not the same service is loaded as well in CDI. */ @Priority(PRIO) public class CDISEServiceProvider implements ServiceProvider { private static final Logger LOG = Logger.getLogger(CDISEServiceProvider.class.getName()); /** * Default provider, using ServiceLoader. */ private ServiceProvider defaultServiceProvider = new PriorityAwareServiceProvider(); @Override public <T> List<T> getServices(Class<T> serviceType) { List<T> instances = new ArrayList<T>(); Set<String> types = new HashSet<>(); try { for (T t : CDIAccessor .getInstances(serviceType)) { instances.add(t); types.add(t.getClass().getName()); } }catch(Exception e){ // OK, component is not registered in CDI... LOG.log(Level.FINEST, "No such component in CDI context: " + serviceType.getName(), e); } for (T t : defaultServiceProvider.getServices(serviceType)) { if (!types.contains(t.getClass().getName())) { instances.add(t); } } instances.sort(PriorityAwareServiceProvider::compareServices); return instances; } public <T> List<T> getServices(Class<T> serviceType, List<T> defaultList) { List<T> services = getServices(serviceType); if (services.isEmpty()) { return defaultList; } return services; } @Override public String toString() { return "CDISEServiceProvider{" + "defaultServiceProvider=" + defaultServiceProvider + '}'; } @Override public int getPriority() { return PRIO; } }