Mercurial > hg > human-echolocation-java-webapp
view src/HumanEchoServlet.java @ 51:ebfb3b91fb06
Various invocation fixes, plus updated isvr.jar
author | Chris Cannam |
---|---|
date | Fri, 28 Feb 2014 16:13:29 +0000 |
parents | 398a53b30079 |
children | b27106b380d8 |
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); logger.info("In init"); logger.info("java.library.path is " + System.getProperty("java.library.path")); try { // Read directory properties Properties properties = new Properties(); properties.load (Thread.currentThread().getContextClassLoader(). getResourceAsStream("HumanEcho.properties")); wavdir = properties.getProperty("outdir"); logger.info("WAV file directory is " + wavdir); } 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"); // 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(); logger.info("Got dist and azim"); try { //!!! erch, shouldn't be creating a new one on each request as well as a global one echo = new HumanEcho(); 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') String[] InputStructFields = {"dist", "azim", "orient", "dirweight", "outdir", "outname"}; 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) { logger.error("Failed to calculate simulateBinauralSignals: " + e.getMessage()); 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){ logger.error("Failed to read wav data: " + ioe.getMessage()); 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); } }