/** * */ package nl.ipo.cds.admin.ba.controller; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import nl.idgis.commons.jobexecutor.AbstractJob; import nl.ipo.cds.admin.ba.util.DownloadUtils; import nl.ipo.cds.dao.ManagerDao; import nl.ipo.cds.domain.EtlJob; import nl.ipo.cds.etl.reporting.geom.FeatureCollectionFactory; import nl.ipo.cds.etl.reporting.geom.ShapeFileGenerator; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.geotools.data.simple.SimpleFeatureCollection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * * @author eshuism * 21 mei 2012 */ @Controller public class DownloadController { private static final Log logger = LogFactory.getLog(DownloadController.class); @Autowired private ManagerDao managerDao; @Autowired private ShapeFileGenerator shapeFileGenerator; @Autowired private FeatureCollectionFactory featureCollectionFactory; @ModelAttribute("roleFunction") String getRoleFunction(){ return "beheerder"; } /** * Download geometryErrors in a shapefile */ @RequestMapping(value = "/ba/download/shapefile/jobs/{jobId}", method = RequestMethod.GET) public void downLoadShapeFile (@PathVariable long jobId, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { AbstractJob abstractJob = this.managerDao.getJob(jobId); Assert.notNull(abstractJob, "job with id " + jobId + " could not be found"); Assert.isTrue (abstractJob instanceof EtlJob, String.format ("job with id %d must be an ETL job", jobId)); EtlJob job = (EtlJob)abstractJob; HttpSession session = httpServletRequest.getSession(); String sessionId = session.getId(); // If job has no endTime; it's not applicable to create a shapeFile with geometry-errors Assert.notNull(job.getFinishTime(), "The job has no endTime; it's not applicable to create a shapeFile with geometry-errors"); File zipFile = DownloadUtils.createZipFile(sessionId, job.getDatasetType().getNaam(), job.getFinishTime()); if(!zipFile.exists()){ // Create FeatureCollection SimpleFeatureCollection featureCollection = featureCollectionFactory.createFeatureCollection(job); // Create shape file shapeFileGenerator.createZippedShapeFile(featureCollection, zipFile); } Assert.isTrue(zipFile.exists()); FileInputStream zipFileInputStream = null; try { // Set contenttype httpServletResponse.setContentType("application/zip"); httpServletResponse.setHeader("Content-Disposition", "attachment; filename="+zipFile.getName()); // get your file as InputStream zipFileInputStream = new FileInputStream(zipFile); // copy it to response's OutputStream IOUtils.copy(zipFileInputStream, httpServletResponse.getOutputStream()); httpServletResponse.flushBuffer(); } catch (IOException ioe) { throw new RuntimeException("IOError writing file to output stream"); } finally { if(zipFileInputStream != null){ try { zipFileInputStream.close(); } catch (IOException ioe) { logger.warn("Not be able to close FileInputStream", ioe); } } } } public ManagerDao getManagerDao() { return managerDao; } public void setManagerDao(ManagerDao managerDao) { this.managerDao = managerDao; } public ShapeFileGenerator getShapeFileGenerator() { return shapeFileGenerator; } public void setShapeFileGenerator(ShapeFileGenerator shapeFileGenerator) { this.shapeFileGenerator = shapeFileGenerator; } public FeatureCollectionFactory getFeatureCollectionFactory() { return featureCollectionFactory; } public void setFeatureCollectionFactory( FeatureCollectionFactory featureCollectionFactory) { this.featureCollectionFactory = featureCollectionFactory; } }