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;