001 package org.picocontainer.behaviors;
002
003 import org.picocontainer.ComponentAdapter;
004 import org.picocontainer.PicoCompositionException;
005 import org.picocontainer.PicoContainer;
006
007 import java.lang.reflect.Field;
008 import java.lang.reflect.Type;
009
010 @SuppressWarnings("serial")
011 public class FieldDecorated extends AbstractBehavior {
012 private final Class<?> fieldClass;
013 private final Decorator decorator;
014
015 public FieldDecorated(ComponentAdapter delegate, Class<?> fieldClass, Decorator decorator) {
016 super(delegate);
017 this.fieldClass = fieldClass;
018 this.decorator = decorator;
019 }
020
021 public Object getComponentInstance(final PicoContainer container, Type into)
022 throws PicoCompositionException {
023 Object instance = super.getComponentInstance(container, into);
024 Field[] fields = instance.getClass().getDeclaredFields();
025 for (Field field : fields) {
026 if (field.getType() == fieldClass) {
027 Object value = decorator.decorate(instance);
028 field.setAccessible(true);
029 try {
030 field.set(instance, value);
031 } catch (IllegalAccessException e) {
032 throw new PicoCompositionException(e);
033 }
034 }
035 }
036 return instance;
037 }
038
039
040 public String getDescriptor() {
041 return "FieldDecorated";
042 }
043
044 public interface Decorator {
045
046 Object decorate(Object instance);
047
048
049 }
050
051 }