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 (int i = 0; i < fields.length; i++) {
026 Field field = fields[i];
027 if (field.getType() == fieldClass) {
028 Object value = decorator.decorate(instance);
029 field.setAccessible(true);
030 try {
031 field.set(instance, value);
032 } catch (IllegalAccessException e) {
033 throw new PicoCompositionException(e);
034 }
035 }
036 }
037 return instance;
038 }
039
040
041 public String getDescriptor() {
042 return "FieldDecorated";
043 }
044
045 public interface Decorator {
046
047 Object decorate(Object instance);
048
049
050 }
051
052 }