View Javadoc

1   /*
2    * Copyright 2007-2008 The Kuali Foundation
3    * 
4    * Licensed under the Educational Community 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.opensource.org/licenses/ecl2.php
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 org.kuali.rice.kns.dao.impl;
17  
18  import java.lang.reflect.Field;
19  import java.util.ArrayList;
20  import java.util.HashMap;
21  import java.util.Map;
22  
23  import javax.persistence.EntityManager;
24  import javax.persistence.PersistenceContext;
25  
26  import org.kuali.rice.core.jpa.metadata.CollectionDescriptor;
27  import org.kuali.rice.core.jpa.metadata.EntityDescriptor;
28  import org.kuali.rice.core.jpa.metadata.MetadataManager;
29  import org.kuali.rice.core.jpa.metadata.ObjectDescriptor;
30  import org.kuali.rice.kns.bo.PersistableBusinessObject;
31  import org.kuali.rice.kns.dao.PersistenceDao;
32  import org.kuali.rice.kns.service.KNSServiceLocator;
33  
34  public class PersistenceDaoJpa implements PersistenceDao {
35      
36  	/**
37  	 * @see org.kuali.rice.kns.dao.PersistenceDao#clearCache()
38  	 */
39  	public void clearCache() {}
40  
41  	/**
42  	 * @see org.kuali.rice.kns.dao.PersistenceDao#resolveProxy(java.lang.Object)
43  	 */
44  	public Object resolveProxy(Object o) {
45  		return o;
46  	}
47  
48  	/**
49  	 * @see org.kuali.rice.kns.dao.PersistenceDao#retrieveAllReferences(java.lang.Object)
50  	 */
51  	public void retrieveAllReferences(Object o) {
52  		EntityDescriptor ed = MetadataManager.getEntityDescriptor(o.getClass());
53  		for (ObjectDescriptor od : ed.getObjectRelationships()) {
54  			retrieveReference(o, od.getAttributeName());
55  		}
56  		for (CollectionDescriptor cd : ed.getCollectionRelationships()) {
57  			retrieveReference(o, cd.getAttributeName());
58  		}
59  	}
60  
61  	/**
62  	 * @see org.kuali.rice.kns.dao.PersistenceDao#retrieveReference(java.lang.Object, java.lang.String)
63  	 */
64  	public void retrieveReference(Object o, String referenceName) {
65  		try {
66  			Field field = getField(o.getClass(), referenceName);
67  			field.setAccessible(true);
68  			
69  			String fk = null;
70  
71  			EntityDescriptor ed = MetadataManager.getEntityDescriptor(o.getClass());
72  			CollectionDescriptor cd = ed.getCollectionDescriptorByName(referenceName);
73  			if (cd == null) {
74  				ObjectDescriptor od = ed.getObjectDescriptorByName(referenceName);
75  				fk = od.getForeignKeyFields().get(0);
76  			} else {
77  				fk = cd.getForeignKeyFields().get(0);
78  			}
79  			
80  			Field field2 = null;
81  			try {
82  				field2 = getField(o.getClass(), fk);
83  			} catch (Exception e) {
84  				String pk = ed.getPrimaryKeys().iterator().next().getName();				
85  				field2 = getField(o.getClass(), pk);
86  			}
87  			field2.setAccessible(true);
88  			Object fkFieldValue = field2.get(o);
89  
90  			if ("java.util.List".equals(field.getType().getCanonicalName())) {	
91  				Field field3 = getField(o.getClass(), ed.getPrimaryKeys().iterator().next().getName());
92  				field3.setAccessible(true);
93  				if (field3.get(o) == null) {
94  					field.set(o, new ArrayList());
95  				} else {
96  					Map pk = new HashMap();
97  					pk.put(cd.getForeignKeyFields().get(0), field3.get(o));
98  					field.set(o, KNSServiceLocator.getBusinessObjectService().findMatching(cd.getTargetEntity(), pk));
99  				}
100 			} else {
101 				PersistableBusinessObject pbo = (PersistableBusinessObject) Class.forName(field.getType().getCanonicalName()).newInstance();
102 	            Map<String, Object> keys = MetadataManager.getPersistableBusinessObjectPrimaryKeyValuePairs(pbo);
103 				Field field3 = getField(pbo.getClass(), keys.keySet().iterator().next());
104 				field3.setAccessible(true);
105 				field3.set(pbo, fkFieldValue);
106 				field.set(o, KNSServiceLocator.getBusinessObjectService().retrieve(pbo));
107 			}
108 		} catch (Exception e) {
109 			e.printStackTrace();
110 		}		
111 	}
112 	
113 	private Field getField(Class clazz, String name) throws NoSuchFieldException {
114 		if (clazz.equals(Object.class)) {
115 			throw new NoSuchFieldException(name);
116 		}
117 		Field field = null;
118 		try {
119 			field = clazz.getDeclaredField(name);
120 		} catch (Exception e) {}
121 		if (field == null) {
122 			field = getField(clazz.getSuperclass(), name);
123 		}
124 		return field;
125 	}
126 
127 }