/**
* 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.academicAdministration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.time.calendarStructure.AcademicCalendarEntry;
import org.fenixedu.academic.domain.time.calendarStructure.AcademicCalendarRootEntry;
import org.fenixedu.academic.dto.manager.academicCalendarManagement.CalendarEntryBean;
import org.fenixedu.academic.service.services.manager.academicCalendarManagement.CreateAcademicCalendarEntry;
import org.fenixedu.academic.service.services.manager.academicCalendarManagement.DeleteAcademicCalendarEntry;
import org.fenixedu.academic.ui.struts.action.academicAdministration.AcademicAdministrationApplication.AcademicAdminCalendarsApp;
import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction;
import org.fenixedu.academic.util.renderer.GanttDiagram;
import org.fenixedu.academic.util.renderer.GanttDiagramEvent;
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;
import org.joda.time.DateTime;
import org.joda.time.Partial;
import org.joda.time.YearMonthDay;
import pt.ist.fenixWebFramework.renderers.utils.RenderUtils;
import pt.ist.fenixframework.FenixFramework;
@StrutsFunctionality(app = AcademicAdminCalendarsApp.class, path = "manage", titleKey = "title.academic.calendars.management",
accessGroup = "academic(MANAGE_ACADEMIC_CALENDARS)")
@Mapping(module = "academicAdministration", path = "/academicCalendarsManagement", input = "/index.do",
formBean = "academicCalendarsManagementForm")
@Forwards(
value = {
@Forward(name = "viewAcademicCalendar",
path = "/academicAdministration/academicCalendarsManagement/viewAcademicCalendar.jsp"),
@Forward(name = "prepareCreateCalendarEntry",
path = "/academicAdministration/academicCalendarsManagement/createCalendarEntry.jsp"),
@Forward(name = "prepareChooseCalendar",
path = "/academicAdministration/academicCalendarsManagement/chooseCalendar.jsp") })
public class AcademicCalendarsManagementDA extends FenixDispatchAction {
public ActionForward prepareCreateAcademicCalendar(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
ExecutionYear currentExecutionYear = ExecutionYear.readCurrentExecutionYear();
Partial begin;
Partial end;
if (currentExecutionYear != null) {
begin = CalendarEntryBean.getPartialFromYearMonthDay(currentExecutionYear.getBeginDateYearMonthDay());
end = CalendarEntryBean.getPartialFromYearMonthDay(currentExecutionYear.getEndDateYearMonthDay());
} else {
begin = CalendarEntryBean.getPartialFromYearMonthDay(new YearMonthDay());
end = CalendarEntryBean.getPartialFromYearMonthDay(new YearMonthDay().plusMonths(3));
}
CalendarEntryBean bean = CalendarEntryBean.createAcademicCalendarBean(begin, end);
request.setAttribute("parentEntryBean", bean);
return mapping.findForward("prepareCreateCalendarEntry");
}
@EntryPoint
public ActionForward prepareChooseCalendar(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
Collection<AcademicCalendarRootEntry> academicCalendars = rootDomainObject.getAcademicCalendarsSet();
request.setAttribute("academicCalendars", academicCalendars);
return mapping.findForward("prepareChooseCalendar");
}
public ActionForward prepareViewAcademicCalendar(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
AcademicCalendarEntry academicCalendar = getAcademicCalendarEntryFromParameter(request);
ExecutionYear currentExecutionYear = ExecutionYear.readCurrentExecutionYear();
Partial begin;
Partial end;
if (currentExecutionYear != null) {
begin = CalendarEntryBean.getPartialFromYearMonthDay(currentExecutionYear.getBeginDateYearMonthDay());
end = CalendarEntryBean.getPartialFromYearMonthDay(currentExecutionYear.getEndDateYearMonthDay());
} else {
begin = CalendarEntryBean.getPartialFromYearMonthDay(new YearMonthDay().minusMonths(12));
end = CalendarEntryBean.getPartialFromYearMonthDay(new YearMonthDay().plusMonths(12));
}
CalendarEntryBean bean =
CalendarEntryBean.createCalendarEntryBeanToCreateEntry((AcademicCalendarRootEntry) academicCalendar,
academicCalendar, begin, end);
return generateGanttDiagram(mapping, request, bean);
}
public ActionForward viewAcademicCalendar(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
CalendarEntryBean bean = getRenderedObject("datesToDisplayID");
YearMonthDay beginDate = bean.getBeginDateToDisplayInYearMonthDayFormat();
YearMonthDay endDate = bean.getEndDateToDisplayInYearMonthDayFormat();
if (beginDate.isAfter(endDate)) {
addActionMessage(request, "error.begin.after.end");
ExecutionYear currentExecutionYear = ExecutionYear.readCurrentExecutionYear();
Partial begin = CalendarEntryBean.getPartialFromYearMonthDay(currentExecutionYear.getBeginDateYearMonthDay());
Partial end = CalendarEntryBean.getPartialFromYearMonthDay(currentExecutionYear.getEndDateYearMonthDay());
bean = CalendarEntryBean.createCalendarEntryBeanToCreateEntry(bean.getRootEntry(), bean.getRootEntry(), begin, end);
RenderUtils.invalidateViewState("datesToDisplayID");
return generateGanttDiagram(mapping, request, bean);
}
return generateGanttDiagram(mapping, request, bean);
}
public ActionForward gotBackToViewEntry(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
CalendarEntryBean bean = getRenderedObject();
return generateGanttDiagram(mapping, request, bean);
}
public ActionForward viewAcademicCalendarEntry(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
AcademicCalendarEntry entry = getAcademicCalendarEntryFromParameter(request);
AcademicCalendarRootEntry rootEntry = getAcademicCalendarRootEntryFromParameter(request);
Partial beginPartial = getBeginFromParameter(request);
Partial endPartial = getEndFromParameter(request);
CalendarEntryBean bean =
CalendarEntryBean.createCalendarEntryBeanToCreateEntry(rootEntry, entry, beginPartial, endPartial);
return generateGanttDiagram(mapping, request, bean);
}
public ActionForward chooseCalendarEntryTypePostBack(ActionMapping mapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response) throws Exception {
CalendarEntryBean bean = getRenderedObject("calendarEntryBeanWithType");
if (bean == null) {
bean = getRenderedObject("createdEntryBeanID");
}
request.setAttribute("parentEntryBean", bean);
return mapping.findForward("prepareCreateCalendarEntry");
}
public ActionForward prepareCreateEntry(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
AcademicCalendarEntry parentEntry = getAcademicCalendarEntryFromParameter(request);
AcademicCalendarRootEntry rootEntry = getAcademicCalendarRootEntryFromParameter(request);
Partial beginPartial = getBeginFromParameter(request);
Partial endPartial = getEndFromParameter(request);
request.setAttribute("parentEntryBean",
CalendarEntryBean.createCalendarEntryBeanToCreateEntry(rootEntry, parentEntry, beginPartial, endPartial));
return mapping.findForward("prepareCreateCalendarEntry");
}
public ActionForward createEntry(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
CalendarEntryBean bean = getRenderedObject("createdEntryBeanID");
AcademicCalendarEntry entry = null;
try {
entry = CreateAcademicCalendarEntry.run(bean, true);
} catch (DomainException e) {
addActionMessage(request, e.getMessage(), e.getArgs());
request.setAttribute("parentEntryBean", bean);
return mapping.findForward("prepareCreateCalendarEntry");
}
return generateGanttDiagram(mapping, request, CalendarEntryBean.createCalendarEntryBeanToCreateEntry(
entry.getRootEntry(), entry, bean.getBeginDateToDisplay(), bean.getEndDateToDisplay()));
}
public ActionForward prepareEditEntry(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
AcademicCalendarEntry entry = getAcademicCalendarEntryFromParameter(request);
AcademicCalendarRootEntry rootEntry = getAcademicCalendarRootEntryFromParameter(request);
Partial beginPartial = getBeginFromParameter(request);
Partial endPartial = getEndFromParameter(request);
request.setAttribute("entryBean",
CalendarEntryBean.createCalendarEntryBeanToEditEntry(rootEntry, entry, beginPartial, endPartial));
return mapping.findForward("prepareCreateCalendarEntry");
}
public ActionForward editEntry(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
CalendarEntryBean bean = getRenderedObject("editedEntryBeanID");
AcademicCalendarEntry entry = null;
try {
entry = CreateAcademicCalendarEntry.run(bean, false);
} catch (DomainException e) {
addActionMessage(request, e.getMessage(), e.getArgs());
request.setAttribute("entryBean", bean);
return mapping.findForward("prepareCreateCalendarEntry");
}
return generateGanttDiagram(mapping, request, CalendarEntryBean.createCalendarEntryBeanToCreateEntry(
entry.getRootEntry(), entry, bean.getBeginDateToDisplay(), bean.getEndDateToDisplay()));
}
public ActionForward deleteEntry(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
AcademicCalendarEntry entry = getAcademicCalendarEntryFromParameter(request);
AcademicCalendarRootEntry rootEntry = getAcademicCalendarRootEntryFromParameter(request);
AcademicCalendarRootEntry entryRootEntry = entry.getRootEntry();
AcademicCalendarEntry entryParentEntry = entry.getParentEntry();
boolean deletedRootEntry = entry.isRoot();
Partial beginPartial = getBeginFromParameter(request);
Partial endPartial = getEndFromParameter(request);
try {
DeleteAcademicCalendarEntry.run(entry, rootEntry);
} catch (DomainException domainException) {
addActionMessage(request, domainException.getMessage());
return generateGanttDiagram(mapping, request,
CalendarEntryBean.createCalendarEntryBeanToCreateEntry(rootEntry, entry, beginPartial, endPartial));
}
if (deletedRootEntry) {
return prepareChooseCalendar(mapping, actionForm, request, response);
} else if (entryParentEntry != null) {
return generateGanttDiagram(mapping, request,
CalendarEntryBean.createCalendarEntryBeanToCreateEntry(rootEntry, entryParentEntry, beginPartial, endPartial));
} else {
return generateGanttDiagram(mapping, request,
CalendarEntryBean.createCalendarEntryBeanToCreateEntry(rootEntry, entryRootEntry, beginPartial, endPartial));
}
}
// Private Methods
private ActionForward generateGanttDiagram(ActionMapping mapping, HttpServletRequest request, CalendarEntryBean bean) {
YearMonthDay beginDate = bean.getBeginDateToDisplayInYearMonthDayFormat();
YearMonthDay endDate = bean.getEndDateToDisplayInYearMonthDayFormat();
endDate = endDate.plusMonths(1).withDayOfMonth(1).minusDays(1);
List<GanttDiagramEvent> newEntries = generateEntriesTree(request, bean.getRootEntry(), beginDate, endDate);
GanttDiagram diagram = GanttDiagram.getNewTotalGanttDiagram(newEntries, beginDate, endDate);
request.setAttribute("entryBean", bean);
request.setAttribute("ganttDiagram", diagram);
return mapping.findForward("viewAcademicCalendar");
}
private List<GanttDiagramEvent> generateEntriesTree(HttpServletRequest request, AcademicCalendarRootEntry academicCalendar,
YearMonthDay begin, YearMonthDay end) {
DateTime beginDateTime = begin.toDateTimeAtMidnight();
DateTime endDateTime = end.toDateTimeAtMidnight();
List<GanttDiagramEvent> result = new ArrayList<GanttDiagramEvent>();
for (AcademicCalendarEntry entry : academicCalendar.getChildEntriesWithTemplateEntriesOrderByDate(beginDateTime,
endDateTime)) {
getSubEntriesTree(entry, result, beginDateTime, endDateTime);
}
return result;
}
private void getSubEntriesTree(AcademicCalendarEntry entry, List<GanttDiagramEvent> result, DateTime begin, DateTime end) {
result.add(entry);
for (AcademicCalendarEntry subEntry : entry.getChildEntriesWithTemplateEntriesOrderByDate(begin, end)) {
getSubEntriesTree(subEntry, result, begin, end);
}
}
private AcademicCalendarEntry getAcademicCalendarEntryFromParameter(final HttpServletRequest request) {
final String calendarIDString = request.getParameter("entryID");
return FenixFramework.getDomainObject(calendarIDString);
}
private AcademicCalendarRootEntry getAcademicCalendarRootEntryFromParameter(final HttpServletRequest request) {
final String calendarIDString = request.getParameter("rootEntryID");
return (AcademicCalendarRootEntry) FenixFramework.getDomainObject(calendarIDString);
}
private Partial getBeginFromParameter(final HttpServletRequest request) {
final String date = request.getParameter("begin");
return CalendarEntryBean.getPartialFromString(date);
}
private Partial getEndFromParameter(final HttpServletRequest request) {
final String date = request.getParameter("end");
return CalendarEntryBean.getPartialFromString(date);
}
}