001/*******************************************************************************
002 * Copyright (C) PicoContainer Organization. All rights reserved. 
003 * ---------------------------------------------------------------------------
004 * The software in this package is published under the terms of the BSD style
005 * license a copy of which has been included with this distribution in the
006 * LICENSE.txt file. 
007 ******************************************************************************/
008package org.picocontainer.parameters;
009
010import java.io.Serializable;
011import java.lang.annotation.Annotation;
012import java.lang.reflect.Constructor;
013import java.lang.reflect.Type;
014
015import org.picocontainer.ComponentAdapter;
016import org.picocontainer.NameBinding;
017import org.picocontainer.Parameter;
018import org.picocontainer.PicoContainer;
019import org.picocontainer.PicoVisitor;
020
021/**
022 * Part of the replacement construct for Parameter.ZERO
023 * @since PicoContainer 2.8
024 */
025@SuppressWarnings("serial")
026public final class DefaultConstructorParameter extends AbstractParameter implements Parameter, Serializable {
027
028        /**
029         * The one and only instance
030         */
031        public static final DefaultConstructorParameter INSTANCE = new DefaultConstructorParameter();
032        
033        /**
034         * No instantiation
035         */
036        public void accept(PicoVisitor visitor) {
037                visitor.visitParameter(this);
038        }
039
040        public Resolver resolve(PicoContainer container,
041                            ComponentAdapter<?> forAdapter, ComponentAdapter<?> injecteeAdapter, Type expectedType,
042                            NameBinding expectedNameBinding, boolean useNames,
043                            Annotation binding) {
044                return new Parameter.NotResolved();
045        }
046
047        public void verify(PicoContainer container,
048                        ComponentAdapter<?> adapter, Type expectedType,
049                        NameBinding expectedNameBinding, boolean useNames,
050                        Annotation binding) {
051                
052                if (!(expectedType instanceof Class)) {
053                        throw new ClassCastException("Unable to use except for class types.  Offending type: " + expectedType);
054                }
055                
056                Class<?> type = (Class<?>)expectedType;
057                try {
058                        Constructor constructor = type.getConstructor();
059                } catch (NoSuchMethodException e) {
060                        throw new IllegalArgumentException("No default constructor for type " + expectedType,e );
061                }       
062        }
063
064    @Override
065        public String toString() {
066                return "Force Default Constructor Parameter";
067        }
068        
069        /**
070         * Returns true if the object object is a DEFAULT_CONSTRUCTOR object.
071         * {@inheritDoc}
072         * @see java.lang.Object#equals(java.lang.Object)
073         */
074        @Override
075        public boolean equals(Object other) {
076                if (other == null) {
077                        return false;
078                }
079                
080                return (other.getClass().getName()).equals(getClass().getName());
081        }
082}