/**
* Licensed to Apereo under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Apereo licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jasig.portlet.grades.mvc;
import java.util.HashMap;
import java.util.Map;
import javax.portlet.*;
import org.jasig.portlet.courses.dao.ICoursesDao;
import org.jasig.portlet.courses.model.xml.Term;
import org.jasig.portlet.courses.model.xml.TermList;
import org.jasig.portlet.courses.model.xml.personal.CoursesByTerm;
import org.jasig.portlet.utils.mvc.IViewSelector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.portlet.ModelAndView;
import org.springframework.web.portlet.bind.annotation.ActionMapping;
import org.springframework.web.portlet.bind.annotation.RenderMapping;
import org.springframework.web.portlet.bind.annotation.ResourceMapping;
@Controller
@RequestMapping("VIEW")
public class FinalGradesPortletController {
public static final String TERMCODE = "termCode";
private ICoursesDao coursesDao;
private IViewSelector viewSelector;
@Autowired
public void setViewSelector(IViewSelector viewSelector) {
this.viewSelector = viewSelector;
}
@Autowired
public void setCoursesDao(ICoursesDao coursesDao) {
this.coursesDao = coursesDao;
}
@RenderMapping
public ModelAndView getGrades(PortletRequest request, @RequestParam(required=false) String termCode) {
final Map<String, Object> model = new HashMap<String, Object>();
PortletPreferences prefs = request.getPreferences();
request.getPortletSession().setAttribute("helpDeskURL",prefs.getValue("helpDeskURL", ""));
final TermList termList = coursesDao.getTermList(request);
model.put("termList", termList);
//Determine the current term code and term
termCode = this.getSelectedTermCode(request, termCode);
final Term selectedTerm = this.getSelectedTerm(termCode, termList);
//Grab the courseSummary information if a selectedTerm is set
if (selectedTerm != null) {
final CoursesByTerm courseSummary = coursesDao.getCoursesByTerm(request, selectedTerm.getCode());
model.put("courseSummary", courseSummary);
model.put("selectedTerm", selectedTerm);
}
final boolean isMobile = viewSelector.isMobile(request);
final String viewName = isMobile ? "final-grades/grades-jQM" : "final-grades/grades";
return new ModelAndView(viewName, model);
}
@ResourceMapping("gradesUpdate")
public ModelAndView getCoursesSummary(ResourceRequest resourceRequest, @RequestParam String termCode) {
final Map<String, Object> model = new HashMap<String, Object>();
final TermList termList = coursesDao.getTermList(resourceRequest);
model.put("termList", termList);
//Determine the current term code and term
termCode = this.getSelectedTermCode(resourceRequest, termCode);
final Term selectedTerm = this.getSelectedTerm(termCode, termList);
if (selectedTerm == null) {
throw new IllegalArgumentException("Could not find term for code: " + termCode);
}
//Grab the courseSummary information if a selectedTerm is set
final CoursesByTerm courseSummary = coursesDao.getCoursesByTerm(resourceRequest, selectedTerm.getCode());
model.put("courseSummary", courseSummary);
model.put("selectedTerm", selectedTerm);
//TODO does this need a mobile specific view? If so uncomment these lines and
// final boolean isMobile = viewSelector.isMobile(resourceRequest);
// final String viewName = isMobile ? "fragments/gradesUpdate-jQM" : "fragments/gradesUpdate";
final String viewName = "final-grades/fragments/gradesUpdate";
return new ModelAndView(viewName, model);
}
/**
* Action request handler that simply copies all parameters from action to render
*/
@ActionMapping
public void copyActionParameters(ActionRequest actionRequest, ActionResponse actionResponse) {
actionResponse.setRenderParameters(actionRequest.getParameterMap());
}
/**
* Determine the term code to use. If a term code is specified on the request it is returned and stored
* in the portlet session. If no term code is specified on the request the session is checked for a stored
* term code.
*/
protected String getSelectedTermCode(PortletRequest portletRequest, String requestTermCode) {
final PortletSession portletSession = portletRequest.getPortletSession();
if (requestTermCode != null) {
portletSession.setAttribute(TERMCODE, requestTermCode);
return requestTermCode;
}
return (String)portletSession.getAttribute(TERMCODE);
}
/**
* If termCode is null {@link termList#getCurrentTerm()} is used, if not {@link termList#getTerm(String)} is used
*/
protected Term getSelectedTerm(String termCode, final TermList termList) {
if (termCode == null) {
return termList.getCurrentTerm();
}
return termList.getTerm(termCode);
}
}