/** * 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.commons; import java.io.File; import java.io.InputStream; import java.util.HashSet; import java.util.List; import java.util.Set; 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.exceptions.DomainException; import org.fenixedu.academic.domain.organizationalStructure.Unit; import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction; import org.fenixedu.bennu.struts.portal.EntryPoint; import pt.ist.fenix.domain.UnitFile; import pt.ist.fenix.domain.UnitFileTag; import pt.ist.fenix.domain.accessControl.PersistentGroupMembers; import pt.ist.fenix.domain.accessControl.PersistentGroupMembersType; import pt.ist.fenix.service.services.manager.CreatePersistentGroup; import pt.ist.fenix.service.services.manager.CreateUnitFile; import pt.ist.fenix.service.services.manager.DeletePersistentGroup; import pt.ist.fenix.service.services.manager.DeleteUnitFile; import pt.ist.fenix.service.services.manager.EditPersistentGroup; import pt.ist.fenix.service.services.manager.EditUnitFile; import pt.ist.fenix.ui.struts.action.research.researchUnit.PersistentGroupMembersBean; import pt.ist.fenix.ui.struts.action.research.researchUnit.UnitFileBean; import pt.ist.fenix.ui.struts.action.research.researchUnit.UnitFileUploadBean; import pt.ist.fenixWebFramework.renderers.components.state.IViewState; import pt.ist.fenixWebFramework.renderers.utils.RenderUtils; import pt.utl.ist.fenix.tools.util.FileUtils; public abstract class UnitFunctionalities extends FenixDispatchAction { /** * Default page size for the unit's files list. */ protected static final int PAGE_SIZE = 20; @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("unit", getUnit(request)); return super.execute(mapping, form, request, response); } public ActionForward configureGroups(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { Unit unit = getUnit(request); request.setAttribute("groups", unit.getPersistentGroupsSet()); return mapping.findForward("managePersistedGroups"); } public ActionForward prepareCreatePersistedGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("bean", getNewPersistentGroupBean(request)); return mapping.findForward("createPersistedGroup"); } public ActionForward createPersistedGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { IViewState viewState = RenderUtils.getViewState("createGroup"); if (viewState != null) { PersistentGroupMembersBean bean = (PersistentGroupMembersBean) viewState.getMetaObject().getObject(); if (bean.getIstId() != null) { bean.getPeople().add(bean.getIstId()); } if (bean.getPeople().isEmpty()) { addActionMessage(request, "accessGroupManagement.empty"); return mapping.findForward("createPersistedGroup"); } CreatePersistentGroup.run(bean.getUnit(), bean.getName(), bean.getPeople(), bean.getType()); } return configureGroups(mapping, form, request, response); } public ActionForward deletePersistedGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PersistentGroupMembers group = getGroup(request); if (group != null) { try { DeletePersistentGroup.run(group); } catch (DomainException e) { addActionMessage(request, e.getMessage()); } } return configureGroups(mapping, form, request, response); } public ActionForward prepareEditPersistedGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("bean", new PersistentGroupMembersBean(getGroup(request))); return mapping.findForward("editPersistedGroup"); } public ActionForward editPersistedGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { IViewState viewState = RenderUtils.getViewState("editGroup"); if (viewState != null) { try { PersistentGroupMembersBean bean = (PersistentGroupMembersBean) viewState.getMetaObject().getObject(); if (bean.getIstId() != null) { bean.getPeople().add(bean.getIstId()); } EditPersistentGroup.run(bean.getGroup(), bean.getName(), bean.getPeople(), bean.getUnit()); } catch (DomainException e) { addActionMessage(request, e.getMessage()); } } return configureGroups(mapping, form, request, response); } public ActionForward prepareFileUpload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { UnitFileUploadBean bean = new UnitFileUploadBean(getUnit(request)); request.setAttribute("fileBean", bean); return mapping.findForward("uploadFile"); } public ActionForward uploadFile(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { IViewState viewState = RenderUtils.getViewState("upload"); if (viewState == null) { return prepareFileUpload(mapping, form, request, response); } UnitFileUploadBean bean = (UnitFileUploadBean) viewState.getMetaObject().getObject(); RenderUtils.invalidateViewState(); if (!bean.getUnit().isCurrentUserAllowedToUploadFiles()) { return manageFiles(mapping, form, request, response); } InputStream formFileInputStream = null; File file = null; try { formFileInputStream = bean.getUploadFile(); file = FileUtils.copyToTemporaryFile(formFileInputStream); CreateUnitFile.run(file, bean.getFileName(), bean.getName(), bean.getDescription(), bean.getTags(), bean.getGroup(), getUnit(request), getLoggedPerson(request)); } catch (DomainException e) { addActionMessage(request, e.getMessage()); } finally { file.delete(); } return manageFiles(mapping, form, request, response); } public ActionForward deleteFile(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { UnitFile file = getUnitFile(request); if (file != null && file.getUnit().isCurrentUserAllowedToUploadFiles()) { DeleteUnitFile.run(file); } return manageFiles(mapping, form, request, response); } private ActionForward putFilesOnRequest(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, List<UnitFile> unsortedList) throws Exception { List<UnitFile> files = RenderUtils.sortCollectionWithCriteria(unsortedList, request.getParameter("sort")); int numberOfPages = files.size() / getPageSize(); numberOfPages += (files.size() % getPageSize() != 0) ? 1 : 0; request.setAttribute("numberOfPages", numberOfPages); String page = request.getParameter("filePage"); int pageNumber = 1; if (page != null) { pageNumber = Integer.valueOf(page); } request.setAttribute("filePage", pageNumber); int start = (pageNumber - 1) * getPageSize(); request.setAttribute("files", files.subList(start, Math.min(start + getPageSize(), files.size()))); return mapping.findForward("manageFiles"); } @EntryPoint public ActionForward manageFiles(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return putFilesOnRequest(mapping, form, request, response, UnitFile.getAccessibileFiles(getUnit(request), getLoggedPerson(request))); } public ActionForward viewFilesByTag(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String tagName = request.getParameter("selectedTags"); Set<UnitFileTag> unitFileTags = new HashSet<UnitFileTag>(); if (tagName != null && tagName.length() > 0) { String[] tags = tagName.split("\\p{Space}+"); for (String tag2 : tags) { UnitFileTag tag = UnitFileTag.getUnitFileTag(getUnit(request), tag2); if (tag != null) { unitFileTags.add(tag); } } return putFilesOnRequest(mapping, form, request, response, UnitFile.getAccessibileFiles(getUnit(request), getLoggedPerson(request), unitFileTags)); } else { return manageFiles(mapping, form, request, response); } } public ActionForward prepareEditFile(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { UnitFile file = getUnitFile(request); if (file != null && file.getUploader().equals(getLoggedPerson(request))) { request.setAttribute("file", new UnitFileBean(file)); } return mapping.findForward("editFile"); } public ActionForward editFile(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { IViewState viewState = RenderUtils.getViewState("editFile"); if (viewState != null) { UnitFileBean bean = (UnitFileBean) viewState.getMetaObject().getObject(); EditUnitFile.run(bean.getFile(), bean.getName(), bean.getDescription(), bean.getTags(), bean.getGroup()); } return manageFiles(mapping, form, request, response); } public ActionForward configureUploaders(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return mapping.findForward("editUploaders"); } protected Integer getPageSize() { return PAGE_SIZE; } protected UnitFile getUnitFile(HttpServletRequest request) { return getDomainObject(request, "fid"); } protected Unit getUnit(HttpServletRequest request) { return getDomainObject(request, "unitId"); } protected PersistentGroupMembers getGroup(HttpServletRequest request) { return getDomainObject(request, "groupId"); } protected PersistentGroupMembersBean getNewPersistentGroupBean(HttpServletRequest request) { Unit unit = getUnit(request); return new PersistentGroupMembersBean(unit, PersistentGroupMembersType.UNIT_GROUP); } }