001 /*****************************************************************************
002 * Copyright (C) NanoContainer 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 Joerg Schaibe *
009 *****************************************************************************/
010
011 package org.picocontainer.gems.adapters;
012
013 import com.thoughtworks.proxy.ProxyFactory;
014 import com.thoughtworks.proxy.factory.StandardProxyFactory;
015
016 import org.picocontainer.ComponentAdapter;
017 import org.picocontainer.Parameter;
018 import org.picocontainer.PicoIntrospectionException;
019 import org.picocontainer.defaults.AssignabilityRegistrationException;
020 import org.picocontainer.defaults.ComponentAdapterFactory;
021 import org.picocontainer.defaults.DecoratingComponentAdapterFactory;
022 import org.picocontainer.defaults.NotConcreteRegistrationException;
023
024
025 /**
026 * Factory for the AssimilatingComponentAdapter. This factory will create {@link AssimilatingComponentAdapter} instances for all
027 * {@link ComponentAdapter} instances created by the delegate. This will assimilate every component for a specific type.
028 *
029 * @author Jörg Schaible
030 * @since 1.2
031 */
032 public class AssimilatingComponentAdapterFactory extends DecoratingComponentAdapterFactory {
033
034 private final ProxyFactory proxyFactory;
035 private final Class assimilationType;
036
037 /**
038 * Construct an AssimilatingComponentAdapterFactory. The instance will use the {@link StandardProxyFactory} using the JDK
039 * implementation.
040 *
041 * @param delegate The delegated {@link ComponentAdapterFactory}.
042 * @param type The assimilated type.
043 */
044 public AssimilatingComponentAdapterFactory(final ComponentAdapterFactory delegate, final Class type) {
045 this(delegate, type, new StandardProxyFactory());
046 }
047
048 /**
049 * Construct an AssimilatingComponentAdapterFactory using a special {@link ProxyFactory}.
050 *
051 * @param delegate The delegated {@link ComponentAdapterFactory}.
052 * @param type The assimilated type.
053 * @param proxyFactory The proxy factory to use.
054 */
055 public AssimilatingComponentAdapterFactory(
056 final ComponentAdapterFactory delegate, final Class type, final ProxyFactory proxyFactory) {
057 super(delegate);
058 this.assimilationType = type;
059 this.proxyFactory = proxyFactory;
060 }
061
062 /**
063 * Create a {@link AssimilatingComponentAdapter}. This adapter will wrap the returned {@link ComponentAdapter} of the
064 * deleated {@link ComponentAdapterFactory}.
065 *
066 * @see org.picocontainer.defaults.DecoratingComponentAdapterFactory#createComponentAdapter(java.lang.Object,
067 * java.lang.Class, org.picocontainer.Parameter[])
068 */
069 public ComponentAdapter createComponentAdapter(
070 final Object componentKey, final Class componentImplementation, final Parameter[] parameters)
071 throws PicoIntrospectionException, AssignabilityRegistrationException, NotConcreteRegistrationException {
072 return new AssimilatingComponentAdapter(assimilationType, super.createComponentAdapter(
073 componentKey, componentImplementation, parameters), proxyFactory);
074 }
075 }