view src/HumanEchoServlet.java @ 46:84d02afe28e6

Supply dirname and filename separately
author Chris Cannam
date Fri, 28 Feb 2014 13:41:45 +0000
parents 65a26b38bf43
children 398a53b30079
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 wavdir = "";

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

	System.err.println("In init");

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

        try {
	    // Read directory properties
            Properties properties = new Properties();
            properties.load
		(Thread.currentThread().getContextClassLoader().
		 getResourceAsStream("myapp.properties"));

            wavdir = properties.getProperty("outdir");

	    System.err.println("WAV file directory is " + wavdir);

        } catch (IOException e) {
            e.printStackTrace();
        }

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

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

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

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

        // todo: validate/normalise distance
        int dist = Integer.parseInt(request.getParameter("dist"));

        logger.info("String azim is: " + request.getParameter("azim"));
        Float azim = Float.parseFloat(request.getParameter("azim"));

        MWStructArray Input = null;
        HumanEcho echo;

        String outputfname = new String();

	System.err.println("In doGet");

        try {
	    //!!! erch, shouldn't be creating a new one on each request as well as a global one
            echo = new HumanEcho();

            logger.error("We are logging!");
            logger.warn(System.getProperty("catalina.base"));

	    System.err.println("Done some logging");
            System.err.println(System.getProperty("catalina.base"));

            // Matlab structure:
            // Input = struct('dist', 0.9, 'azim', 0, 'orient', 'horz', 'dirweight', 0.2, 'outputfname', 'foo.wav')

            String[] InputStructFields = {"dist", "azim", "orient", "dirweight", "outputfname"};
            Input = new MWStructArray(1, 1, InputStructFields);
            Input.set("dist", 1, Double.valueOf(dist));
            Input.set("azim", 1, Double.valueOf(azim));
            Input.set("orient", 1, "horz");
            Input.set("dirweight", 1, Double.valueOf(0.2));

	    Input.set("outdir", 1, wavdir);

            // 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) {
            e.printStackTrace();
        }

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

        try{
            stream = response.getOutputStream();
            File wavfile = new File(outputfname);

            //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 readBytes = 0;

            //read from the file; write to the ServletOutputStream
            while((readBytes = buf.read( )) != -1)
                stream.write(readBytes);

        } catch (IOException ioe){
            throw new ServletException(ioe.getMessage( ));
        } finally {
            //close the input/output streams
            if(stream != null)
                stream.close( );

            if(buf != null)
                buf.close( );
          }

        logger.info("Wrote file:" + outputfname);
    }
}