    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     ******************************************************************************/
    008    package org.picocontainer.parameters;
    009
    010    import java.io.Serializable;
    011    import java.lang.annotation.Annotation;
    012    import java.lang.reflect.Constructor;
    013    import java.lang.reflect.Type;
    014
    015    import org.picocontainer.ComponentAdapter;
    016    import org.picocontainer.NameBinding;
    017    import org.picocontainer.Parameter;
    018    import org.picocontainer.PicoContainer;
    019    import org.picocontainer.PicoVisitor;
    020
    021    /**
    022     * Part of the replacement construct for Parameter.ZERO
    023     * @since PicoContainer 2.8
    024     */
    025    @SuppressWarnings("serial")
    026    public final class DefaultConstructorParameter 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    }