annotate src/HumanEchoServlet.java @ 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 b27106b380d8
children 21bab43ae2c1
rev   line source
luis@16 1 /*
luis@28 2 * HumanEchoServlet
luis@16 3 *
luis@16 4 * Version information
luis@16 5 *
luis@16 6 * 3 December 2013
luis@16 7 *
luis@16 8 * Copyright notice
luis@16 9 */
luis@15 10
luis@15 11 import java.util.Properties;
luis@15 12 import java.io.IOException;
luis@15 13
luis@28 14 import java.io.FileInputStream;
luis@28 15 import java.io.BufferedInputStream;
luis@28 16 import java.io.File;
luis@28 17
Chris@60 18 import java.nio.file.Files;
Chris@60 19 import java.nio.file.Path;
Chris@60 20 import java.nio.file.StandardCopyOption;
Chris@60 21
luis@21 22 import org.apache.log4j.Logger;
luis@16 23
luis@28 24 import javax.servlet.*;
luis@28 25 import javax.servlet.http.*;
luis@0 26
luis@0 27 import com.mathworks.toolbox.javabuilder.MWJavaObjectRef;
luis@0 28 import com.mathworks.toolbox.javabuilder.MWNumericArray;
luis@11 29 import com.mathworks.toolbox.javabuilder.MWStructArray;
luis@0 30 import com.mathworks.toolbox.javabuilder.MWException;
luis@15 31 import com.mathworks.toolbox.javabuilder.internal.MCRConfiguration;
luis@15 32
luis@15 33 import uk.ac.soton.isvr.*;
luis@0 34
luis@0 35 public class HumanEchoServlet extends HttpServlet {
Chris@54 36
luis@0 37 private HumanEcho echo;
luis@28 38 private static Logger logger = Logger.getLogger(HumanEchoServlet.class);
luis@0 39
Chris@54 40 private String outdir = "";
Chris@54 41 private String indir = "";
luis@16 42
Chris@60 43 private static Integer dirId = 0;
Chris@60 44
luis@0 45 public void init(ServletConfig config) throws ServletException {
luis@0 46 super.init(config);
luis@0 47
Chris@51 48 logger.info("In init");
Chris@42 49
Chris@51 50 logger.info("java.library.path is " +
Chris@42 51 System.getProperty("java.library.path"));
Chris@42 52
luis@15 53 try {
luis@15 54 Properties properties = new Properties();
Chris@42 55 properties.load
Chris@42 56 (Thread.currentThread().getContextClassLoader().
Chris@51 57 getResourceAsStream("HumanEcho.properties"));
luis@15 58
Chris@54 59 outdir = properties.getProperty("outdir");
Chris@54 60 indir = properties.getProperty("indir");
luis@15 61
Chris@54 62 logger.info("WAV file directory is " + outdir);
Chris@42 63
Chris@51 64 } catch (Exception e) {
Chris@51 65 logger.error("Failed to load app properties: " + e.getMessage());
luis@15 66 e.printStackTrace();
luis@15 67 }
luis@15 68
luis@0 69 try {
Chris@42 70 // Test that we can construct one of the MATLAB objects
Chris@42 71
Chris@42 72 long before = System.currentTimeMillis();
luis@0 73 echo = new HumanEcho();
Chris@42 74 long after = System.currentTimeMillis();
Chris@51 75 logger.info("Created a HumanEcho object: it took " + (after - before) + " ms");
Chris@42 76 } catch (MWException e) {
Chris@51 77 logger.error("Failed to construct HumanEcho object: " + e.getMessage());
luis@0 78 e.printStackTrace();
luis@0 79 }
Chris@51 80
Chris@51 81 logger.info("Init completed");
luis@0 82 }
luis@0 83
luis@0 84 public void destroy() {
luis@0 85 super.destroy();
luis@0 86
Chris@42 87 if (echo != null) {
luis@0 88 echo.dispose();
luis@0 89 }
luis@0 90 }
luis@0 91
Chris@60 92 protected synchronized String getDirToken() {
Chris@60 93 dirId = dirId + 1;
Chris@60 94 return dirId.toString();
Chris@60 95 }
Chris@60 96
luis@11 97 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
luis@0 98
Chris@51 99 logger.info("In doGet");
Chris@47 100
Chris@54 101 logger.info("Distance (as string) is: " + request.getParameter("dist"));
Chris@54 102
luis@11 103 // todo: validate/normalise distance
Chris@54 104 Double dist = Double.parseDouble(request.getParameter("dist"));
Chris@60 105 Double azim = Double.parseDouble(request.getParameter("azim"));
Chris@60 106 String orientation = request.getParameter("orient");
Chris@60 107 Double dirweight = Double.parseDouble(request.getParameter("dirweight"));
luis@38 108
Chris@60 109 logger.info("Got parameters");
luis@38 110
luis@11 111 MWStructArray Input = null;
luis@0 112
luis@28 113 String outputfname = new String();
luis@28 114
Chris@60 115 // this needs to be distinct for the parameters
Chris@60 116 StringBuilder sb = new StringBuilder();
Chris@42 117
Chris@60 118 sb.append("e_d");
Chris@60 119 sb.append(dist);
Chris@60 120 sb.append("_a");
Chris@60 121 sb.append(azim);
luis@16 122
Chris@60 123 if (orientation.equals("horz")) {
Chris@60 124 sb.append("_H");
Chris@60 125 } else if (orientation.equals("angled")) {
Chris@60 126 sb.append("_A");
Chris@60 127 }
luis@0 128
Chris@60 129 sb.append("_w");
Chris@60 130 sb.append(dirweight);
Chris@47 131
Chris@60 132 outputfname = sb.toString();
Chris@46 133
Chris@60 134 String target = outdir + "/" + outputfname + ".wav";
Chris@60 135 File targetFile = new File(target);
Chris@60 136 targetFile.deleteOnExit();
luis@11 137
Chris@60 138 if (!targetFile.exists()) {
luis@11 139
Chris@60 140 try {
Chris@60 141 logger.info("Property catalina.base is " + System.getProperty("catalina.base"));
Chris@60 142
Chris@60 143 String tempDir = outdir + "/" + getDirToken();
Chris@60 144 File tempDirFilePath = new File(tempDir);
Chris@60 145 tempDirFilePath.mkdirs();
Chris@60 146
Chris@60 147 // Matlab structure:
Chris@60 148 //
Chris@60 149 // Input = struct('dist', 0.9, 'azim', 0, 'orient',
Chris@60 150 // 'horz', 'dirweight', 0.2, 'outdir', '/tmp/wav',
Chris@60 151 // 'outname', 'foo.wav', 'indir', '/path/to/hrir')
Chris@60 152
Chris@60 153 String[] InputStructFields = {
Chris@60 154 "dist", "azim", "orient", "dirweight",
Chris@60 155 "outdir", "outname", "indir"
Chris@60 156 };
Chris@60 157
Chris@60 158 Input = new MWStructArray(1, 1, InputStructFields);
Chris@60 159 Input.set("dist", 1, Double.valueOf(dist));
Chris@60 160 Input.set("azim", 1, Double.valueOf(azim));
Chris@60 161 Input.set("orient", 1, orientation);
Chris@60 162 Input.set("dirweight", 1, Double.valueOf(dirweight));
Chris@60 163 Input.set("outdir", 1, tempDir);
Chris@60 164 Input.set("indir", 1, indir);
Chris@60 165
Chris@60 166 Input.set("outname", 1, outputfname);
Chris@60 167
Chris@60 168 Object[] result = echo.simulateBinauralSignals(Input);
Chris@60 169
Chris@60 170 File createdFile = new File(tempDir + "/" + outputfname + ".wav");
Chris@60 171 if (!createdFile.exists()) {
Chris@60 172 String err = "The simulateBinauralSignals call failed to create expected output file \"" + createdFile + "\"";
Chris@60 173 logger.error(err);
Chris@60 174 throw new ServletException(err);
Chris@60 175 }
Chris@60 176
Chris@60 177 Files.move(createdFile.toPath(),
Chris@60 178 targetFile.toPath(),
Chris@60 179 StandardCopyOption.ATOMIC_MOVE);
Chris@60 180
Chris@60 181 tempDirFilePath.delete();
Chris@60 182
Chris@60 183 } catch (MWException e) {
Chris@60 184 logger.error("Failed to calculate simulateBinauralSignals: " + e.getMessage());
Chris@60 185 e.printStackTrace();
Chris@60 186 throw new ServletException(e.getMessage());
Chris@60 187 }
Chris@60 188 }
luis@0 189
luis@28 190 // Creating the stream
luis@28 191 ServletOutputStream stream = null;
luis@28 192 BufferedInputStream buf = null;
luis@28 193
luis@28 194 try{
luis@28 195 stream = response.getOutputStream();
Chris@54 196
Chris@60 197 logger.info("About to read WAV data from \"" + target + "\"");
luis@28 198
luis@28 199 //set response headers
luis@32 200 response.setContentType("audio/x-wav");
luis@28 201 response.addHeader("Content-Disposition","attachment; filename=" + outputfname );
Chris@60 202 response.setContentLength( (int) targetFile.length( ) );
luis@28 203
Chris@60 204 FileInputStream input = new FileInputStream(targetFile);
luis@28 205 buf = new BufferedInputStream(input);
luis@28 206
Chris@54 207 int b = 0;
Chris@54 208 int total = 0;
Chris@54 209
Chris@54 210 // read from the file; write to the ServletOutputStream
Chris@54 211 while ((b = buf.read()) != -1) {
Chris@54 212 stream.write(b);
Chris@54 213 total += 1;
Chris@54 214 }
Chris@54 215
Chris@54 216 logger.info("Successfully wrote " + total + " byte(s) to client");
luis@28 217
luis@28 218 } catch (IOException ioe){
Chris@51 219 logger.error("Failed to read wav data: " + ioe.getMessage());
luis@28 220 throw new ServletException(ioe.getMessage( ));
luis@28 221 } finally {
Chris@54 222 if (stream != null) stream.close();
Chris@54 223 if (buf != null) buf.close();
Chris@54 224 }
luis@0 225 }
luis@0 226 }