/**
* Copyright © ${project.inceptionYear} Instituto Superior Técnico
*
* This file is part of Fenix IST.
*
* Fenix IST 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.
*
* Fenix IST 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 Fenix IST. If not, see <http://www.gnu.org/licenses/>.
*/
package pt.ist.fenix.ui.struts.action.manager.student.importation;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
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.EntryPhase;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.domain.QueueJob;
import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction;
import org.fenixedu.academic.ui.struts.action.manager.ManagerApplications.ManagerStudentsApp;
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.fenixedu.spaces.domain.Space;
import pt.ist.fenix.domain.student.importation.DgesBaseProcessLauncher;
import pt.ist.fenix.domain.student.importation.DgesStudentImportationFile;
import pt.ist.fenix.domain.student.importation.DgesStudentImportationProcess;
import pt.ist.fenix.domain.student.importation.ExportDegreeCandidaciesByDegreeForPasswordGeneration;
import pt.ist.fenix.domain.student.importation.ExportExistingStudentsFromImportationProcess;
import pt.ist.fenixWebFramework.renderers.DataProvider;
import pt.ist.fenixWebFramework.renderers.components.converters.Converter;
import pt.ist.fenixWebFramework.renderers.utils.RenderUtils;
@StrutsFunctionality(app = ManagerStudentsApp.class, path = "dges-student-importation",
titleKey = "title.dges.student.importation")
@Mapping(path = "/dgesStudentImportationProcess", module = "manager")
@Forwards({
@Forward(name = "list", path = "/manager/student/importation/list.jsp"),
@Forward(name = "prepare-create-new-process", path = "/manager/student/importation/prepareCreateNewProcess.jsp"),
@Forward(name = "prepare-create-new-exportation-candidacies-for-password-generation-job",
path = "/manager/student/importation/prepareCreateNewExportationForPasswordGeneration.jsp") })
public class DgesStudentImportationProcessDA extends FenixDispatchAction {
@EntryPoint
public ActionForward list(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
DgesBaseProcessBean bean = getRenderedBean();
if (bean == null) {
bean = new DgesBaseProcessBean(ExecutionYear.readCurrentExecutionYear());
}
RenderUtils.invalidateViewState("importation.bean");
request.setAttribute("importationBean", bean);
request.setAttribute("importationJobsDone", DgesStudentImportationProcess.readDoneJobs(bean.getExecutionYear()));
request.setAttribute("importationJobsPending", DgesStudentImportationProcess.readUndoneJobs(bean.getExecutionYear()));
request.setAttribute("exportationPasswordsDone",
ExportDegreeCandidaciesByDegreeForPasswordGeneration.readDoneJobs(bean.getExecutionYear()));
request.setAttribute("exportationPasswordsPending",
ExportDegreeCandidaciesByDegreeForPasswordGeneration.readUndoneJobs(bean.getExecutionYear()));
request.setAttribute("exportationAlreadyStudentsDone",
ExportExistingStudentsFromImportationProcess.readDoneJobs(bean.getExecutionYear()));
request.setAttribute("exportionAlreadyStudentsPending",
ExportExistingStudentsFromImportationProcess.readUndoneJobs(bean.getExecutionYear()));
request.setAttribute("canRequestJobImportationProcess", DgesStudentImportationProcess.canRequestJob());
request.setAttribute("canRequestJobExportationPasswords",
ExportDegreeCandidaciesByDegreeForPasswordGeneration.canRequestJob());
request.setAttribute("canRequestJobExportationAlreadyStudents",
ExportExistingStudentsFromImportationProcess.canRequestJob());
return mapping.findForward("list");
}
private DgesBaseProcessBean getRenderedBean() {
return getRenderedObject("importation.bean");
}
public ActionForward prepareCreateNewImportationProcess(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
DgesBaseProcessBean bean = getRenderedBean();
if (bean == null) {
bean = new DgesBaseProcessBean(ExecutionYear.readCurrentExecutionYear());
}
RenderUtils.invalidateViewState("importation.bean");
RenderUtils.invalidateViewState("importation.bean.edit");
request.setAttribute("importationBean", bean);
return mapping.findForward("prepare-create-new-process");
}
public ActionForward createNewImportationProcess(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
DgesBaseProcessBean bean = getRenderedBean();
RenderUtils.invalidateViewState("importation.bean");
RenderUtils.invalidateViewState("importation.bean.edit");
byte[] contents = bean.consumeStream();
DgesStudentImportationFile file =
DgesStudentImportationFile.create(contents, bean.getFilename(), bean.getExecutionYear(), bean.getCampus(),
bean.getPhase());
DgesBaseProcessLauncher.launchImportation(bean.getExecutionYear(), bean.getCampus(), bean.getPhase(), file);
return list(mapping, form, request, response);
}
public ActionForward createNewImportationProcessInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
addActionMessage(request, "error", "error.dges.importation.file");
return prepareCreateNewImportationProcess(mapping, form, request, response);
}
public ActionForward cancelJob(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
QueueJob job = getDomainObject(request, "queueJobId");
job.cancel();
return list(mapping, form, request, response);
}
public ActionForward prepareCreateNewExportationCandidaciesForPasswordGenerationJob(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DgesBaseProcessBean bean = getRenderedBean();
if (bean == null) {
bean = new DgesBaseProcessBean(ExecutionYear.readCurrentExecutionYear());
}
RenderUtils.invalidateViewState("importation.bean");
RenderUtils.invalidateViewState("importation.bean.edit");
request.setAttribute("importationBean", bean);
return mapping.findForward("prepare-create-new-exportation-candidacies-for-password-generation-job");
}
public ActionForward createNewExportationCandidaciesForPasswordGenerationProcess(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DgesBaseProcessBean bean = getRenderedBean();
RenderUtils.invalidateViewState("importation.bean");
RenderUtils.invalidateViewState("importation.bean.edit");
DgesBaseProcessLauncher.launchExportationCandidaciesForPasswordGeneration(bean.getExecutionYear(), bean.getPhase());
return list(mapping, form, request, response);
}
public ActionForward createNewExportationCandidaciesForPasswordGenerationProcessInvalid(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse response) {
return prepareCreateNewExportationCandidaciesForPasswordGenerationJob(mapping, form, request, response);
}
public static class DgesBaseProcessBean implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private InputStream stream;
private String filename;
private Long filesize;
private ExecutionYear executionYear;
private Space campus;
private EntryPhase phase;
public DgesBaseProcessBean(final ExecutionYear executionYear) {
this.executionYear = executionYear;
}
public InputStream getStream() {
return stream;
}
public void setStream(InputStream stream) {
this.stream = stream;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public Long getFilesize() {
return filesize;
}
public void setFilesize(Long filesize) {
this.filesize = filesize;
}
public ExecutionYear getExecutionYear() {
return executionYear;
}
public void setExecutionYear(ExecutionYear executionYear) {
this.executionYear = executionYear;
}
public Space getCampus() {
return campus;
}
public void setCampus(Space campus) {
this.campus = campus;
}
public EntryPhase getPhase() {
return phase;
}
public void setPhase(final EntryPhase phase) {
this.phase = phase;
}
public byte[] consumeStream() throws IOException {
byte[] data = new byte[getFilesize().intValue()];
getStream().read(data);
return data;
}
}
public static class EntryPhaseProvider implements DataProvider {
@Override
public Object provide(Object source, Object currentValue) {
return Arrays.asList(EntryPhase.values());
}
@Override
public Converter getConverter() {
return null;
}
}
}