annotate src/HumanEchoServlet.java @ 67:b8f8ed1ef8dd tip

Provide .wav suffix in delivered filename
author Chris Cannam
date Tue, 30 Sep 2014 16:52:50 +0100
parents 21bab43ae2c1
children
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@62 134 String target = outdir + File.separator + 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@62 143 String tempDir = outdir + File.separator + 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@62 170 File createdFile = new File(tempDir + File.separator + 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");
Chris@67 201 response.addHeader("Content-Disposition","attachment; filename=" + outputfname + ".wav");
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 }