Clover Coverage Report - Kuali Student 1.2-M4-SNAPSHOT (Aggregated)
Coverage timestamp: Wed Jul 20 2011 11:14:35 EDT
../../../../../../../../img/srcFileCovDistChart0.png 41% of files have more coverage
107   309   38   3.96
18   247   0.36   27
27     1.41  
1    
 
  VariationEditController       Line # 43 107 0% 38 152 0% 0.0
 
No Tests
 
1    package org.kuali.student.lum.program.client.variation.edit;
2   
3    import java.util.ArrayList;
4    import java.util.List;
5   
6    import org.kuali.student.common.assembly.data.Data;
7    import org.kuali.student.common.ui.client.application.Application;
8    import org.kuali.student.common.ui.client.application.ViewContext;
9    import org.kuali.student.common.ui.client.mvc.Callback;
10    import org.kuali.student.common.ui.client.mvc.DataModel;
11    import org.kuali.student.common.ui.client.mvc.HasCrossConstraints;
12    import org.kuali.student.common.ui.client.mvc.ModelRequestCallback;
13    import org.kuali.student.common.ui.client.mvc.history.HistoryManager;
14    import org.kuali.student.common.ui.client.widgets.KSButton;
15    import org.kuali.student.common.ui.client.widgets.KSButtonAbstract;
16    import org.kuali.student.common.ui.client.widgets.notification.KSNotification;
17    import org.kuali.student.common.ui.client.widgets.notification.KSNotifier;
18    import org.kuali.student.common.validation.dto.ValidationResultInfo;
19    import org.kuali.student.lum.common.client.widgets.AppLocations;
20    import org.kuali.student.lum.program.client.ProgramConstants;
21    import org.kuali.student.lum.program.client.ProgramRegistry;
22    import org.kuali.student.lum.program.client.ProgramSections;
23    import org.kuali.student.lum.program.client.events.ChangeViewEvent;
24    import org.kuali.student.lum.program.client.events.ModelLoadedEvent;
25    import org.kuali.student.lum.program.client.events.SpecializationCreatedEvent;
26    import org.kuali.student.lum.program.client.events.SpecializationSaveEvent;
27    import org.kuali.student.lum.program.client.events.SpecializationUpdateEvent;
28    import org.kuali.student.lum.program.client.events.StoreSpecRequirementIDsEvent;
29    import org.kuali.student.lum.program.client.major.edit.MajorEditController;
30    import org.kuali.student.lum.program.client.properties.ProgramProperties;
31    import org.kuali.student.lum.program.client.variation.VariationController;
32    import org.kuali.student.lum.program.client.widgets.ProgramSideBar;
33   
34    import com.google.gwt.core.client.GWT;
35    import com.google.gwt.event.dom.client.ClickEvent;
36    import com.google.gwt.event.dom.client.ClickHandler;
37    import com.google.gwt.event.shared.HandlerManager;
38    import com.google.gwt.user.client.Window;
39   
40    /**
41    * @author Igor
42    */
 
