diff --git a/src/main/java/info/ebenoit/ebul/cmp/ComponentRegistry.java b/src/main/java/info/ebenoit/ebul/cmp/ComponentRegistry.java index c9fa38c..b93d32b 100644 --- a/src/main/java/info/ebenoit/ebul/cmp/ComponentRegistry.java +++ b/src/main/java/info/ebenoit/ebul/cmp/ComponentRegistry.java @@ -3,7 +3,9 @@ package info.ebenoit.ebul.cmp; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -48,6 +50,98 @@ public class ComponentRegistry } + public ComponentState getState( String name ) + { + return this.byName.get( name ); + } + + + public ComponentState getState( Class< ? > type ) + throws AmbiguousComponentException + { + ArrayList< ComponentState > l = this.byType.get( type ); + if ( l == null ) { + return null; + } + if ( l.size( ) == 1 ) { + return l.get( 0 ); + } + throw new AmbiguousComponentException( type , l.size( ) ); + } + + + public List< ComponentState > getStates( Class< ? > type ) + throws AmbiguousComponentException + { + ArrayList< ComponentState > l = this.byType.get( type ); + if ( l == null ) { + return Collections.emptyList( ); + } + return Collections.unmodifiableList( l ); + } + + + public void getStates( Class< ? > type , Collection< ComponentState > states ) + { + ArrayList< ComponentState > l = this.byType.get( type ); + if ( l != null ) { + int nFound = l.size( ); + for ( int i = 0 ; i < nFound ; i++ ) { + states.add( l.get( i ) ); + } + } + } + + + public Object get( String name ) + { + ComponentState cs = this.byName.get( name ); + return cs == null ? null : cs.getComponent( ); + } + + + public < T > T get( Class< T > type ) + throws AmbiguousComponentException + { + ArrayList< ComponentState > l = this.byType.get( type ); + if ( l == null ) { + return null; + } + if ( l.size( ) == 1 ) { + return type.cast( l.get( 0 ).getComponent( ) ); + } + throw new AmbiguousComponentException( type , l.size( ) ); + } + + + public < T > List< T > getAll( Class< T > type ) + { + ArrayList< ComponentState > l = this.byType.get( type ); + if ( l == null ) { + return Collections.emptyList( ); + } + + int nFound = l.size( ); + ArrayList< T > result = new ArrayList< >( nFound ); + for ( int i = 0 ; i < nFound ; i++ ) { + result.add( type.cast( l.get( i ).getComponent( ) ) ); + } + return result; + } + + + public < T > void getAll( Class< T > type , Collection< T > result ) + { + ArrayList< ComponentState > l = this.byType.get( type ); + if ( l != null ) { + int nFound = l.size( ); + for ( int i = 0 ; i < nFound ; i++ ) { + result.add( type.cast( l.get( i ).getComponent( ) ) ); + } + } + } + + public ComponentRegistry register( Collection< NewComponentInfo< ? > > components ) throws ComponentCreationException , DuplicateComponentException , RecursiveDependenciesException , DependencyInjectionException , AmbiguousComponentException