/******************************************************************************* * Copyright (c) 2010-present Sonatype, Inc. * 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 (Sonatype, Inc.) - initial API and implementation *******************************************************************************/ package org.eclipse.sisu.plexus; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.sisu.BeanEntry; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; /** * Hint-driven sequence of {@link PlexusBean}s that uses {@link MissingPlexusBean}s to indicate missing hints. */ final class HintedPlexusBeans<T> implements Iterable<PlexusBean<T>> { // ---------------------------------------------------------------------- // Implementation fields // ---------------------------------------------------------------------- private final Iterable<BeanEntry<Named, T>> beans; private final List<PlexusBean<T>> missingPlexusBeans; // ---------------------------------------------------------------------- // Constructors // ---------------------------------------------------------------------- HintedPlexusBeans( final Iterable<BeanEntry<Named, T>> beans, final TypeLiteral<T> role, final String[] hints ) { this.beans = beans; missingPlexusBeans = new ArrayList<PlexusBean<T>>( hints.length ); for ( final String h : hints ) { missingPlexusBeans.add( new MissingPlexusBean<T>( role, h ) ); } } // ---------------------------------------------------------------------- // Public methods // ---------------------------------------------------------------------- public Iterator<PlexusBean<T>> iterator() { // assume all hints are missing to begin with final List<PlexusBean<T>> plexusBeans = new ArrayList<PlexusBean<T>>( missingPlexusBeans ); // scan available beans and populate list according to hint final int size = plexusBeans.size(); final Iterator<BeanEntry<Named, T>> itr = beans.iterator(); for ( int numFound = 0; numFound < size && itr.hasNext(); ) { final BeanEntry<Named, T> candidate = itr.next(); final String hint = candidate.getKey().value(); for ( int i = 0; i < size; i++ ) { final PlexusBean<T> element = plexusBeans.get( i ); if ( element instanceof MissingPlexusBean<?> && hint.equals( element.getKey() ) ) { plexusBeans.set( i, new LazyPlexusBean<T>( candidate ) ); numFound++; } } } return plexusBeans.iterator(); } }