package org.oddjob.values.types; import java.util.LinkedHashMap; import java.util.Map; import org.oddjob.arooa.ArooaSession; import org.oddjob.arooa.ArooaValue; import org.oddjob.arooa.beanutils.MagicBeanClassCreator; import org.oddjob.arooa.beanutils.MagicBeanDescriptorFactory; import org.oddjob.arooa.convert.ArooaConversionException; import org.oddjob.arooa.deploy.annotations.ArooaHidden; import org.oddjob.arooa.life.ArooaSessionAware; import org.oddjob.arooa.reflect.ArooaClass; import org.oddjob.arooa.reflect.PropertyAccessor; import org.oddjob.arooa.types.ValueFactory; /** * Create an on the fly bean. Useful for testing. See also * {@link MagicClassType} and {@link MagicBeanDescriptorFactory}. * * @author rob * */ public class MagicBeanType implements ValueFactory<Object>, ArooaSessionAware { private ArooaClass magicClass; private Map<String, ArooaValue> properties = new LinkedHashMap<String, ArooaValue>(); private ArooaSession session; @ArooaHidden @Override public void setArooaSession(ArooaSession session) { this.session = session; } @Override public Object toValue() throws ArooaConversionException { ArooaClass magicClass = this.magicClass; if (magicClass == null) { MagicBeanClassCreator creator = new MagicBeanClassCreator( "MagicBeanType"); for (String property : properties.keySet()) { creator.addProperty(property, Object.class); } magicClass = creator.create(); } Object bean = magicClass.newInstance(); PropertyAccessor accessor = session.getTools().getPropertyAccessor( ).accessorWithConversions(session.getTools( ).getArooaConverter()); for (Map.Entry<String, ArooaValue> property : properties.entrySet()) { ArooaValue value = property.getValue(); accessor.setProperty(bean, property.getKey(), value); } return bean; } public ArooaClass getMagicClass() { return magicClass; } public void setMagicClass(ArooaClass magicClass) { this.magicClass = magicClass; } public void setProperties(String name, ArooaValue value) { if (value == null) { properties.remove(name); } else { properties.put(name, value); } } public ArooaValue getProperties(String name) { return properties.get(name); } }