package com.xenoage.zong.webserver.actions;
import static com.xenoage.zong.webserver.util.Database.stmt;
import static com.xenoage.zong.webserver.util.Database.unixTime;
import java.io.IOException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.http.HttpServletResponse;
import com.xenoage.zong.webserver.Webserver;
import com.xenoage.zong.webserver.model.requests.AudioRequest;
import com.xenoage.zong.webserver.model.requests.Request;
/**
* Responds to an {@link AudioRequest}.
*
* @author Andreas Wenger
*/
public class AudioAction
extends RetryAction {
@Override public boolean performTry(Request request, Webserver server, HttpServletResponse response)
throws SQLException, IOException {
AudioRequest audioRequest = getAs(AudioRequest.class, request);
Connection db = server.getDBConnection();
//get ID of document
PreparedStatement stmtID = stmt(db, "SELECT id FROM docs WHERE public_id = ?", audioRequest.id);
ResultSet resID = stmtID.executeQuery();
if (!resID.next()) {
stmtID.close();
return false;
}
int docID = resID.getInt(1);
stmtID.close();
//deliver audio data
PreparedStatement stmtAudio = stmt(db, "SELECT audio FROM audio WHERE doc_id = ?"
+ " AND format = ?", docID, audioRequest.format);
ResultSet resAudio = stmtAudio.executeQuery();
if (!resAudio.next()) {
stmtAudio.close();
return false;
}
Blob blob = resAudio.getBlob(1);
byte[] imageData = blob.getBytes(1, (int) blob.length());
stmtAudio.close();
//header
response.setHeader("Content-Type", (audioRequest.format.equals("OGG") ? "application/ogg"
: "audio/mpeg"));
response.setHeader("Content-Disposition", "attachment; filename=\"" + audioRequest.id +
(audioRequest.format.equals("OGG") ? ".ogg" : ".mp3") + "\"");
//data
response.getOutputStream().write(imageData);
//update access time
PreparedStatement stmtTime = stmt(db, "UPDATE docs SET last_access = ? WHERE id = ?",
unixTime(), docID);
stmtTime.executeUpdate();
stmtTime.close();
return true;
}
}