/******************************************************************************* * Copyright (c) 2008, 2014 Stuart McCulloch * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Stuart McCulloch - initial API and implementation *******************************************************************************/ package org.eclipse.sisu.peaberry.internal; import static java.util.Collections.unmodifiableList; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.sisu.peaberry.Import; import org.eclipse.sisu.peaberry.ServiceUnavailableException; import org.eclipse.sisu.peaberry.builders.ImportDecorator; /** * Factory methods for direct (also known as static) services. * * @author mcculls@gmail.com (Stuart McCulloch) */ final class DirectServiceFactory { // instances not allowed private DirectServiceFactory() {} static <T> Iterable<T> directServices(final Iterable<Import<T>> services, final ImportDecorator<? super T> decorator) { final List<T> instances = new ArrayList<T>(); final Iterator<Import<T>> i = services.iterator(); while (i.hasNext()) { // collect all valid services into snapshot list final T instance = nextService(i, decorator); if (null != instance) { instances.add(instance); } } return unmodifiableList(instances); } static <T> T directService(final Iterable<Import<T>> services, final ImportDecorator<? super T> decorator) { final Iterator<Import<T>> i = services.iterator(); while (i.hasNext()) { // return the first valid service found final T instance = nextService(i, decorator); if (null != instance) { return instance; } } return null; } private static <T> T nextService(final Iterator<Import<T>> i, final ImportDecorator<? super T> decorator) { try { return (null == decorator ? i.next() : decorator.decorate(i.next())).get(); } catch (final ServiceUnavailableException e) {/* default to null */} // NOPMD return null; } }