1 16 package net.sf.dozer.util.mapping.util; 17 18 import java.lang.reflect.InvocationTargetException ; 19 import java.util.Map ; 20 21 import net.sf.dozer.util.mapping.BeanFactoryIF; 22 import net.sf.dozer.util.mapping.MappingException; 23 import net.sf.dozer.util.mapping.fieldmap.ClassMap; 24 import net.sf.dozer.util.mapping.fieldmap.DozerClass; 25 import net.sf.dozer.util.mapping.fieldmap.FieldMap; 26 27 import org.apache.commons.logging.Log; 28 import org.apache.commons.logging.LogFactory; 29 30 34 public class DestBeanCreator { 35 private static final Log log = LogFactory.getLog(DestBeanCreator.class); 36 37 private final Map factories; 38 private final MappingUtils mappingUtils = new MappingUtils(); 39 40 public DestBeanCreator(Map factories) { 41 this.factories = factories; 42 } 43 44 public Object create(Object srcObject, ClassMap classMap, Class destClass) 45 throws InstantiationException , IllegalAccessException , ClassNotFoundException , 46 NoSuchMethodException , InvocationTargetException { 47 return create(srcObject, classMap, null, destClass); 48 } 49 50 public Object create(Object srcObject, ClassMap classMap, FieldMap fieldMap, Class destClass) 51 throws InstantiationException , IllegalAccessException , ClassNotFoundException , NoSuchMethodException , InvocationTargetException { 52 Object rvalue = null; 53 DozerClass destClassObj = classMap.getDestClass(); 54 String factoryName = destClassObj.getBeanFactory(); 55 if (fieldMap != null) { 57 if (fieldMap.getDestField().getCreateMethod() != null) { 58 return destClassObj.getClassToMap().getMethod(fieldMap.getDestField().getCreateMethod(), null).invoke(null, null); 59 } 60 } 61 if (classMap.getDestClass().getCreateMethod() != null) { 62 return destClassObj.getClassToMap().getMethod( 63 classMap.getDestClass().getCreateMethod(), null).invoke(null, null); 64 } 65 if (mappingUtils.isBlankOrNull(factoryName)) { 68 try { 69 rvalue = destClassObj.getClassToMap().newInstance(); 70 } catch (InstantiationException e) { 71 if (destClass != null) { 72 return destClass.newInstance(); 73 } 74 if (fieldMap != null && fieldMap.getDestinationTypeHint() != null) { 78 return fieldMap.getDestinationTypeHint().getHint().newInstance(); 79 } else { 80 throw e; 81 } 82 } 83 } else { 84 rvalue = createFromFactory(srcObject, classMap.getSourceClass() 85 .getClassToMap(), factoryName, destClassObj.getFactoryBeanId(), 86 destClassObj.getClassToMap()); 87 if (!classMap.getDestClass().getClassToMap().isAssignableFrom( 89 rvalue.getClass())) { 90 throw new MappingException( 91 "Custom bean factory did not return correct type of destination data object. Expected: " 92 + classMap.getDestClass().getClassToMap() 93 + ", Actual: " 94 + rvalue.getClass()); 95 } 96 } 97 return rvalue; 98 } 99 100 public Object createFromFactory(Object srcObject, Class srcObjectClass, String factoryName, String factoryBeanId, 101 Class destClass) throws ClassNotFoundException , IllegalAccessException , InstantiationException { 102 103 String beanId = !mappingUtils.isBlankOrNull(factoryBeanId) ? factoryBeanId : destClass.getName(); 105 106 BeanFactoryIF factory = (BeanFactoryIF) factories.get(factoryName); 107 108 if (factory == null) { 109 Class factoryClass = Class.forName(factoryName); 110 if (!BeanFactoryIF.class.isAssignableFrom(factoryClass)) { 111 throw new MappingException("Custom bean factory must implement the BeanFactoryIF interface."); 112 } 113 factory = (BeanFactoryIF) factoryClass.newInstance(); 114 factories.put(factoryName, factory); 116 } 117 Object rvalue = factory.createBean(srcObject, srcObjectClass, beanId); 118 119 log.debug("Bean instance created with custom factory -->" + "\n Bean Type: " + rvalue.getClass().getName() 120 + "\n Factory Name: " + factoryName); 121 return rvalue; 122 } 123 124 125 126 } | Popular Tags |