package org.oddjob.values.types; import java.util.LinkedHashMap; import java.util.Map; import javax.inject.Inject; import org.oddjob.arooa.beanutils.MagicBeanClassCreator; import org.oddjob.arooa.beanutils.MagicBeanDescriptorFactory; import org.oddjob.arooa.convert.ArooaConversionException; import org.oddjob.arooa.reflect.ArooaClass; import org.oddjob.arooa.types.ValueFactory; import org.oddjob.arooa.utils.ClassUtils; import org.oddjob.beanbus.destinations.BeanCopy; /** * @oddjob.description Definition for a Magic Bean, which is a bean that * can be defined dynamically. * <p> * See also {@link MagicBeanDescriptorFactory}. * * @oddjob.example Using a magic-class to create a magic bean. * * {@oddjob.xml.resource org/oddjob/values/types/MagicBeanTypeExample.xml} * * @oddjob.exemple See also {@link BeanCopy} * * @author rob * */ public class MagicClassType implements ValueFactory<ArooaClass>{ /** * @oddjob.property * @oddjob.description The name of the class. * @oddjob.required Yes. */ private String name; /** * @oddjob.property * @oddjob.description The bean properties. A mapping of name to * class name. * @oddjob.required No. */ private final Map<String, String> properties = new LinkedHashMap<String, String>(); /** * @oddjob.property * @oddjob.description The class loader. * @oddjob.required No. Set automatically by Oddjob. */ private ClassLoader classLoader; public String getName() { return name; } public void setName(String name) { this.name = name; } public void setProperties(String key, String className) { if (key == null) { properties.remove(key); } else { properties.put(key, className); } } public String getProperties(String key) { return properties.get(key); } public ClassLoader getClassLoader() { return classLoader; } @Inject public void setClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } @Override public ArooaClass toValue() throws ArooaConversionException { MagicBeanClassCreator classCreator = new MagicBeanClassCreator(name); for (Map.Entry<String, String> prop : properties.entrySet()) { String className = prop.getValue(); String propertyName = prop.getKey(); Class<?> cl; if (className == null) { cl = Object.class; } else { try { cl = ClassUtils.classFor(className, classLoader); } catch (ClassNotFoundException e) { throw new ArooaConversionException("For MagicBean class " + name + ", property " + propertyName, e); } } classCreator.addProperty(propertyName, cl); } return classCreator.create(); } @Override public String toString() { return getClass().getSimpleName() + ": " + name; } }