1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.web.form;
17
18 import org.apache.commons.beanutils.PropertyUtils;
19 import org.apache.commons.lang.StringUtils;
20 import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
21 import org.kuali.rice.krad.service.KRADServiceLocator;
22 import org.kuali.rice.krad.uif.util.ObjectPropertyUtils;
23 import org.kuali.rice.krad.uif.util.SessionTransient;
24 import org.kuali.rice.krad.uif.view.HistoryEntry;
25 import org.kuali.rice.krad.util.ObjectUtils;
26
27 import java.io.Serializable;
28 import java.lang.annotation.Annotation;
29 import java.lang.reflect.Field;
30 import java.util.ArrayList;
31 import java.util.HashMap;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.Vector;
35
36
37
38
39
40
41 public class UifFormManager implements Serializable {
42 private static final long serialVersionUID = -6323378881342207080L;
43
44 private int maxNumberOfSessionForms = 5;
45
46 private Vector accessedFormKeys;
47
48 private Map<String, UifFormBase> sessionForms;
49
50
51
52
53 public UifFormManager() {
54 this.accessedFormKeys = new Vector();
55 this.sessionForms = new HashMap<String, UifFormBase>();
56
57 String maxNumberOfSessionFormsConfig =
58 KRADServiceLocator.getKualiConfigurationService().getPropertyValueAsString("maxNumberOfSessionForms");
59 if (StringUtils.isNotBlank(maxNumberOfSessionFormsConfig)) {
60 maxNumberOfSessionForms = Integer.parseInt(maxNumberOfSessionFormsConfig);
61 }
62 }
63
64
65
66
67
68
69 public void addSessionForm(UifFormBase form) {
70 if (form == null || StringUtils.isBlank(form.getFormKey())) {
71 throw new RiceIllegalArgumentException("Form or form key was null");
72 }
73
74 sessionForms.put(form.getFormKey(), form);
75
76
77 if (accessedFormKeys.contains(form.getFormKey())) {
78 accessedFormKeys.removeElement(form.getFormKey());
79 }
80 accessedFormKeys.add(form.getFormKey());
81
82
83 if (sessionForms.size() > maxNumberOfSessionForms) {
84
85 String removeFormKey = (String) accessedFormKeys.get(0);
86 if (sessionForms.containsKey(removeFormKey)) {
87 sessionForms.remove(removeFormKey);
88 }
89 accessedFormKeys.removeElementAt(0);
90 }
91 }
92
93
94
95
96
97
98
99 public UifFormBase getSessionForm(String formKey) {
100 if (sessionForms.containsKey(formKey)) {
101 return sessionForms.get(formKey);
102 }
103
104 return null;
105 }
106
107
108
109
110
111
112 public void removeSessionForm(UifFormBase form) {
113 if (form == null || StringUtils.isBlank(form.getFormKey())) {
114 return;
115 }
116
117 removeSessionFormByKey(form.getFormKey());
118 }
119
120
121
122
123
124
125 public void removeFormWithHistoryFormsByKey(String formKey) {
126 if (sessionForms.containsKey(formKey)) {
127
128 for (HistoryEntry historyEntry : sessionForms.get(formKey).getFormHistory().getHistoryEntries()) {
129 removeSessionFormByKey(historyEntry.getFormKey());
130 }
131
132 removeSessionFormByKey(formKey);
133 }
134 }
135
136
137
138
139
140
141 public void removeSessionFormByKey(String formKey) {
142 if (accessedFormKeys.contains(formKey)) {
143 accessedFormKeys.removeElement(formKey);
144 }
145
146 if (sessionForms.containsKey(formKey)) {
147 sessionForms.remove(formKey);
148 }
149 }
150
151
152
153
154
155
156
157
158 public void updateFormWithSession(UifFormBase requestForm, String formKey) {
159 UifFormBase sessionForm = sessionForms.get(formKey);
160 if (sessionForm == null) {
161 return;
162 }
163
164 List<Field> fields = new ArrayList<Field>();
165 fields = ObjectUtils.getAllFields(fields, sessionForm.getClass(), UifFormBase.class);
166 for (Field field : fields) {
167 boolean copyValue = true;
168 for (Annotation an : field.getAnnotations()) {
169 if (an instanceof SessionTransient) {
170 copyValue = false;
171 }
172 }
173
174 if (copyValue && ObjectPropertyUtils.isReadableProperty(sessionForm, field.getName()) && ObjectPropertyUtils
175 .isWritableProperty(sessionForm, field.getName())) {
176 Object fieldValue = ObjectPropertyUtils.getPropertyValue(sessionForm, field.getName());
177 ObjectPropertyUtils.setPropertyValue(requestForm, field.getName(), fieldValue);
178 }
179 }
180 }
181
182
183
184
185
186
187 public void purgeForm(UifFormBase form) {
188 List<Field> fields = new ArrayList<Field>();
189 fields = ObjectUtils.getAllFields(fields, form.getClass(), UifFormBase.class);
190 for (Field field : fields) {
191 boolean purgeValue = false;
192
193 if (!field.getType().isPrimitive()) {
194 for (Annotation an : field.getAnnotations()) {
195 if (an instanceof SessionTransient) {
196 purgeValue = true;
197 }
198 }
199 }
200
201 if (purgeValue && ObjectPropertyUtils.isWritableProperty(form, field.getName())) {
202 ObjectPropertyUtils.setPropertyValue(form, field.getName(), null);
203 }
204 }
205 }
206
207
208
209
210
211
212
213
214
215
216
217
218 protected Vector getAccessedFormKeys() {
219 return accessedFormKeys;
220 }
221
222
223
224
225
226
227 public int getMaxNumberOfSessionForms() {
228 return maxNumberOfSessionForms;
229 }
230
231
232
233
234
235
236 public void setMaxNumberOfSessionForms(int maxNumberOfSessionForms) {
237 this.maxNumberOfSessionForms = maxNumberOfSessionForms;
238 }
239
240 }