1 10 package org.picocontainer.gems.adapters; 11 12 import com.thoughtworks.proxy.ProxyFactory; 13 import com.thoughtworks.proxy.factory.StandardProxyFactory; 14 import com.thoughtworks.proxy.kit.ObjectReference; 15 import com.thoughtworks.proxy.kit.ReflectionUtils; 16 import com.thoughtworks.proxy.toys.delegate.Delegating; 17 import com.thoughtworks.proxy.toys.hotswap.HotSwapping; 18 19 import org.picocontainer.ComponentAdapter; 20 import org.picocontainer.PicoContainer; 21 import org.picocontainer.defaults.DecoratingComponentAdapter; 22 23 import java.util.Arrays ; 24 import java.util.HashSet ; 25 import java.util.Set ; 26 27 28 42 public class HotSwappingComponentAdapter extends DecoratingComponentAdapter { 43 private final ProxyFactory proxyFactory; 44 45 private static class ImplementationHidingReference implements ObjectReference { 46 private final ComponentAdapter delegate; 47 private Object componentInstance; 48 private final PicoContainer container; 49 50 public ImplementationHidingReference(ComponentAdapter delegate, PicoContainer container) { 51 this.delegate = delegate; 52 this.container = container; 53 } 54 55 public Object get() { 56 if (componentInstance == null) { 57 componentInstance = delegate.getComponentInstance(container); 58 } 59 return componentInstance; 60 } 61 62 public void set(Object item) { 63 componentInstance = item; 64 } 65 } 66 67 public HotSwappingComponentAdapter(final ComponentAdapter delegate, ProxyFactory proxyFactory) { 68 super(delegate); 69 this.proxyFactory = proxyFactory; 70 } 71 72 public HotSwappingComponentAdapter(ComponentAdapter delegate) { 73 this(delegate, new StandardProxyFactory()); 74 } 75 76 public Object getComponentInstance(final PicoContainer container) { 77 final Class [] proxyTypes; 78 if (getComponentKey() instanceof Class && proxyFactory.canProxy((Class )getComponentKey())) { 79 proxyTypes = new Class []{(Class )getComponentKey()}; 80 } else { 81 Set types = new HashSet (Arrays.asList(getComponentImplementation().getInterfaces())); 82 ReflectionUtils.addIfClassProxyingSupportedAndNotObject(getComponentImplementation(), types, proxyFactory); 83 proxyTypes = (Class [])types.toArray(new Class [types.size()]); 84 } 85 ObjectReference reference = new ImplementationHidingReference(getDelegate(), container); 86 return HotSwapping.object(proxyTypes, proxyFactory, reference, Delegating.MODE_DIRECT); 87 } 88 } 89 | Popular Tags |