Mercurial > hg > human-echolocation-java-webapp
changeset 60:b3f3b42b9933
Cache generated files. The files are now generated into distinct subdirectories and moved into the main directory before being returned to the client.
author | Chris Cannam |
---|---|
date | Thu, 27 Mar 2014 17:35:18 +0000 |
parents | 0546154fab7a |
children | c3d749d029ee |
files | src/HumanEchoServlet.java |
diffstat | 1 files changed, 85 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/src/HumanEchoServlet.java Thu Mar 13 16:25:10 2014 +0000 +++ b/src/HumanEchoServlet.java Thu Mar 27 17:35:18 2014 +0000 @@ -15,6 +15,10 @@ import java.io.BufferedInputStream; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + import org.apache.log4j.Logger; import javax.servlet.*; @@ -36,6 +40,8 @@ private String outdir = ""; private String indir = ""; + private static Integer dirId = 0; + public void init(ServletConfig config) throws ServletException { super.init(config); @@ -83,6 +89,11 @@ } } + protected synchronized String getDirToken() { + dirId = dirId + 1; + return dirId.toString(); + } + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.info("In doGet"); @@ -91,55 +102,90 @@ // 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")); - Double azim = Double.parseDouble(request.getParameter("azim")); - - String orientation = request.getParameter("orient"); - - Double dirweight = Double.parseDouble(request.getParameter("dirweight")); + logger.info("Got parameters"); MWStructArray Input = null; String outputfname = new String(); - logger.info("Got parameters"); + // this needs to be distinct for the parameters + StringBuilder sb = new StringBuilder(); - try { - logger.info("Property catalina.base is " + System.getProperty("catalina.base")); + sb.append("e_d"); + sb.append(dist); + sb.append("_a"); + sb.append(azim); - // Matlab structure: - // Input = struct('dist', 0.9, 'azim', 0, 'orient', 'horz', 'dirweight', 0.2, 'outdir', '/tmp/wav', 'outname', 'foo.wav', 'indir', '/path/to/hrir') + if (orientation.equals("horz")) { + sb.append("_H"); + } else if (orientation.equals("angled")) { + sb.append("_A"); + } - String[] InputStructFields = { - "dist", "azim", "orient", "dirweight", - "outdir", "outname", "indir" - }; + sb.append("_w"); + sb.append(dirweight); - 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); + outputfname = sb.toString(); - // 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(); + String target = outdir + "/" + outputfname + ".wav"; + File targetFile = new File(target); + targetFile.deleteOnExit(); - Input.set("outname", 1, outputfname); + if (!targetFile.exists()) { - // 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(); - } + try { + logger.info("Property catalina.base is " + System.getProperty("catalina.base")); + + String tempDir = outdir + "/" + getDirToken(); + File tempDirFilePath = new File(tempDir); + tempDirFilePath.mkdirs(); + + // 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, tempDir); + Input.set("indir", 1, indir); + + Input.set("outname", 1, outputfname); + + Object[] result = echo.simulateBinauralSignals(Input); + + File createdFile = new File(tempDir + "/" + outputfname + ".wav"); + if (!createdFile.exists()) { + String err = "The simulateBinauralSignals call failed to create expected output file \"" + createdFile + "\""; + logger.error(err); + throw new ServletException(err); + } + + Files.move(createdFile.toPath(), + targetFile.toPath(), + StandardCopyOption.ATOMIC_MOVE); + + tempDirFilePath.delete(); + + } catch (MWException e) { + logger.error("Failed to calculate simulateBinauralSignals: " + e.getMessage()); + e.printStackTrace(); + throw new ServletException(e.getMessage()); + } + } // Creating the stream ServletOutputStream stream = null; @@ -148,17 +194,14 @@ try{ stream = response.getOutputStream(); - String filename = outdir + "/" + outputfname + ".wav"; - logger.info("About to read WAV data from \"" + filename + "\""); - - File wavfile = new File(filename); + logger.info("About to read WAV data from \"" + target + "\""); //set response headers response.setContentType("audio/x-wav"); response.addHeader("Content-Disposition","attachment; filename=" + outputfname ); - response.setContentLength( (int) wavfile.length( ) ); + response.setContentLength( (int) targetFile.length( ) ); - FileInputStream input = new FileInputStream(wavfile); + FileInputStream input = new FileInputStream(targetFile); buf = new BufferedInputStream(input); int b = 0;