1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.uif.util;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.kuali.rice.krad.uif.field.DataField;
20 import org.kuali.rice.krad.uif.view.View;
21 import org.springframework.beans.PropertyValues;
22 import org.springframework.beans.factory.config.TypedStringValue;
23
24 import java.util.Collection;
25 import java.util.Map;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class ViewModelUtils {
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 public static Class<?> getPropertyTypeByClassAndView(View view, String propertyPath) {
64 Class<?> propertyType = null;
65
66 if (StringUtils.isBlank(propertyPath)) {
67 return propertyType;
68 }
69
70
71
72 Class<?> modelClass = view.getFormClass();
73 String modelProperty = propertyPath;
74
75 int bestMatchLength = 0;
76
77
78 String flattenedPropertyPath = propertyPath.replaceAll("\\[.+\\]", "");
79
80
81 Map<String, Class<?>> modelClasses = view.getAbstractTypeClasses();
82 for (String path : modelClasses.keySet()) {
83
84 if (StringUtils.equals(path, flattenedPropertyPath)) {
85 propertyType = modelClasses.get(path);
86 break;
87 }
88
89
90 if (flattenedPropertyPath.startsWith(path) && (path.length() > bestMatchLength)) {
91 bestMatchLength = path.length();
92
93 modelClass = modelClasses.get(path);
94 modelProperty = StringUtils.removeStart(flattenedPropertyPath, path);
95 modelProperty = StringUtils.removeStart(modelProperty, ".");
96 }
97 }
98
99
100 if (propertyType == null) {
101 propertyType = ObjectPropertyUtils.getPropertyType(modelClass, modelProperty);
102 }
103
104 return propertyType;
105 }
106
107 public static String getParentObjectPath(DataField field) {
108 String parentObjectPath = "";
109
110 String objectPath = field.getBindingInfo().getBindingObjectPath();
111 String propertyPrefix = field.getBindingInfo().getBindByNamePrefix();
112
113 if (!field.getBindingInfo().isBindToForm() && StringUtils.isNotBlank(objectPath)) {
114 parentObjectPath = objectPath;
115 }
116
117 if (StringUtils.isNotBlank(propertyPrefix)) {
118 if (StringUtils.isNotBlank(parentObjectPath)) {
119 parentObjectPath += ".";
120 }
121
122 parentObjectPath += propertyPrefix;
123 }
124
125 return parentObjectPath;
126 }
127
128 public static Class<?> getParentObjectClassForMetadata(View view, DataField field) {
129 String parentObjectPath = getParentObjectPath(field);
130
131 return getPropertyTypeByClassAndView(view, parentObjectPath);
132 }
133
134 public static Class<?> getParentObjectClassForMetadata(View view, Object model, DataField field) {
135 String parentObjectPath = getParentObjectPath(field);
136
137 return getObjectClassForMetadata(view, model, parentObjectPath);
138 }
139
140 public static Class<?> getObjectClassForMetadata(View view, Object model, String propertyPath) {
141
142 Object parentObject = ObjectPropertyUtils.getPropertyValue(model, propertyPath);
143 if (parentObject != null) {
144 return parentObject.getClass();
145 }
146
147
148 return getPropertyTypeByClassAndView(view, propertyPath);
149 }
150
151 public static Object getParentObjectForMetadata(View view, Object model, DataField field) {
152
153 Object parentObject = model;
154
155 String parentObjectPath = getParentObjectPath(field);
156 if (StringUtils.isNotBlank(parentObjectPath)) {
157 parentObject = ObjectPropertyUtils.getPropertyValue(model, parentObjectPath);
158
159
160
161 if ((parentObject == null) || Collection.class.isAssignableFrom(parentObject.getClass()) ||
162 Map.class.isAssignableFrom(parentObject.getClass())) {
163 try {
164 Class<?> parentObjectClass = getPropertyTypeByClassAndView(view, parentObjectPath);
165 parentObject = parentObjectClass.newInstance();
166 } catch (InstantiationException e) {
167
168 } catch (IllegalAccessException e) {
169
170 }
171 }
172 }
173
174 return parentObject;
175 }
176
177
178
179
180
181
182
183
184 public static String getStringValFromPVs(PropertyValues propertyValues, String propertyName) {
185 String propertyValue = null;
186
187 if ((propertyValues != null) && propertyValues.contains(propertyName)) {
188 Object pvValue = propertyValues.getPropertyValue(propertyName).getValue();
189 if (pvValue instanceof TypedStringValue) {
190 TypedStringValue typedStringValue = (TypedStringValue) pvValue;
191 propertyValue = typedStringValue.getValue();
192 } else if (pvValue instanceof String) {
193 propertyValue = (String) pvValue;
194 }
195 }
196
197 return propertyValue;
198 }
199 }