view src/HumanEchoServlet.java @ 54:b27106b380d8

Populate and pass location of input dir; handle all parameters from page; use only one echo instance (??)
author Chris Cannam
date Mon, 03 Mar 2014 15:31:14 +0000
parents ebfb3b91fb06
children b3f3b42b9933
line wrap: on
line source
/*
 * HumanEchoServlet
 *
 * Version information
 *
 * 3 December 2013
 *
 * Copyright notice
 */

import java.util.Properties;
import java.io.IOException;

import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.File;

import org.apache.log4j.Logger;

import javax.servlet.*;
import javax.servlet.http.*;

import com.mathworks.toolbox.javabuilder.MWJavaObjectRef;
import com.mathworks.toolbox.javabuilder.MWNumericArray;
import com.mathworks.toolbox.javabuilder.MWStructArray;
import com.mathworks.toolbox.javabuilder.MWException;
import com.mathworks.toolbox.javabuilder.internal.MCRConfiguration;

import uk.ac.soton.isvr.*;

public class HumanEchoServlet extends HttpServlet {

    private HumanEcho echo;
    private static Logger logger = Logger.getLogger(HumanEchoServlet.class);

    private String outdir = "";
    private String indir = "";

    public void init(ServletConfig config) throws ServletException {
        super.init(config);

	logger.info("In init");

	logger.info("java.library.path is " + 
		     System.getProperty("java.library.path"));

        try {
            Properties properties = new Properties();
            properties.load
		(Thread.currentThread().getContextClassLoader().
		 getResourceAsStream("HumanEcho.properties"));

            outdir = properties.getProperty("outdir");
            indir = properties.getProperty("indir");

	    logger.info("WAV file directory is " + outdir);

        } catch (Exception e) {
	    logger.error("Failed to load app properties: " + e.getMessage());
            e.printStackTrace();
        }

        try {
	    // Test that we can construct one of the MATLAB objects
	    
	    long before = System.currentTimeMillis();
            echo = new HumanEcho();
	    long after = System.currentTimeMillis();
	    logger.info("Created a HumanEcho object: it took " + (after - before) + " ms");
        } catch (MWException e) {
	    logger.error("Failed to construct HumanEcho object: " + e.getMessage());
            e.printStackTrace();
        }

	logger.info("Init completed");
    }

    public void destroy() {
        super.destroy();

        if (echo != null) {
            echo.dispose();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	logger.info("In doGet");

        logger.info("Distance (as string) is: " + request.getParameter("dist"));

        // todo: validate/normalise distance
        Double dist = Double.parseDouble(request.getParameter("dist"));

	Double azim = Double.parseDouble(request.getParameter("azim"));

	String orientation = request.getParameter("orient");

	Double dirweight = Double.parseDouble(request.getParameter("dirweight"));

        MWStructArray Input = null;

        String outputfname = new String();

	logger.info("Got parameters");

        try {
            logger.info("Property catalina.base is " + System.getProperty("catalina.base"));

            // Matlab structure:
            // Input = struct('dist', 0.9, 'azim', 0, 'orient', 'horz', 'dirweight', 0.2, 'outdir', '/tmp/wav', 'outname', 'foo.wav', 'indir', '/path/to/hrir')

            String[] InputStructFields = {
		"dist", "azim", "orient", "dirweight",
		"outdir", "outname", "indir" 
	    };

            Input = new MWStructArray(1, 1, InputStructFields);
            Input.set("dist", 1, Double.valueOf(dist));
            Input.set("azim", 1, Double.valueOf(azim));
            Input.set("orient", 1, orientation);
            Input.set("dirweight", 1, Double.valueOf(dirweight));
	    Input.set("outdir", 1, outdir);
	    Input.set("indir", 1, indir);

            // the ofname should depend on the parameters
            StringBuilder sb = new StringBuilder();
            sb.append("e_d");
            sb.append(dist);
            sb.append("_a");
            sb.append(azim);
            outputfname = sb.toString();

            Input.set("outname", 1, outputfname);

            // todo: before calling should test if wav already exists..
            Object[] result = echo.simulateBinauralSignals(Input);
        }
        catch(MWException e) {
	    logger.error("Failed to calculate simulateBinauralSignals: " + e.getMessage());
            e.printStackTrace();
        }

        // Creating the stream
        ServletOutputStream stream = null;
        BufferedInputStream buf = null;

        try{
            stream = response.getOutputStream();

	    String filename = outdir + "/" + outputfname + ".wav";
	    logger.info("About to read WAV data from \"" + filename + "\"");

            File wavfile = new File(filename);

            //set response headers
            response.setContentType("audio/x-wav");
            response.addHeader("Content-Disposition","attachment; filename=" + outputfname );
            response.setContentLength( (int) wavfile.length( ) );

            FileInputStream input = new FileInputStream(wavfile);
            buf = new BufferedInputStream(input);

            int b = 0;
	    int total = 0;

            // read from the file; write to the ServletOutputStream
            while ((b = buf.read()) != -1) {
                stream.write(b);
		total += 1;
	    }

	    logger.info("Successfully wrote " + total + " byte(s) to client");

        } catch (IOException ioe){
	    logger.error("Failed to read wav data: " + ioe.getMessage());
            throw new ServletException(ioe.getMessage( ));
        } finally {
            if (stream != null) stream.close();
            if (buf != null) buf.close();
	}
    }
}