/********************************************************************************** * $URL: * $Id: *********************************************************************************** * * Copyright (c) 2007, 2008, 2009 The Sakai Foundation * * Licensed under the Educational Community 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 * * http://www.opensource.org/licenses/ECL-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.sakaiproject.tool.assessment.ui.servlet.cp; import java.io.BufferedInputStream; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.authz.cover.SecurityService; import org.sakaiproject.tool.assessment.contentpackaging.ManifestGenerator; import org.sakaiproject.tool.assessment.facade.AgentFacade; import org.sakaiproject.tool.assessment.services.assessment.AssessmentService; import org.sakaiproject.tool.assessment.ui.bean.qti.XMLController; import org.sakaiproject.tool.assessment.ui.bean.shared.PersonBean; import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil; /** * <p>Title: Samigo</p> * @version $Id: DownloadCPServlet.java 106463 2012-04-02 12:20:09Z david.horwitz@uct.ac.za $ */ public class DownloadCPServlet extends HttpServlet { private static Log log = LogFactory.getLog(DownloadCPServlet.class); /** * passthu to post * * @param req * @param res * @throws ServletException * @throws IOException */ public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doPost(req, res); } /** * Get the faces context and display the contents of the XMLDisplay bean * * @param req * @param res * @throws ServletException * @throws IOException */ public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String assessmentId = req.getParameter("assessmentId"); //update random question pools (if any) before exporting AssessmentService assessmentService = new AssessmentService(); int success = assessmentService.updateAllRandomPoolQuestions(assessmentService.getAssessment(assessmentId)); if(success == AssessmentService.UPDATE_SUCCESS){ String agentIdString = getAgentString(req, res); String currentSiteId = assessmentService .getAssessmentSiteId(assessmentId); String assessmentCreatedBy = assessmentService .getAssessmentCreatedBy(assessmentId); boolean accessDenied = true; if (canExport(req, res, agentIdString, currentSiteId, assessmentCreatedBy)) { accessDenied = false; } if (accessDenied) { String path = "/jsf/qti/exportDenied.faces"; RequestDispatcher dispatcher = req.getRequestDispatcher(path); dispatcher.forward(req, res); } else { res.setContentType("application/x-zip-compressed"); String zipFilename = "exportAssessment.zip"; res.setHeader("Content-Disposition", "attachment;filename=\"" + zipFilename + "\";"); ServletOutputStream outputStream = null; //BufferedInputStream bufInputStream = null; ZipOutputStream zos = null; ZipEntry ze = null; try { byte[] b = null; outputStream = res.getOutputStream(); zos = new ZipOutputStream(outputStream); // QTI file ze = new ZipEntry("exportAssessment.xml"); zos.putNextEntry(ze); XMLController xmlController = (XMLController) ContextUtil .lookupBeanFromExternalServlet("xmlController", req, res); xmlController.setId(assessmentId); xmlController.setQtiVersion(1); xmlController.displayAssessmentXml(); String qtiString = xmlController.getXmlBean().getXml(); log.debug("qtiString = " + qtiString); b = qtiString.getBytes(); zos.write(b, 0, b.length); zos.closeEntry(); // imsmanifest.xml ze = new ZipEntry("imsmanifest.xml"); zos.putNextEntry(ze); ManifestGenerator manifestGenerator = new ManifestGenerator( assessmentId); String manString = manifestGenerator.getManifest(); log.debug("manString = " + manString); b = manString.getBytes(); zos.write(b, 0, b.length); zos.closeEntry(); // Attachments HashMap contentMap = manifestGenerator.getContentMap(); String filename = null; for (Iterator it = contentMap.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); filename = (String) entry.getKey(); ze = new ZipEntry(filename.substring(1)); zos.putNextEntry(ze); b = (byte[]) entry.getValue(); zos.write(b, 0, b.length); zos.closeEntry(); } } catch (IOException e) { log.error(e.getMessage()); throw e; } finally { if (zos != null) { try { zos.closeEntry(); } catch (IOException e) { log.error(e.getMessage()); } try { zos.close(); } catch (IOException e) { log.error(e.getMessage()); } } } } }else{ if(success == AssessmentService.UPDATE_ERROR_DRAW_SIZE_TOO_LARGE){ String err=ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AuthorMessages","update_pool_error_size_too_large"); req.setAttribute("error", err); }else{ String err=ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AuthorMessages","update_pool_error_unknown"); req.setAttribute("error", err); } String path = "/jsf/qti/poolUpdateError.faces"; RequestDispatcher dispatcher = req.getRequestDispatcher(path); dispatcher.forward(req, res); } } private boolean isOwner(String agentId, String ownerId) { boolean isOwner = false; isOwner = agentId.equals(ownerId); return isOwner; } private String getAgentString(HttpServletRequest req, HttpServletResponse res) { String agentIdString = AgentFacade.getAgentString(); if (agentIdString == null || agentIdString.equals("")) { // try this PersonBean person = (PersonBean) ContextUtil .lookupBeanFromExternalServlet("person", req, res); agentIdString = person.getAnonymousId(); } return agentIdString; } public boolean canExport(HttpServletRequest req, HttpServletResponse res, String agentId, String currentSiteId, String createdBy) { log.debug("agentId=" + agentId); log.debug("currentSiteId=" + currentSiteId); boolean hasPrivilege_any = hasPrivilege(req, "edit_any_assessment", currentSiteId); boolean hasPrivilege_own = hasPrivilege(req, "edit_own_assessment", currentSiteId); log.debug("hasPrivilege_any=" + hasPrivilege_any); log.debug("hasPrivilege_own=" + hasPrivilege_own); boolean hasPrivilege = (hasPrivilege_any || (hasPrivilege_own && isOwner( agentId, createdBy))); return hasPrivilege; } public boolean hasPrivilege(HttpServletRequest req, String functionKey, String context) { String functionName = (String) ContextUtil.getLocalizedString(req, "org.sakaiproject.tool.assessment.bundle.AuthzPermissions", functionKey); boolean privilege = SecurityService.unlock(functionName, "/site/" + context); return privilege; } }