1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.uif.lifecycle;
17
18 import java.util.Collections;
19 import java.util.HashMap;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.Queue;
23 import java.util.Set;
24
25 import org.apache.commons.lang.StringUtils;
26 import org.kuali.rice.krad.uif.UifConstants;
27 import org.kuali.rice.krad.uif.component.Component;
28 import org.kuali.rice.krad.uif.lifecycle.ViewLifecycle.LifecycleEvent;
29 import org.kuali.rice.krad.uif.lifecycle.finalize.SetReadOnlyOnDataBindingTask;
30 import org.kuali.rice.krad.uif.lifecycle.model.ApplyAuthAndPresentationLogicTask;
31 import org.kuali.rice.krad.uif.lifecycle.model.ComponentDefaultApplyModelTask;
32 import org.kuali.rice.krad.uif.lifecycle.model.EvaluateExpressionsTask;
33 import org.kuali.rice.krad.uif.lifecycle.model.HelperCustomApplyModelTask;
34 import org.kuali.rice.krad.uif.lifecycle.model.PopulateComponentContextTask;
35 import org.kuali.rice.krad.uif.lifecycle.model.RefreshStateModifyTask;
36 import org.kuali.rice.krad.uif.lifecycle.model.SuffixIdFromContainerTask;
37 import org.kuali.rice.krad.uif.lifecycle.model.SyncClientSideStateTask;
38 import org.kuali.rice.krad.uif.util.LifecycleElement;
39 import org.kuali.rice.krad.uif.view.View;
40 import org.kuali.rice.krad.uif.view.ViewTheme;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 public class ApplyModelComponentPhase extends ViewLifecyclePhaseBase {
68
69
70
71
72
73
74
75
76 private Set<String> visitedIds;
77
78
79
80
81 private Map<String, Object> commonContext;
82
83
84
85
86 @Override
87 protected void recycle() {
88 super.recycle();
89 visitedIds = null;
90 commonContext = null;
91 }
92
93
94
95
96
97
98
99
100
101
102
103
104 protected void prepare(LifecycleElement element, Object model, String path, List<String> refreshPaths,
105 Component parent, ViewLifecyclePhaseBase nextPhase, Set<String> visitedIds) {
106 super.prepare(element, model, path, refreshPaths, parent, nextPhase);
107
108 this.visitedIds = visitedIds;
109
110 Map<String, Object> commonContext = new HashMap<String, Object>();
111
112 View view = ViewLifecycle.getView();
113 Map<String, Object> viewContext = view.getContext();
114 if (viewContext != null) {
115 commonContext.putAll(viewContext);
116 }
117
118 ViewTheme theme = view.getTheme();
119 if (theme != null) {
120 commonContext.put(UifConstants.ContextVariableNames.THEME_IMAGES, theme.getImageDirectory());
121 }
122
123 commonContext.put(UifConstants.ContextVariableNames.COMPONENT, element instanceof Component ? element : parent);
124
125 this.commonContext = Collections.unmodifiableMap(commonContext);
126 }
127
128
129
130
131 @Override
132 public String getViewPhase() {
133 return UifConstants.ViewPhases.APPLY_MODEL;
134 }
135
136
137
138
139 @Override
140 public String getStartViewStatus() {
141 return UifConstants.ViewStatus.INITIALIZED;
142 }
143
144
145
146
147 @Override
148 public String getEndViewStatus() {
149 return UifConstants.ViewStatus.MODEL_APPLIED;
150 }
151
152
153
154
155 @Override
156 public LifecycleEvent getEventToNotify() {
157 return null;
158 }
159
160
161
162
163
164
165
166 public Map<String, Object> getCommonContext() {
167 return commonContext;
168 }
169
170
171
172
173
174
175
176 public boolean visit(LifecycleElement element) {
177 if (visitedIds.contains(element.getId())) {
178 return true;
179 }
180
181 synchronized (visitedIds) {
182 return !visitedIds.add(element.getId());
183 }
184 }
185
186
187
188
189 @Override
190 protected void initializeSkipLifecyclePendingTasks(Queue<ViewLifecycleTask<?>> tasks) {
191 super.initializeSkipLifecyclePendingTasks(tasks);
192
193 if ((getParent() != null) && StringUtils.isNotBlank(getParent().getContainerIdSuffix())) {
194 tasks.add(LifecycleTaskFactory.getTask(SuffixIdFromContainerTask.class, this));
195 }
196 }
197
198
199
200
201
202
203
204
205
206
207
208
209
210 @Override
211 protected void initializePendingTasks(Queue<ViewLifecycleTask<?>> tasks) {
212 if ((getParent() != null) && StringUtils.isNotBlank(getParent().getContainerIdSuffix())) {
213 tasks.add(LifecycleTaskFactory.getTask(SuffixIdFromContainerTask.class, this));
214 }
215
216 tasks.add(LifecycleTaskFactory.getTask(PopulateComponentContextTask.class, this));
217 tasks.add(LifecycleTaskFactory.getTask(EvaluateExpressionsTask.class, this));
218 tasks.add(LifecycleTaskFactory.getTask(SyncClientSideStateTask.class, this));
219 tasks.add(LifecycleTaskFactory.getTask(ApplyAuthAndPresentationLogicTask.class, this));
220
221 if (ViewLifecycle.isRefreshComponent(getViewPhase(), getViewPath())) {
222 tasks.add(LifecycleTaskFactory.getTask(RefreshStateModifyTask.class, this));
223 }
224
225 tasks.add(LifecycleTaskFactory.getTask(ComponentDefaultApplyModelTask.class, this));
226 getElement().initializePendingTasks(this, tasks);
227 tasks.offer(LifecycleTaskFactory.getTask(RunComponentModifiersTask.class, this));
228 tasks.add(LifecycleTaskFactory.getTask(HelperCustomApplyModelTask.class, this));
229 tasks.add(LifecycleTaskFactory.getTask(SetReadOnlyOnDataBindingTask.class, this));
230 }
231
232
233
234
235
236
237 @Override
238 protected ViewLifecyclePhase initializeSuccessor(LifecycleElement nestedElement, String nestedPath,
239 Component parent) {
240 ApplyModelComponentPhase applyModelPhase = LifecyclePhaseFactory.applyModel(nestedElement, getModel(),
241 nestedPath, getRefreshPaths(), parent, null, visitedIds);
242
243 if (nestedElement.isInitialized()) {
244 return applyModelPhase;
245 }
246
247 return LifecyclePhaseFactory.initialize(nestedElement, getModel(), nestedPath, getRefreshPaths(), parent,
248 applyModelPhase);
249 }
250
251 }