43    public class VariationEditController extends VariationController {
44   
45    private final KSButton saveButton = new KSButton(ProgramProperties.get().common_save());
46    private final KSButton cancelButton = new KSButton(ProgramProperties.get().common_cancel(), KSButtonAbstract.ButtonStyle.ANCHOR_LARGE_CENTERED);
47   
48    private String currentId;
49   
 
50  0 toggle public VariationEditController(DataModel programModel, ViewContext viewContext, HandlerManager eventBus, MajorEditController majorController) {
51  0 super(programModel, viewContext, eventBus, majorController);
52  0 configurer = GWT.create(VariationEditConfigurer.class);
53  0 sideBar.setState(ProgramSideBar.State.EDIT);
54  0 if (getStringProperty(ProgramConstants.ID) != null) {
55  0 setDefaultView(ProgramSections.SUMMARY);
56    }
57  0 initHandlers();
58    }
59   
 
60  0 toggle private void initHandlers() {
61  0 saveButton.addClickHandler(new ClickHandler() {
62   
 
63  0 toggle @Override
64    public void onClick(ClickEvent event) {
65  0 doSave();
66    }
67    });
68  0 cancelButton.addClickHandler(new ClickHandler() {
69   
 
70  0 toggle @Override
71    public void onClick(ClickEvent event) {
72  0 doCancel();
73    }
74    });
75  0 ModelLoadedEvent.Handler modelLoadedHandler = new ModelLoadedEvent.Handler() {
 
76  0 toggle @Override
77    public void onEvent(ModelLoadedEvent event) {
78  0 DataModel dataModel = event.getModel();
79  0 Data variationMap = dataModel.get(ProgramConstants.VARIATIONS);
80  0 if (variationMap != null) {
81  0 int row = 0;
82  0 for (Data.Property property : variationMap) {
83  0 final Data variationData = property.getValue();
84  0 if (variationData.get(ProgramConstants.ID).equals(currentId)) {
85  0 programModel.setRoot(variationData);
86  0 ProgramRegistry.setData(variationData);
87  0 ProgramRegistry.setRow(row);
88  0 setContentTitle(getProgramName());
89  0 row++;
90  0 return;
91    }
92    }
93    }
94    }
95    };
96  0 ProgramRegistry.addHandler(ModelLoadedEvent.TYPE, modelLoadedHandler);
97  0 eventBus.addHandler(ModelLoadedEvent.TYPE, modelLoadedHandler);
98   
99  0 ChangeViewEvent.Handler changeViewHandler = new ChangeViewEvent.Handler() {
 
100  0 toggle @Override
101    public void onEvent(ChangeViewEvent event) {
102  0 Enum<?> viewToken = event.getViewToken();
103  0 if (!viewToken.name().equals(ProgramSections.SPECIALIZATIONS_EDIT.name())) {
104  0 showView(viewToken);
105    }
106    }
107    };
108  0 ProgramRegistry.addHandler(ChangeViewEvent.TYPE, changeViewHandler);
109  0 eventBus.addHandler(ChangeViewEvent.TYPE, changeViewHandler);
110  0 eventBus.addHandler(SpecializationCreatedEvent.TYPE, new SpecializationCreatedEvent.Handler() {
111   
 
112  0 toggle @Override
113    public void onEvent(SpecializationCreatedEvent event) {
114  0 programModel.getRoot().set(ProgramConstants.ID, event.getSpecializationId());
115  0 showWarnings();
116    }
117    });
118   
119  0 eventBus.addHandler(SpecializationUpdateEvent.TYPE, new SpecializationUpdateEvent.Handler() {
 
120  0 toggle @Override
121    public void onEvent(SpecializationUpdateEvent event) {
122    // update our model to the updated specialization
123   
124    // gotta find it first
125  0 String currSpecializationId = programModel.getRoot().get(ProgramConstants.ID);
126  0 for (Data.Property prop : event.getSpecializations()) {
127  0 String specId = (String) ((Data) prop.getValue()).get(ProgramConstants.ID);
128   
129  0 if (null != specId && specId.equals(currSpecializationId) && prop.getValueType().equals(Data.class)) {
130    // found it
131  0 programModel.setRoot((Data) prop.getValue());
132  0 showView(getCurrentViewEnum());
133    }
134    }
135   
136    //update with any new warnings that exist on specialization
137  0 showWarnings();
138    }
139    });
140   
141  0 StoreSpecRequirementIDsEvent.Handler requirementsHandler = new StoreSpecRequirementIDsEvent.Handler() {
 
142  0 toggle @Override
143    public void onEvent(StoreSpecRequirementIDsEvent event) {
144  0 final String programId = event.getProgramId();
145  0 final List<String> ids = event.getProgramRequirementIds();
146   
147  0 requestModel(new ModelRequestCallback<DataModel>() {
 
148  0 toggle @Override
149    public void onModelReady(final DataModel model) {
150  0 Data programRequirements = null;
151   
152    // find the specialization that we need to update
153    //for (Data.Property property : model.getRoot()) {
154  0 Data variationData = model.getRoot();
155  0 if (variationData.get(ProgramConstants.ID).equals(programId)) {
156  0 variationData.set(ProgramConstants.PROGRAM_REQUIREMENTS, new Data());
157  0 programRequirements = variationData.get(ProgramConstants.PROGRAM_REQUIREMENTS);
158    // break;
159    }
160    // }
161   
162  0 if (programRequirements == null) {
163  0 Window.alert("Cannot find program requirements in data model.");
164  0 GWT.log("Cannot find program requirements in data model", null);
165  0 return;
166    }
167   
168  0 for (String id : ids) {
169  0 programRequirements.add(id);
170    }
171  0 doSave();
172    }
173   
 
174  0 toggle @Override
175    public void onRequestFail(Throwable cause) {
176  0 GWT.log("Unable to retrieve model for validation and save", cause);
177    }
178   
179    });
180    }
181    };
182  0 ProgramRegistry.addHandler(StoreSpecRequirementIDsEvent.TYPE, requirementsHandler);
183  0 eventBus.addHandler(StoreSpecRequirementIDsEvent.TYPE, requirementsHandler);
184    }
185   
 
186  0 toggle @Override
187    protected void fireUpdateEvent(Callback<Boolean> okToChange) {
188  0 doSave(okToChange);
189    }
190   
 
191  0 toggle private void doSave(final Callback<Boolean> okToChange) {
192  0 requestModel(new ModelRequestCallback<DataModel>() {
 
193  0 toggle @Override
194    public void onModelReady(final DataModel model) {
195  0 VariationEditController.this.updateModelFromCurrentView();
196  0 model.setParentPath(ProgramConstants.VARIATIONS + "/" + ProgramRegistry.getRow());
197  0 model.validate(new Callback<List<ValidationResultInfo>>() {
 
198  0 toggle @Override
199    public void exec(List<ValidationResultInfo> results) {
200  0 boolean isSectionValid = isValid(results, true);
201  0 if (isSectionValid) {
202  0 saveData(model);
203  0 okToChange.exec(true);
204    } else {
205  0 okToChange.exec(false);
206  0 KSNotifier.add(new KSNotification("Unable to save, please check fields for errors.", false, true, 5000));
207    }
208    }
209    });
210    }
211   
 
212  0 toggle @Override
213    public void onRequestFail(Throwable cause) {
214  0 GWT.log("Unable to retrieve model for validation and save", cause);
215    }
216   
217    });
218    }
219   
 
220  0 toggle @Override
221    protected void configureView() {
222  0 super.configureView();
223  0 if (!initialized) {
224  0 List<Enum<?>> excludedViews = new ArrayList<Enum<?>>();
225  0 excludedViews.add(ProgramSections.PROGRAM_REQUIREMENTS_EDIT);
226  0 excludedViews.add(ProgramSections.SUPPORTING_DOCUMENTS_EDIT);
227  0 excludedViews.add(ProgramSections.SUMMARY);
228  0 addCommonButton(ProgramProperties.get().program_menu_sections(), saveButton, excludedViews);
229  0 addCommonButton(ProgramProperties.get().program_menu_sections(), cancelButton, excludedViews);
230  0 initialized = true;
231    }
232   
233    }
234   
 
235  0 toggle @Override
236    protected void resetModel() {
237  0 currentId = getStringProperty(ProgramConstants.ID);
238  0 programModel.resetRoot();
239    }
240   
 
241  0 toggle private void doCancel() {
242  0 navigateToParent(ProgramSections.SUMMARY);
243    }
244   
 
245  0 toggle @Override
246    protected void doSave() {
247  0 doSave(NO_OP_CALLBACK);
248    }
249   
 
250  0 toggle private void saveData(DataModel model) {
251  0 currentId = model.get(ProgramConstants.ID);
252  0 eventBus.fireEvent(new SpecializationSaveEvent(model.getRoot()));
253  0 setContentTitle(getProgramName());
254  0 setName(getProgramName());
255  0 resetFieldInteractionFlag();
256    }
257   
 
258  0 toggle @Override
259    protected void navigateToParent() {
260  0 navigateToParent(ProgramSections.SPECIALIZATIONS_EDIT);
261    }
262   
 
263  0 toggle private void navigateToParent(ProgramSections parentSection) {
264   
265  0 String path = HistoryManager.appendContext(AppLocations.Locations.EDIT_PROGRAM_SPEC.getLocation(), getViewContext()) + "/" + parentSection;
266  0 HistoryManager.navigate(path);
267    }
268   
269   
 
270  0 toggle @Override
271    public void beforeShow(final Callback<Boolean> onReadyCallback) {
272    //clear all cross constraints that start with variations
273  0 Application.getApplicationContext().clearCrossConstraintsWithStartingPath(null,ProgramConstants.VARIATIONS);
274   
275    //Set the context parent path so the proper mapping is retained
276  0 String newParentPath = ProgramConstants.VARIATIONS+"/"+org.kuali.student.lum.program.client.ProgramRegistry.getRow()+"/";
277  0 Application.getApplicationContext().setParentPath(newParentPath);
278   
279    //This callback restricts values displayed in widget (eg. dropdowns, pickers) based on a cross field selection
280    //and updates the warning messages displayed for the variation. A callback is used since we need the parent
281    //ProgramController to finish configuring the view before proceeding.
282  0 Callback<Boolean> finalizeVariationView = new Callback<Boolean>(){
 
283  0 toggle public void exec(Boolean result) {
284    //Update widgets with constraints
285  0 for(HasCrossConstraints crossConstraint:Application.getApplicationContext().getCrossConstraints(null)){
286  0 crossConstraint.reprocessWithUpdatedConstraints();
287    }
288   
289  0 onReadyCallback.exec(result);
290    }
291    };
292  0 super.beforeShow(finalizeVariationView);
293    }
294   
295    //Before show is called before the model is bound to the widgets. We need to update cross constraints after widget binding
296    //This gets called twice which is not optimal
 
297  0 toggle @Override
298    public <V extends Enum<?>> void showView(V viewType,
299    final Callback<Boolean> onReadyCallback) {
300  0 Callback<Boolean> updateCrossConstraintsCallback = new Callback<Boolean>(){
 
301  0 toggle public void exec(Boolean result) {
302  0 onReadyCallback.exec(result);
303  0 showWarnings();
304    }
305    };
306  0 super.showView(viewType, updateCrossConstraintsCallback);
307    }
308   
309    }