KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > dozer > util > mapping > util > DestBeanCreator


1 /*
2  * Copyright 2005-2007 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package net.sf.dozer.util.mapping.util;
17
18 import java.lang.reflect.InvocationTargetException JavaDoc;
19 import java.util.Map JavaDoc;
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 /**
31  * @author tierney.matt
32  * @author garsombke.franz
33  */

34 public class DestBeanCreator {
35   private static final Log log = LogFactory.getLog(DestBeanCreator.class);
36   
37   private final Map JavaDoc factories;
38   private final MappingUtils mappingUtils = new MappingUtils();
39   
40   public DestBeanCreator(Map JavaDoc factories) {
41     this.factories = factories;
42   }
43
44   public Object JavaDoc create(Object JavaDoc srcObject, ClassMap classMap, Class JavaDoc destClass)
45       throws InstantiationException JavaDoc, IllegalAccessException JavaDoc, ClassNotFoundException JavaDoc,
46       NoSuchMethodException JavaDoc, InvocationTargetException JavaDoc {
47     return create(srcObject, classMap, null, destClass);
48   }
49
50   public Object JavaDoc create(Object JavaDoc srcObject, ClassMap classMap, FieldMap fieldMap, Class JavaDoc destClass)
51       throws InstantiationException JavaDoc, IllegalAccessException JavaDoc, ClassNotFoundException JavaDoc, NoSuchMethodException JavaDoc, InvocationTargetException JavaDoc {
52     Object JavaDoc rvalue = null;
53     DozerClass destClassObj = classMap.getDestClass();
54     String JavaDoc factoryName = destClassObj.getBeanFactory();
55     // see if there are any static createMethods
56
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 factory name wasn't specified, just create new instance. Otherwise use
66
// the specified custom bean factory
67
if (mappingUtils.isBlankOrNull(factoryName)) {
68       try {
69         rvalue = destClassObj.getClassToMap().newInstance();
70       } catch (InstantiationException JavaDoc e) {
71         if (destClass != null) {
72           return destClass.newInstance();
73         }
74         // we could be dealing with an Interface or Abstract Class which was
75
// mapped using a Class Level mapId
76
// try to see if the parentFieldMap dest field has a hint...
77
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       // verify factory returned expected dest object type
88
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 JavaDoc createFromFactory(Object JavaDoc srcObject, Class JavaDoc srcObjectClass, String JavaDoc factoryName, String JavaDoc factoryBeanId,
101       Class JavaDoc destClass) throws ClassNotFoundException JavaDoc, IllegalAccessException JavaDoc, InstantiationException JavaDoc {
102
103     // By default, use dest object class name for factory bean id
104
String JavaDoc beanId = !mappingUtils.isBlankOrNull(factoryBeanId) ? factoryBeanId : destClass.getName();
105
106     BeanFactoryIF factory = (BeanFactoryIF) factories.get(factoryName);
107
108     if (factory == null) {
109       Class JavaDoc 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       // put the created factory in our factory map
115
factories.put(factoryName, factory);
116     }
117     Object JavaDoc 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