/**
* Copyright © 2002 Instituto Superior Técnico
*
* This file is part of FenixEdu Academic.
*
* FenixEdu Academic is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FenixEdu Academic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>.
*/
package org.fenixedu.academic.ui.struts.action.resourceAllocationManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ReverseComparator;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.fenixedu.academic.domain.ShiftType;
import org.fenixedu.academic.dto.InfoExecutionCourse;
import org.fenixedu.academic.dto.InfoExecutionCourseOccupancy;
import org.fenixedu.academic.dto.InfoShift;
import org.fenixedu.academic.dto.InfoShiftGroupStatistics;
import org.fenixedu.academic.dto.resourceAllocationManager.ContextSelectionBean;
import org.fenixedu.academic.service.services.commons.ReadCurricularCourseScopesByExecutionCourseID;
import org.fenixedu.academic.service.services.commons.ReadExecutionCourseByOID;
import org.fenixedu.academic.service.services.resourceAllocationManager.ReadShiftsByExecutionCourseID;
import org.fenixedu.academic.service.services.resourceAllocationManager.SearchExecutionCourses;
import org.fenixedu.academic.ui.struts.action.resourceAllocationManager.RAMApplication.RAMExecutionCoursesApp;
import org.fenixedu.academic.ui.struts.action.resourceAllocationManager.base.FenixExecutionDegreeAndCurricularYearContextDispatchAction;
import org.fenixedu.academic.ui.struts.action.resourceAllocationManager.utils.PresentationConstants;
import org.fenixedu.bennu.struts.annotations.Forward;
import org.fenixedu.bennu.struts.annotations.Forwards;
import org.fenixedu.bennu.struts.annotations.Mapping;
import org.fenixedu.bennu.struts.portal.EntryPoint;
import org.fenixedu.bennu.struts.portal.StrutsFunctionality;
/**
* @author Luis Cruz & Sara Ribeiro
*
*/
@StrutsFunctionality(app = RAMExecutionCoursesApp.class, path = "manage", titleKey = "link.management")
@Mapping(path = "/manageExecutionCourses", module = "resourceAllocationManager")
@Forwards({ @Forward(name = "ShowSearchForm", path = "/resourceAllocationManager/manageExecutionCourses_bd.jsp"),
@Forward(name = "showOccupancy", path = "/resourceAllocationManager/showOccupancyLevels_bd.jsp"),
@Forward(name = "showLoads", path = "/resourceAllocationManager/showLoads_bd.jsp") })
public class ManageExecutionCoursesDA extends FenixExecutionDegreeAndCurricularYearContextDispatchAction {
@EntryPoint
public ActionForward prepareSearch(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
return mapping.findForward("ShowSearchForm");
}
public ActionForward choosePostBack(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
return mapping.findForward("ShowSearchForm");
}
public ActionForward search(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
ContextSelectionBean contextSelectionBean =
(ContextSelectionBean) request.getAttribute(PresentationConstants.CONTEXT_SELECTION_BEAN);
request.setAttribute(
PresentationConstants.CURRICULAR_YEAR_OID,
contextSelectionBean.getCurricularYear() != null ? contextSelectionBean.getCurricularYear().getExternalId() : null);
request.setAttribute(PresentationConstants.EXECUTION_DEGREE_OID, contextSelectionBean.getExecutionDegree()
.getExternalId());
request.setAttribute("execution_course_name", contextSelectionBean.getCourseName().replaceAll("%", "%25"));
List<InfoExecutionCourse> infoExecutionCourses = null;
if (contextSelectionBean.getCurricularYear() == null) {
infoExecutionCourses =
SearchExecutionCourses.runSearchExecutionCourses(contextSelectionBean.getAcademicInterval(),
contextSelectionBean.getExecutionDegree(), contextSelectionBean.getCourseName());
} else {
infoExecutionCourses =
SearchExecutionCourses.runSearchExecutionCourses(contextSelectionBean.getAcademicInterval(),
contextSelectionBean.getExecutionDegree(), contextSelectionBean.getCurricularYear(),
contextSelectionBean.getCourseName());
}
if (infoExecutionCourses != null) {
sortList(request, infoExecutionCourses);
request.setAttribute(PresentationConstants.LIST_INFOEXECUTIONCOURSE, infoExecutionCourses);
}
return mapping.findForward("ShowSearchForm");
}
/**
* @param request
* @param infoExecutionCourses
*/
private void sortList(HttpServletRequest request, List<InfoExecutionCourse> infoExecutionCourses) {
String sortParameter = request.getParameter("sortBy");
if ((sortParameter != null) && (sortParameter.length() != 0)) {
if (sortParameter.equals("occupancy")) {
Collections.sort(infoExecutionCourses, new ReverseComparator(new BeanComparator(sortParameter)));
} else {
Collections.sort(infoExecutionCourses, new BeanComparator(sortParameter));
}
} else {
Collections.sort(infoExecutionCourses, new ReverseComparator(new BeanComparator("occupancy")));
}
}
public ActionForward showOccupancyLevels(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
InfoExecutionCourseOccupancy infoExecutionCourseOccupancy =
ReadShiftsByExecutionCourseID.runReadShiftsByExecutionCourseID(request.getParameter("executionCourseOID"));
arranjeShifts(infoExecutionCourseOccupancy);
// Collections.sort(infoExecutionCourseOccupancy.getInfoShifts(), new
// ReverseComparator(new BeanComparator("percentage")));
request.setAttribute("infoExecutionCourseOccupancy", infoExecutionCourseOccupancy);
return mapping.findForward("showOccupancy");
}
/**
* @param infoExecutionCourseOccupancy
*/
private void arranjeShifts(InfoExecutionCourseOccupancy infoExecutionCourseOccupancy) {
// Note : This must be synched with TipoAula.java
List theoreticalShifts = new ArrayList();
List theoPraticalShifts = new ArrayList();
List praticalShifts = new ArrayList();
List labShifts = new ArrayList();
List reserveShifts = new ArrayList();
List doubtsShifts = new ArrayList();
List fieldWork = new ArrayList();
List problems = new ArrayList();
List seminary = new ArrayList();
List trainingPeriod = new ArrayList();
List tutorialOrientation = new ArrayList();
infoExecutionCourseOccupancy.setShiftsInGroups(new ArrayList());
Iterator iterator = infoExecutionCourseOccupancy.getInfoShifts().iterator();
while (iterator.hasNext()) {
InfoShift infoShift = (InfoShift) iterator.next();
if (infoShift.containsType(ShiftType.TEORICA)) {
theoreticalShifts.add(infoShift);
} else if (infoShift.containsType(ShiftType.PRATICA)) {
praticalShifts.add(infoShift);
} else if (infoShift.containsType(ShiftType.DUVIDAS)) {
doubtsShifts.add(infoShift);
} else if (infoShift.containsType(ShiftType.LABORATORIAL)) {
labShifts.add(infoShift);
} else if (infoShift.containsType(ShiftType.RESERVA)) {
reserveShifts.add(infoShift);
} else if (infoShift.containsType(ShiftType.TEORICO_PRATICA)) {
theoPraticalShifts.add(infoShift);
} else if (infoShift.containsType(ShiftType.FIELD_WORK)) {
fieldWork.add(infoShift);
} else if (infoShift.containsType(ShiftType.PROBLEMS)) {
problems.add(infoShift);
} else if (infoShift.containsType(ShiftType.SEMINARY)) {
seminary.add(infoShift);
} else if (infoShift.containsType(ShiftType.TRAINING_PERIOD)) {
trainingPeriod.add(infoShift);
} else if (infoShift.containsType(ShiftType.TUTORIAL_ORIENTATION)) {
tutorialOrientation.add(infoShift);
}
}
infoExecutionCourseOccupancy.setInfoShifts(null);
InfoShiftGroupStatistics infoShiftGroupStatistics = new InfoShiftGroupStatistics();
if (!theoreticalShifts.isEmpty()) {
infoShiftGroupStatistics.setShiftsInGroup(theoreticalShifts);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!theoPraticalShifts.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(theoPraticalShifts);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!labShifts.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(labShifts);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!praticalShifts.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(praticalShifts);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!reserveShifts.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(reserveShifts);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!doubtsShifts.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(doubtsShifts);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!fieldWork.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(fieldWork);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!problems.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(problems);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!seminary.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(seminary);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!trainingPeriod.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(trainingPeriod);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
if (!tutorialOrientation.isEmpty()) {
infoShiftGroupStatistics = new InfoShiftGroupStatistics();
infoShiftGroupStatistics.setShiftsInGroup(tutorialOrientation);
infoExecutionCourseOccupancy.getShiftsInGroups().add(infoShiftGroupStatistics);
}
}
public ActionForward showLoads(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String executionCourceOId = request.getParameter("executionCourseOID");
InfoExecutionCourse infoExecutionCourse = ReadExecutionCourseByOID.run(executionCourceOId);
List scopes = ReadCurricularCourseScopesByExecutionCourseID.run(executionCourceOId);
request.setAttribute("infoExecutionCourse", infoExecutionCourse);
request.setAttribute("curricularCourses", scopes);
return mapping.findForward("showLoads");
}
}