View Javadoc

1   /**
2    * Copyright 2013 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
14   *
15   */
16  package org.kuali.student.enrollment.class2.courseoffering.controller;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.kuali.rice.kim.api.identity.Person;
20  import org.kuali.rice.krad.util.GlobalVariables;
21  import org.kuali.rice.krad.util.KRADConstants;
22  import org.kuali.rice.krad.web.form.DocumentFormBase;
23  import org.kuali.rice.krad.web.form.MaintenanceDocumentForm;
24  import org.kuali.rice.krad.web.form.UifFormBase;
25  import org.kuali.student.common.uif.util.KSControllerHelper;
26  import org.kuali.student.enrollment.class2.courseoffering.dto.CourseOfferingCreateWrapper;
27  import org.kuali.student.enrollment.class2.courseoffering.dto.CourseOfferingEditWrapper;
28  import org.kuali.student.enrollment.class2.courseoffering.dto.JointCourseWrapper;
29  import org.kuali.student.enrollment.class2.courseoffering.service.impl.CourseOfferingCreateMaintainableImpl;
30  import org.kuali.student.enrollment.class2.courseoffering.util.CourseOfferingConstants;
31  import org.kuali.student.enrollment.class2.courseoffering.util.CourseOfferingManagementUtil;
32  import org.kuali.student.enrollment.class2.courseoffering.util.ManageSocConstants;
33  import org.kuali.student.enrollment.common.util.EnrollConstants;
34  import org.kuali.student.enrollment.courseoffering.dto.CourseOfferingInfo;
35  import org.kuali.student.enrollment.courseofferingset.dto.SocInfo;
36  import org.kuali.student.enrollment.courseofferingset.dto.SocRolloverResultItemInfo;
37  import org.kuali.student.r2.common.dto.ContextInfo;
38  import org.kuali.student.r2.common.exceptions.DoesNotExistException;
39  import org.kuali.student.r2.common.util.ContextUtils;
40  import org.kuali.student.r2.common.util.constants.CourseOfferingSetServiceConstants;
41  import org.kuali.student.r2.common.util.constants.LuServiceConstants;
42  import org.kuali.student.r2.core.acal.dto.TermInfo;
43  import org.kuali.student.r2.lum.course.dto.CourseInfo;
44  import org.springframework.stereotype.Controller;
45  import org.springframework.validation.BindingResult;
46  import org.springframework.web.bind.annotation.ModelAttribute;
47  import org.springframework.web.bind.annotation.RequestMapping;
48  import org.springframework.web.servlet.ModelAndView;
49  
50  import javax.servlet.http.HttpServletRequest;
51  import javax.servlet.http.HttpServletResponse;
52  import java.util.Collections;
53  import java.util.Comparator;
54  import java.util.List;
55  import java.util.Properties;
56  
57  
58  /**
59   * This is the controller class what handles all the requests (actions) from the <i>'create course offering'</i> ui.
60   * <p>
61   *      Wireframes at <a href="http://ux.ks.kuali.org.s3.amazonaws.com/wireframes/ENR/Course_Offering/v17/start.html">
62   *          http://ux.ks.kuali.org.s3.amazonaws.com/wireframes/ENR/Course_Offering/v17/start.html</a> and
63   *
64   *       <a href="http://ux.ks.kuali.org.s3.amazonaws.com/wireframes/ENR/Complex%20Course%20Offerings/Sandbox/start.html">
65   *           http://ux.ks.kuali.org.s3.amazonaws.com/wireframes/ENR/Complex%20Course%20Offerings/Sandbox/start.html</a>
66   * </p>
67   *
68   * @see CourseOfferingCreateWrapper
69   * @see JointCourseWrapper
70   * @see org.kuali.student.enrollment.class2.courseoffering.dto.FormatOfferingWrapper
71   * @see CourseOfferingCreateMaintainableImpl
72   */
73  @Controller
74  @RequestMapping(value = "/courseOfferingCreate")
75  public class CourseOfferingCreateController extends CourseOfferingBaseController {
76  
77  
78      /**
79       * Initial method called when requesting a new view instance.
80       *
81       */
82      @Override
83      public ModelAndView start(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
84                                HttpServletRequest request, HttpServletResponse response) {
85          MaintenanceDocumentForm maintenanceForm = (MaintenanceDocumentForm) form;
86          setupMaintenance(maintenanceForm, request, KRADConstants.MAINTENANCE_NEW_ACTION);
87  
88          if (form.getView() != null) {
89              String methodToCall = request.getParameter(KRADConstants.DISPATCH_REQUEST_PARAMETER);
90  
91              // check if creating CO and populate the form
92              String createCO = request.getParameter(CourseOfferingConstants.CREATE_COURSEOFFERING);
93              if (createCO != null && createCO.equals("true")) {
94                  CourseOfferingControllerPopulateUIForm.populateCreateCourseOfferingForm(maintenanceForm, request);
95              }
96              // done with creating CO
97  
98              String pageId = request.getParameter("pageId");
99              if (pageId != null && pageId.equals("courseOfferingCopyPage")){
100                 Object selectedObject =  maintenanceForm.getDocument().getNewMaintainableObject().getDataObject();
101                 if (selectedObject instanceof CourseOfferingCreateWrapper)  {
102                     CourseOfferingCreateWrapper coCreateWrapper = (CourseOfferingCreateWrapper)selectedObject;
103                     String targetTermCode = request.getParameter("targetTermCode");
104                     String catalogCourseCode = request.getParameter("catalogCourseCode");
105                     String coId = request.getParameter("courseOfferingId");
106 
107                     CourseOfferingControllerPopulateUIForm.copyCourseOfferingInfo(coCreateWrapper, targetTermCode, catalogCourseCode, coId);
108                 }
109             }
110             checkViewAuthorization(form, methodToCall);
111         }
112 
113         return getUIFModelAndView(maintenanceForm);
114     }
115 
116     @Override
117     @RequestMapping(params = "methodToCall=route")
118     public ModelAndView route(@ModelAttribute("KualiForm") DocumentFormBase form, BindingResult result,
119                               HttpServletRequest request, HttpServletResponse response) {
120 
121         super.route(form, result, request, response);
122 
123         if( GlobalVariables.getMessageMap().hasErrors() ) {
124             return handleRouteForErrors( form );
125         }
126 
127         return handleRouteForCoCreate( form );
128     }
129 
130     /* Returns a ModelAndView for the route()-method to return a new view if we are creating a CO */
131     private ModelAndView handleRouteForCoCreate( DocumentFormBase form ) {
132 
133         Properties urlParameters = new Properties();
134 
135         CourseOfferingEditWrapper dataObject = (CourseOfferingEditWrapper)((MaintenanceDocumentForm)form).getDocument().getNewMaintainableObject().getDataObject();
136 
137         //display the correct growl message based on the availability of exam period and final exam type
138         if (StringUtils.equals(dataObject.getFinalExamDriver(), LuServiceConstants.LU_EXAM_DRIVER_CO_KEY)) {
139             if (StringUtils.isEmpty(dataObject.getExamPeriodId())) {
140                 urlParameters.put(EnrollConstants.GROWL_MESSAGE, CourseOfferingConstants.COURSE_OFFERING_CREATE_SUCCESS_WITH_MISSING_EXAMPERIOD);
141             } else if (!StringUtils.equals(dataObject.getCourseOfferingInfo().getFinalExamType(), CourseOfferingConstants.COURSEOFFERING_FINAL_EXAM_TYPE_STANDARD)) {
142                 urlParameters.put(EnrollConstants.GROWL_MESSAGE, CourseOfferingConstants.COURSE_OFFERING_CREATE_SUCCESS);
143             } else {
144                 urlParameters.put(EnrollConstants.GROWL_MESSAGE, CourseOfferingConstants.COURSE_OFFERING_CREATE_SUCCESS_WITH_EXAMOFFERING_GENERATED);
145             }
146         } else {
147             urlParameters.put(EnrollConstants.GROWL_MESSAGE, CourseOfferingConstants.COURSE_OFFERING_CREATE_SUCCESS);
148         }
149 
150         urlParameters.put(EnrollConstants.GROWL_MESSAGE_PARAMS, dataObject.getCourseOfferingCode() + dataObject.getCourseOfferingInfo().getCourseNumberSuffix());
151 
152         urlParameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, "show");
153         urlParameters.put("termCode", dataObject.getTerm().getCode());
154         if (dataObject.getCourseOfferingInfo().getCourseNumberSuffix() != null && !StringUtils.isBlank(dataObject.getCourseOfferingInfo().getCourseNumberSuffix())) {
155             urlParameters.put("inputCode", dataObject.getCourseOfferingInfo().getCourseOfferingCode().concat(dataObject.getCourseOfferingInfo().getCourseNumberSuffix()));
156         } else {
157             urlParameters.put("inputCode", dataObject.getCourseOfferingInfo().getCourseOfferingCode());
158         }
159         urlParameters.put("viewId", CourseOfferingConstants.MANAGE_CO_VIEW_ID);
160         urlParameters.put("pageId", CourseOfferingConstants.MANAGE_THE_CO_PAGE);
161         urlParameters.put("withinPortal", "false");
162 
163         return super.performRedirect(form, CourseOfferingConstants.MANAGE_CO_CONTROLLER_PATH, urlParameters);
164     }
165 
166     /**
167      * This is mapped to the link to to toggle between creating a new format offering or
168      * copy from existing joint format offerings.
169      *
170      */
171     @RequestMapping(params = "methodToCall=showCreateFormatSection")
172     public ModelAndView showCreateFormatSection(@ModelAttribute("KualiForm") MaintenanceDocumentForm form) throws Exception {
173 
174         CourseOfferingCreateWrapper wrapper = (CourseOfferingCreateWrapper) form.getDocument().getNewMaintainableObject().getDataObject();
175         wrapper.setShowCreateFormatSection(true);
176         wrapper.setShowCopyFormatSection(false);
177 
178         return getUIFModelAndView(form);
179     }
180 
181     /**
182      * This is mapped to the link to to toggle between creating a new format offering or
183      * copy from existing joint format offerings.
184      *
185      */
186     @RequestMapping(params = "methodToCall=showCopyFromJointOffering")
187     public ModelAndView showCopyFromJointOffering(@ModelAttribute("KualiForm") MaintenanceDocumentForm form) throws Exception {
188 
189         CourseOfferingCreateWrapper wrapper = (CourseOfferingCreateWrapper) form.getDocument().getNewMaintainableObject().getDataObject();
190         wrapper.setShowCreateFormatSection(false);
191         wrapper.setShowCopyFormatSection(true);
192 
193         return getUIFModelAndView(form);
194     }
195 
196     /**
197      * This will be called whenever the user selects/deselects a joint course. If user deselects a joint course, make sure
198      * it doesnt have associated formats. If exists, display a confirmation dialog with all the available formats.
199      *
200      * XML reference at CourseOfferingCreateMaintenanceView.xml
201      *
202      */
203     @RequestMapping(params = "methodToCall=markCourseForJointOffering")
204     public ModelAndView markCourseForJointOffering(@ModelAttribute("KualiForm") MaintenanceDocumentForm form, @SuppressWarnings("unused") BindingResult result,
205                 HttpServletRequest request, HttpServletResponse response) throws Exception {
206 
207         CourseOfferingCreateWrapper wrapper = (CourseOfferingCreateWrapper) form.getDocument().getNewMaintainableObject().getDataObject();
208         int index = wrapper.getSelectedJointCourseIndex();
209         if(form.getActionParameters().size() > 1)   {
210             String lineIndex = form.getActionParameters().get("selectedLineIndex");
211             index = Integer.parseInt(lineIndex);
212             wrapper.setSelectedJointCourseIndex(index);
213         }
214         JointCourseWrapper joint = wrapper.getJointCourses().get(index);
215 
216         if (joint.isSelectedToJointlyOfferred()){
217             String dialogName = CourseOfferingConstants.JOINT_COURSE_FORMATS_DELETE_DIALOG;
218             
219             if (!hasDialogBeenAnswered(dialogName, form)) {
220                 wrapper.setSelectedJointCourseCode(joint.getCourseCode());
221                 wrapper.setDialogFormatOfferingWrapperList(joint.getFormatOfferingWrappers());
222                 return showDialog(dialogName, form, request, response);
223             }
224 
225             boolean dialogAnswer = getBooleanDialogResponse(dialogName, form, request, response);
226             form.getDialogManager().resetDialogStatus(dialogName);
227 
228             if (dialogAnswer) {
229                 joint.setSelectedToJointlyOfferred(false);
230                 String jointCodes = StringUtils.remove(wrapper.getJointCourseCodes(), ", " + joint.getCourseCode());
231                 wrapper.setJointCourseCodes(jointCodes);
232                 wrapper.getFormatOfferingWrappers().removeAll(joint.getFormatOfferingWrappers());
233             }
234 
235         } else {
236             wrapper.setJointCourseCodes(wrapper.getJointCourseCodes() + ", " + joint.getCourseCode());
237             joint.setSelectedToJointlyOfferred(true);
238         }
239 
240         return getUIFModelAndView(form);
241     }
242 
243     /**
244      * Mapped to the <i>'Add'</i> button at the format section. This either copies from the user selected joint
245      * offerings or create a new format.
246      *
247      */
248     @RequestMapping(params = "methodToCall=addFormat")
249         public ModelAndView addFormat(@ModelAttribute("KualiForm") MaintenanceDocumentForm form) throws Exception {
250 
251         CourseOfferingCreateWrapper wrapper = (CourseOfferingCreateWrapper)form.getDocument().getNewMaintainableObject().getDataObject();
252         CourseOfferingCreateMaintainableImpl maintainable = (CourseOfferingCreateMaintainableImpl)KSControllerHelper.getViewHelperService(form);
253 
254         //If the user creates a new format
255         if (wrapper.isShowCreateFormatSection()){
256             maintainable.addFormatOffering(wrapper);
257         } else { //If the user copies from existing joint formats
258             maintainable.copyJointFormatOfferings(wrapper);
259         }
260 
261         return getUIFModelAndView(form);
262     }
263 
264     @RequestMapping(params = "methodToCall=continueFromCreate")
265     public ModelAndView continueFromCreate(@ModelAttribute("KualiForm") MaintenanceDocumentForm form, @SuppressWarnings("unused") BindingResult result,
266                               @SuppressWarnings("unused") HttpServletRequest request, @SuppressWarnings("unused") HttpServletResponse response) throws Exception {
267 
268         CourseOfferingCreateWrapper coWrapper = ((CourseOfferingCreateWrapper) form.getDocument().getNewMaintainableObject().getDataObject());
269         String courseCode = coWrapper.getCatalogCourseCode();
270         String termCode = coWrapper.getTargetTermCode();
271 
272         // check if term or course is empty
273         if( StringUtils.isBlank(termCode) ) {
274 //            KULRICE-10323
275 //            GlobalVariables.getMessageMap().putError("document.newMaintainableObject.dataObject.targetTermCode", CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_PARAMETER_IS_REQUIRED, "Term");
276             GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_PARAMETER_IS_REQUIRED, "Term");
277         }
278         if( StringUtils.isBlank(courseCode) ) {
279 //            KULRICE-10323
280 //            GlobalVariables.getMessageMap().putError("document.newMaintainableObject.dataObject.catalogCourseCode", CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_PARAMETER_IS_REQUIRED, "Course Code");
281             GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_PARAMETER_IS_REQUIRED, "Course Code");
282         }
283         if (GlobalVariables.getMessageMap().getErrorCount() > 0) {
284             return getUIFModelAndView(form);
285         }
286 
287         TermInfo term = CourseOfferingManagementUtil.getTerm(termCode);
288         if (term == null) {
289             GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_TERM_INVALID, termCode);
290             return getUIFModelAndView(form);
291         }
292 
293         coWrapper.setTerm(term);
294 
295         List<CourseInfo> matchingCourses = CourseOfferingManagementUtil.retrieveMatchingCourses(courseCode, term);
296         coWrapper.clear();
297         int firstMatchingCourse = 0;
298         if (matchingCourses.size() == 1) {
299             CourseInfo course = matchingCourses.get(firstMatchingCourse);
300 
301             // set organization IDs and check if the user is authorized to create a course
302             List<String> orgIds = course.getUnitsContentOwner();
303             if(orgIds != null && !orgIds.isEmpty()){
304                 StringBuilder orgIDs = new StringBuilder();
305                 for (String orgId : orgIds) {
306                     orgIDs.append(orgId + ",");
307                 }
308                 if (orgIDs.length() > 0) {
309                     coWrapper.setAdminOrg(orgIDs.substring(0, orgIDs.length()-1));
310                 }
311             }
312             Person user = GlobalVariables.getUserSession().getPerson();
313             boolean canOpenView = form.getView().getAuthorizer().canOpenView(form.getView(), form, user);
314 
315             if (!canOpenView) {    // checking authz for course
316 //                KULRICE-10323
317 //                GlobalVariables.getMessageMap().putError("document.newMaintainableObject.dataObject.catalogCourseCode", CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_COURSE_RESTRICTED, courseCode);
318                 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_COURSE_RESTRICTED, courseCode);
319                 coWrapper.setAdminOrg(null);
320                 coWrapper.setCourse(null);
321 
322                 return getUIFModelAndView(form);
323             } else {
324                 // check if SOC state is "published"
325                 ContextInfo contextInfo = ContextUtils.createDefaultContextInfo();
326                 List<String> socIds = CourseOfferingManagementUtil.getCourseOfferingSetService().getSocIdsByTerm(term.getId(), contextInfo);
327                 int firstSocID = 0;
328                 if (socIds != null && !socIds.isEmpty()){
329                     // check if user authz for the soc
330                     SocInfo soc = CourseOfferingManagementUtil.getCourseOfferingSetService().getSoc(socIds.get(firstSocID), contextInfo);
331                     coWrapper.setSocInfo(soc);
332                     boolean canOpenViewSoc = form.getView().getAuthorizer().canOpenView(form.getView(), form, user);
333 
334                     if(!canOpenViewSoc) {   // check if user authz for the soc
335 //                      KULRICE-10323
336 //                        GlobalVariables.getMessageMap().putError("document.newMaintainableObject.dataObject.targetTermCode", CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_TERM_RESTRICTED);
337                         GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_TERM_RESTRICTED);
338                         coWrapper.setSocInfo(null);
339 
340                         return getUIFModelAndView(form);
341                     } else {
342                         if (coWrapper.isCreateFromCatalog()) {
343                             Properties urlParameters = CourseOfferingManagementUtil._buildCOURLParameters(course.getId(), term.getId(), soc.getId(), KRADConstants.Maintenance.METHOD_TO_CALL_NEW);
344                             return super.performRedirect(form, CourseOfferingConstants.CONTROLLER_PATH_COURSEOFFERING_CREATE_MAINTENANCE, urlParameters);
345                         } else {  // Copy part
346                             //Get all the course offerings in a term
347                             CourseOfferingControllerPopulateUIForm.continueFromCreateCopyCourseOfferingInfo(coWrapper, course, term);
348 
349                             //sort existing COs by term code
350                             Collections.sort(coWrapper.getExistingTermOfferings(), new Comparator<CourseOfferingEditWrapper>() {
351                                 @Override
352                                 public int compare(CourseOfferingEditWrapper co1, CourseOfferingEditWrapper co2) {
353                                     return co2.getTerm().getCode().compareTo(co1.getTerm().getCode());
354                                 }
355                             });
356 
357                             CourseOfferingCreateMaintainableImpl maintainable = (CourseOfferingCreateMaintainableImpl)KSControllerHelper.getViewHelperService(form);
358                             maintainable.loadCourseJointInfos(coWrapper, form.getViewId());
359                             //Enable the create button
360                             coWrapper.setEnableCreateButton(true);
361 
362                             return getUIFModelAndView(form, CourseOfferingConstants.COPY_COURSEOFFERING_PAGE);
363                         }
364                     }
365                 } else {
366                     GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, ManageSocConstants.MessageKeys.ERROR_SOC_NOT_EXISTS);
367                     return getUIFModelAndView(form);
368                 }
369             }
370         } else {
371             if (matchingCourses.size() > 1) {
372 //              KULRICE-10323
373 //                GlobalVariables.getMessageMap().putError("document.newMaintainableObject.dataObject.catalogCourseCode", CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_MULTIPLE_COURSE_MATCHES, courseCode);
374                 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_MULTIPLE_COURSE_MATCHES, courseCode);
375             } else if (matchingCourses.isEmpty()) {
376                     GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, CourseOfferingConstants.ERROR_INVALID_CLU_VERSION, courseCode, termCode);
377             }
378 
379             return getUIFModelAndView(form);
380         }
381     }
382 
383     @RequestMapping(params = "methodToCall=createFromCopy")
384     public ModelAndView createFromCopy(@ModelAttribute("KualiForm") MaintenanceDocumentForm form, @SuppressWarnings("unused") BindingResult result,
385          @SuppressWarnings("unused") HttpServletRequest request, @SuppressWarnings("unused") HttpServletResponse response) throws Exception {
386 
387         CourseOfferingCreateWrapper createWrapper = (CourseOfferingCreateWrapper) form.getDocument().getNewMaintainableObject().getDataObject();
388         CourseOfferingInfo existingCO = null;
389         String examPeriodId = null;
390 
391         //the first CO that is selected or if there is only one, grab that one
392         for(CourseOfferingEditWrapper eco : createWrapper.getExistingTermOfferings()){
393             if(eco.getIsChecked() || createWrapper.getExistingTermOfferings().size() == 1){
394                 existingCO = eco.getCourseOfferingInfo();
395                 break;
396             }
397         }
398 
399         if (existingCO == null){
400             GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS,CourseOfferingConstants.COURSEOFFERING_CREATE_ERROR_PARAMETER_IS_REQUIRED, "Selected Course");
401             return getUIFModelAndView(form);
402         }
403 
404         List<String> optionKeys = CourseOfferingControllerPopulateUIForm.getOptionKeys(createWrapper, existingCO);
405         optionKeys.add(CourseOfferingSetServiceConstants.CONTINUE_WITHOUT_EXAM_OFFERINGS_OPTION_KEY);
406         ContextInfo contextInfo = ContextUtils.createDefaultContextInfo();
407         SocRolloverResultItemInfo item = CourseOfferingManagementUtil.getCourseOfferingService().rolloverCourseOffering(existingCO.getId(),
408                 createWrapper.getTerm().getId(),
409                 optionKeys,
410                 contextInfo);
411         CourseOfferingInfo courseOfferingInfo = CourseOfferingManagementUtil.getCourseOfferingService().getCourseOffering(item.getTargetCourseOfferingId(), contextInfo);
412 
413         // retrieve the exam period id
414         try {
415             examPeriodId = CourseOfferingManagementUtil.getExamOfferingServiceFacade().getExamPeriodId(courseOfferingInfo.getTermId(), contextInfo);
416         } catch (DoesNotExistException e) {
417             LOG.warn("The Term " + courseOfferingInfo.getTermId() + " that the course offering " + courseOfferingInfo.getCourseOfferingCode() + " is attached to doesn't have an exam period to create exam offerings.");
418         }
419 
420         Properties urlParameters;
421         urlParameters = new Properties();
422 
423         //display the correct growl message based on the availability of exam period and final exam type
424         if (StringUtils.isEmpty(examPeriodId)) {
425             urlParameters.put(EnrollConstants.GROWL_MESSAGE, CourseOfferingConstants.COURSE_OFFERING_CREATE_SUCCESS_WITH_MISSING_EXAMPERIOD);
426         } else if (!StringUtils.equals(courseOfferingInfo.getFinalExamType(), CourseOfferingConstants.COURSEOFFERING_FINAL_EXAM_TYPE_STANDARD)) {
427             urlParameters.put(EnrollConstants.GROWL_MESSAGE, CourseOfferingConstants.COURSE_OFFERING_CREATE_SUCCESS);
428         } else {
429             urlParameters.put(EnrollConstants.GROWL_MESSAGE, CourseOfferingConstants.COURSE_OFFERING_CREATE_SUCCESS_WITH_EXAMOFFERING_GENERATED);
430         }
431         urlParameters.put(EnrollConstants.GROWL_MESSAGE_PARAMS, courseOfferingInfo.getCourseOfferingCode());
432 
433 
434         urlParameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, "show");
435         urlParameters.put("termCode",createWrapper.getTargetTermCode());
436         urlParameters.put("inputCode",courseOfferingInfo.getCourseOfferingCode());
437         urlParameters.put("viewId",CourseOfferingConstants.MANAGE_CO_VIEW_ID);
438         urlParameters.put("pageId",CourseOfferingConstants.MANAGE_THE_CO_PAGE);
439         urlParameters.put("withinPortal","false");
440 
441         return super.performRedirect(form, CourseOfferingConstants.MANAGE_CO_CONTROLLER_PATH, urlParameters);
442     }
443 
444 }