Java tutorial
/******************************************************************************* * Copyright (c) 2007, 2010 The Planets Project Partners. * * All rights reserved. This program and the accompanying * materials are made available under the terms of the * Apache License, Version 2.0 which accompanies * this distribution, and is available at * http://www.apache.org/licenses/LICENSE-2.0 * *******************************************************************************/ /** * */ package eu.planets_project.tb.gui.backing; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Collection; import javax.activation.MimetypesFileTypeMap; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import eu.planets_project.tb.api.TestbedManager; import eu.planets_project.tb.api.model.Experiment; import eu.planets_project.tb.gui.util.JSFUtil; import eu.planets_project.tb.impl.model.ExperimentImpl; import eu.planets_project.tb.impl.serialization.ExperimentFileCache; /** * @author <a href="mailto:Andrew.Jackson@bl.uk">Andy Jackson</a> * */ public class DownloadManager { private static Log log = LogFactory.getLog(DownloadManager.class); /** * */ private static ExperimentFileCache expCache = new ExperimentFileCache(); /** * * @return */ public String downloadExperiment(Long expID) { if (expID == null) return "experimentNotFound"; TestbedManager testbedMan = (TestbedManager) JSFUtil.getManagedObject("TestbedManager"); Experiment exp = testbedMan.getExperiment(expID); return downloadExperiment((ExperimentImpl) exp); } /** * * @param exp * @return */ public String downloadExperiment(ExperimentImpl exp) { String expExportID = expCache.createExperimentExport(exp); return downloadExportedExperiment(expExportID, exp.getExperimentSetup().getBasicProperties().getExperimentName()); } /** * * @return * @throws IOException */ public String downloadExportedExperiment(String expExportID, String downloadName) { FacesContext ctx = FacesContext.getCurrentInstance(); // Decode the file name (might contain spaces and on) and prepare file object. try { expExportID = URLDecoder.decode(expExportID, "UTF-8"); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return null; } File file = expCache.getExportedFile(expExportID); HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse(); // Check if file exists and can be read: if (!file.exists() || !file.isFile() || !file.canRead()) { return "fileNotFound"; } // Get content type by filename. String contentType = new MimetypesFileTypeMap().getContentType(file); // If content type is unknown, then set the default value. // For all content types, see: http://www.w3schools.com/media/media_mimeref.asp if (contentType == null) { contentType = "application/octet-stream"; } // Prepare streams. BufferedInputStream input = null; BufferedOutputStream output = null; try { // Open the file: input = new BufferedInputStream(new FileInputStream(file)); int contentLength = input.available(); // Initialise the servlet response: response.reset(); response.setContentType(contentType); response.setContentLength(contentLength); response.setHeader("Content-disposition", "attachment; filename=\"" + downloadName + ".xml\""); output = new BufferedOutputStream(response.getOutputStream()); // Write file out: for (int data; (data = input.read()) != -1;) { output.write(data); } // Flush the stream: output.flush(); // Tell Faces that we're finished: ctx.responseComplete(); } catch (IOException e) { // Something went wrong? e.printStackTrace(); } finally { // Gently close streams. close(output); close(input); } return "success"; } /** * Exports all exps as one big file. * * @param allExps * @return */ public String downloadAllExperiments(Collection<Experiment> allExps) { String expExportID = expCache.createExperimentsExport(allExps); log.info("Cached all experiments in: " + expExportID); Calendar date = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); return downloadExportedExperiment(expExportID, "all-experiments-" + df.format(date.getTime())); } // Helpers (can be refactored to public utility class) ---------------------------------------- private static void close(Closeable resource) { if (resource != null) { try { resource.close(); } catch (IOException e) { // Do your thing with the exception. Print it, log it or mail it. e.printStackTrace(); } } } }