1 /**
2 * Copyright 2005-2013 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.krad.uif.lifecycle;
17
18 import java.util.HashSet;
19 import java.util.Set;
20
21 import org.kuali.rice.krad.uif.component.Component;
22 import org.kuali.rice.krad.uif.util.RecycleUtils;
23
24 /**
25 * Responsible for creating lifecycle phases.
26 *
27 * <p>
28 * This factory recycles completed phases to reduce object creation during the lifecycle.
29 * </p>
30 *
31 * @author Kuali Rice Team (rice.collab@kuali.org)
32 */
33 public final class LifecyclePhaseFactory {
34
35 /**
36 * Creates a new lifecycle phase processing task for performing initialization on a component.
37 *
38 * @param component The component.
39 * @param model The model
40 * @return lifecycle processing task for processing the initialize phase on the component
41 */
42 public static InitializeComponentPhase initialize(Component component, Object model) {
43 return initialize(component, model, 0, null, null);
44 }
45
46 /**
47 * Creates a new lifecycle phase processing task for performing initialization on a component.
48 *
49 * @param component The component.
50 * @param model The model
51 * @param parent The parent component.
52 * @param index The index of the phase within the nested component list.
53 * @param nextPhase The applyModel phase to spawn after the successful completion of the
54 * initialize phase.
55 * @return lifecycle processing task for processing the initialize phase on the component
56 */
57 public static InitializeComponentPhase initialize(Component component, Object model,
58 int index, Component parent, ApplyModelComponentPhase nextPhase) {
59 InitializeComponentPhase initializePhase = RecycleUtils.getInstance(InitializeComponentPhase.class);
60 initializePhase.prepare(component, model, index, parent, nextPhase);
61 return initializePhase;
62 }
63
64 /**
65 * Creates a new lifecycle phase processing task for applying the model to a component.
66 *
67 * @param component The component.
68 * @param model The model
69 * @return lifecycle processing task for processing the apply model phase on the component
70 */
71 public static ApplyModelComponentPhase applyModel(Component component, Object model) {
72 return applyModel(component, model, 0, null, null, new HashSet<String>());
73 }
74
75 /**
76 * Creates a new lifecycle phase processing task for applying the model to a component.
77 *
78 * @param component The component.
79 * @param model The model
80 * @param parent The component.
81 * @return lifecycle processing task for processing the apply model phase on the component
82 */
83 public static ApplyModelComponentPhase applyModel(Component component, Object model, Component parent) {
84 return applyModel(component, model, 0, parent, null, new HashSet<String>());
85 }
86
87 /**
88 * Creates a new lifecycle phase processing task for applying the model to a component.
89 *
90 * @param component The component.
91 * @param model The model
92 * @param parent The parent component.
93 * @param index The index of the phase within the nested component list.
94 * @param nextPhase The applyModel phase to spawn after the successful completion of the
95 * initialize phase.
96 * @param visitedIds The set of visited IDs to track while applying model.
97 * @return lifecycle processing task for processing the apply model phase on the component
98 */
99 public static ApplyModelComponentPhase applyModel(Component component, Object model,
100 int index, Component parent, FinalizeComponentPhase nextPhase, Set<String> visitedIds) {
101 ApplyModelComponentPhase applyModelPhase = RecycleUtils.getInstance(ApplyModelComponentPhase.class);
102 applyModelPhase.prepare(component, model, index, parent, nextPhase, visitedIds);
103 return applyModelPhase;
104 }
105
106 /**
107 * Creates a new lifecycle phase processing task for finalizing a nested component.
108 *
109 * @param component The component.
110 * @param model The model
111 * @return lifecycle processing task for processing the finalize phase on the component
112 */
113 public static FinalizeComponentPhase finalize(Component component, Object model) {
114 return finalize(component, model, 0, null);
115 }
116
117 /**
118 * Creates a new lifecycle phase processing task for finalizing a nested component.
119 *
120 * @param component The component.
121 * @param model The model
122 * @param parent The parent component.
123 * @return lifecycle processing task for processing the finalize phase on the component
124 */
125 public static FinalizeComponentPhase finalize(Component component, Object model, Component parent) {
126 return finalize(component, model, 0, parent);
127 }
128
129 /**
130 * Creates a new lifecycle phase processing task for finalizing a nested component.
131 *
132 * @param component The component.
133 * @param model The model
134 * @param parent The parent component.
135 * @param index The index of the phase within the nested component list.
136 * @return lifecycle processing task for processing the finalize phase on the component
137 */
138 public static FinalizeComponentPhase finalize(Component component, Object model,
139 int index, Component parent) {
140 FinalizeComponentPhase finalizePhase = RecycleUtils.getInstance(FinalizeComponentPhase.class);
141 finalizePhase.prepare(component, model, index, parent);
142 return finalizePhase;
143 }
144
145 /**
146 * Creates a new lifecycle phase processing task for rendering a component.
147 *
148 * @param component The component to render.
149 * @param model The model associated with the component.
150 * @param index The position of the associated finalize phase's within its predecessor's
151 * successor queue.
152 * @return lifecycle processing task for processing the render phase on the component
153 */
154 public static RenderComponentPhase render(Component component, Object model, int index) {
155 RenderComponentPhase renderPhase = RecycleUtils.getInstance(RenderComponentPhase.class);
156 renderPhase.prepare(component, model, index, null, 0);
157 return renderPhase;
158 }
159
160 /**
161 * Creates a new lifecycle phase processing task for rendering a component.
162 *
163 * @param finalizePhase The finalize component phase associated with this rendering phase.
164 * @param parent The rendering phase for the parent of the component associated with this phase.
165 * @param pendingChildren The number of child phases to expect to be queued with this phase as
166 * their rendering parent.
167 * @return lifecycle processing task for processing the render phase on the component
168 */
169 public static RenderComponentPhase render(
170 FinalizeComponentPhase finalizePhase, RenderComponentPhase parent, int pendingChildren) {
171 RenderComponentPhase renderPhase = RecycleUtils.getInstance(RenderComponentPhase.class);
172 renderPhase.prepare(finalizePhase.getComponent(), finalizePhase.getModel(),
173 finalizePhase.getIndex(), parent, pendingChildren);
174 return renderPhase;
175 }
176
177 /**
178 * Recycles a task instance after processing.
179 *
180 * @param phase The task to recycle.
181 */
182 static void recycle(ViewLifecyclePhaseBase phase) {
183 phase.recycle();
184 RecycleUtils.recycle(phase);
185 }
186
187 }