1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
38
39 public void clearCache() {}
40
41
42
43
44 public Object resolveProxy(Object o) {
45 return o;
46 }
47
48
49
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
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 }