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     * Idea by Rachel Davies, Original code by Aslak Hellesoy and Paul Hammant   *
009     *****************************************************************************/
010    package org.picocontainer.defaults;
011    
012    import org.picocontainer.PicoIntrospectionException;
013    
014    import java.util.Arrays;
015    
016    /**
017     * Exception that is thrown as part of the introspection. Raised if a PicoContainer cannot resolve a 
018     * type dependency because the registered {@link org.picocontainer.ComponentAdapter}s are not 
019     * distinct.  
020     * 
021     * @author Paul Hammant
022     * @author Aslak Hellesøy
023     * @author Jon Tirsén
024     * @since 1.0
025     */
026    public class AmbiguousComponentResolutionException extends PicoIntrospectionException {
027        private Class component;
028        private Class ambiguousDependency;
029        private final Object[] ambiguousComponentKeys;
030    
031    
032        /**
033         * Construct a new exception with the ambigous class type and the ambiguous component keys.
034         * 
035         * @param ambiguousDependency the unresolved dependency type
036         * @param componentKeys the ambiguous keys.
037         */
038        public AmbiguousComponentResolutionException(Class ambiguousDependency, Object[] componentKeys) {
039            super("");
040            this.ambiguousDependency = ambiguousDependency;
041            this.ambiguousComponentKeys = new Class[componentKeys.length];
042            for (int i = 0; i < componentKeys.length; i++) {
043                ambiguousComponentKeys[i] = componentKeys[i];
044            }
045        }
046    
047        /**
048         * @return Returns a string containing the unresolved class type and the ambiguous keys. 
049         */
050        public String getMessage() {
051            StringBuffer msg = new StringBuffer();
052            msg.append(component);
053            msg.append(" has ambiguous dependency on ");
054            msg.append(ambiguousDependency);
055            msg.append(", ");
056            msg.append("resolves to multiple classes: ");
057            msg.append(Arrays.asList(getAmbiguousComponentKeys()));
058            return msg.toString();
059        }
060    
061        /**
062         * @return Returns the ambiguous component keys as array.
063         */
064        public Object[] getAmbiguousComponentKeys() {
065            return ambiguousComponentKeys;
066        }
067    
068        public void setComponent(Class component) {
069            this.component = component;
070        }
071    }