Package eu.planets_project.tb.gui.backing

Source Code of eu.planets_project.tb.gui.backing.DownloadManager

/*******************************************************************************
* 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();
            }
        }
    }

}
TOP

Related Classes of eu.planets_project.tb.gui.backing.DownloadManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.