package org.ripple.power.ioc; import java.util.Set; import org.ripple.power.ioc.injector.Container; import org.ripple.power.ioc.injector.attribute.AttributeInjectorBuilder; import org.ripple.power.ioc.reflect.Reflector; import org.ripple.power.utils.ReflectorUtils; final public class IocBind implements Ioc { private Reflector reflector; private Container container; private Object object; private AttributeInjectorBuilder builder; private int model = 0; IocBind(final Container container, final Class<?> clazz) { this(container, clazz, 0); } IocBind(final Container container, final Class<?> clazz, final int model) { this(container, clazz, null, 0); } IocBind(final Container container, final Class<?> clazz, final Object[] args) { this(container, clazz, args, 0); } IocBind(final Container container, final Class<? extends Object> clazz, final Object[] args, final int model) { this.container = container; this.reflector = Reflector.getReflector(clazz); if (args == null) { object = reflector.newInstance(); } else { object = reflector.newInstance(args); } this.model = model; this.container.addInstanceBind(clazz, object); this.builder = container.addAttributeInjector(clazz); } IocBind(final Container container, final Object source, final int model) { if (container == null) { throw new RuntimeException("!"); } if (source == null) { throw new RuntimeException("!"); } Class<? extends Object> clazz = source.getClass(); this.container = container; this.reflector = Reflector.getReflector(clazz); this.object = source; this.model = model; this.container.addInstanceBind(clazz, object); this.builder = container.addAttributeInjector(clazz); } private void bindIoc() { object = getObject(); } public Object getThis() { return object; } public Ioc getChild(String method) { Ioc ioc = null; try { ioc = new IocBind(container, doInvoke(method), model); } catch (Exception e) { } return ioc; } public Set<Object> getFeilds() { return reflector.getFields(); } public Object getFeild(final String name) { bindIoc(); try { return ReflectorUtils.getField(object, name); } catch (Exception e) { throw new RuntimeException(e); } } public boolean isImplInterface(final Class<?> clazz) { return reflector.isImplInterface(clazz); } public boolean isImplInterface(final String className) { return reflector.isImplInterface(className); } public Object doInvoke(final String methodName, final Object[] args) throws Exception { bindIoc(); return reflector.doInvoke(object, methodName, args); } public Object doInvoke(String methodName) throws Exception { bindIoc(); return reflector.doInvoke(object, ReflectorUtils.getMatchGetMethod( reflector.getReflectedClass(), methodName), null); } public Container getContainer() { return container; } public void setMethod(String attributeName, String value) { setMethod(attributeName, value); } public void setMethod(String attributeName, byte value) { setMethod(attributeName, new Byte(value)); } public void setMethod(String attributeName, char value) { setMethod(attributeName, new Character(value)); } public void setMethod(String attributeName, short value) { setMethod(attributeName, new Short(value)); } public void setMethod(String attributeName, int value) { setMethod(attributeName, new Integer(value)); } public void setMethod(String attributeName, long value) { setMethod(attributeName, new Long(value)); } public void setMethod(String attributeName, double value) { setMethod(attributeName, new Double(value)); } public void setMethod(String attributeName, float value) { setMethod(attributeName, new Float(value)); } public void setMethod(String attributeName, boolean value) { setMethod(attributeName, new Boolean(value)); } public void setMethod(final String attributeName, final Object value) { switchMethod(attributeName, value); } private void switchMethod(final String methodName, final Object value) { switch (model) { case MODEL.LIKE: builder.addAttributeInstance(reflector, methodName, value); break; case MODEL.GUESS: container.addAttributeInjector(reflector.getReflectedClass()) .addAttributeInstance(reflector, methodName, value); break; default: break; } return; } public Object getObject() { switch (model) { case MODEL.LIKE: return container.getInstance(reflector.getReflectedClass()); case MODEL.GUESS: container.inject(object); return object; default: return null; } } private interface MODEL { int LIKE = 0; int GUESS = 1; } public void finalize() { reflector = null; builder = null; object = null; } }