001    /*****************************************************************************
002     * Copyright (C) PicoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     *                                                                           *
008     * Original code by                                                          *
009     *****************************************************************************/
010    package org.picocontainer;
011    
012    import java.util.Collection;
013    import java.util.List;
014    import java.lang.annotation.Annotation;
015    import java.lang.reflect.Type;
016    
017    /**
018     * This is the core interface for PicoContainer. It is used to retrieve component instances from the container; it only
019     * has accessor methods (in addition to the {@link #accept(PicoVisitor)} method). In order to register components in a
020     * PicoContainer, use a {@link MutablePicoContainer}, such as {@link DefaultPicoContainer}.
021     *
022     * @author Paul Hammant
023     * @author Aslak Hellesøy
024     * @author Jon Tirsén
025     * @see <a href="package-summary.html#package_description">See package description for basic overview how to use
026     *      PicoContainer.</a>
027     */
028    public interface PicoContainer {
029    
030        /**
031         * Retrieve a component instance registered with a specific key or type. If a component cannot be found in this container,
032         * the parent container (if one exists) will be searched.
033         *
034         * @param componentKeyOrType the key or Type that the component was registered with.
035         * @return an instantiated component, or <code>null</code> if no component has been registered for the specified
036         *         key.
037         */
038        Object getComponent(Object componentKeyOrType);
039    
040        Object getComponent(Object componentKeyOrType, Type into);
041    
042        /**
043         * Retrieve a component keyed by the component type.
044         * @param componentType the type of the component
045         * @return the typed resulting object instance or null if the object does not exist.
046         */
047        <T> T getComponent(Class<T> componentType);
048    
049        /**
050         * Retrieve a component keyed by the component type and binding type.
051         * @param componentType the type of the component
052         * @param binding the binding type of the component
053         * @return the typed resulting object instance or null if the object does not exist.
054         */
055        <T> T getComponent(Class<T> componentType, Class<? extends Annotation> binding);
056    
057        /**
058         * Retrieve all the registered component instances in the container, (not including those in the parent container).
059         * The components are returned in their order of instantiation, which depends on the dependency order between them.
060         *
061         * @return all the components.
062         * @throws PicoException if the instantiation of the component fails
063         */
064        List<Object> getComponents();
065    
066        /**
067         * Retrieve the parent container of this container.
068         *
069         * @return a {@link PicoContainer} instance, or <code>null</code> if this container does not have a parent.
070         */
071        PicoContainer getParent();
072    
073        /**
074         * Find a component adapter associated with the specified key. If a component adapter cannot be found in this
075         * container, the parent container (if one exists) will be searched.
076         *
077         * @param componentKey the key that the component was registered with.
078         * @return the component adapter associated with this key, or <code>null</code> if no component has been
079         *         registered for the specified key.
080         */
081        ComponentAdapter<?> getComponentAdapter(Object componentKey);
082    
083        /**
084         * Find a component adapter associated with the specified type and binding name. If a component adapter cannot be found in this
085         * container, the parent container (if one exists) will be searched.
086         *
087         * @param componentType the type of the component.
088         * @return the component adapter associated with this class, or <code>null</code> if no component has been
089         *         registered for the specified key.
090         * @param componentNameBinding the name binding to use
091         */
092        <T> ComponentAdapter<T> getComponentAdapter(Class<T> componentType, NameBinding componentNameBinding);
093    
094        /**
095         * Find a component adapter associated with the specified type and binding type. If a component adapter cannot be found in this
096         * container, the parent container (if one exists) will be searched.
097         *
098         * @param componentType the type of the component.
099         * @return the component adapter associated with this class, or <code>null</code> if no component has been
100         *         registered for the specified key.
101         * @param binding the typed binding to use
102         */
103        <T> ComponentAdapter<T> getComponentAdapter(Class<T> componentType, Class<? extends Annotation> binding);
104    
105        /**
106         * Retrieve all the component adapters inside this container. The component adapters from the parent container are
107         * not returned.
108         *
109         * @return a collection containing all the {@link ComponentAdapter}s inside this container. The collection will not
110         *         be modifiable.
111         * @see #getComponentAdapters(Class) a variant of this method which returns the component adapters inside this
112         *      container that are associated with the specified type.
113         */
114        Collection<ComponentAdapter<?>> getComponentAdapters();
115    
116        /**
117         * Retrieve all component adapters inside this container that are associated with the specified type. The addComponent
118         * adapters from the parent container are not returned.
119         *
120         * @param componentType the type of the components.
121         * @return a collection containing all the {@link ComponentAdapter}s inside this container that are associated with
122         *         the specified type. Changes to this collection will not be reflected in the container itself.
123         */
124        <T> List<ComponentAdapter<T>> getComponentAdapters(Class<T> componentType);
125    
126        /**
127         * Retrieve all component adapters inside this container that are associated with the specified type and binding type. The addComponent
128         * adapters from the parent container are not returned.
129         *
130         * @param componentType the type of the components.
131         * @param binding the typed binding to use
132         * @return a collection containing all the {@link ComponentAdapter}s inside this container that are associated with
133         *         the specified type. Changes to this collection will not be reflected in the container itself.
134         */
135        <T> List<ComponentAdapter<T>> getComponentAdapters(Class<T> componentType, Class<? extends Annotation> binding);
136    
137        /**
138         * Returns a List of components of a certain componentType. The list is ordered by instantiation order, starting
139         * with the components instantiated first at the beginning.
140         *
141         * @param componentType the searched type.
142         * @return a List of components.
143         * @throws PicoException if the instantiation of a component fails
144         */
145        <T> List<T> getComponents(Class<T> componentType);
146    
147        /**
148         * Accepts a visitor that should visit the child containers, component adapters and component instances.
149         *
150         * @param visitor the visitor
151         */
152        void accept(PicoVisitor visitor);
153    
154    }