2 * DemosceneMusic - DownloadServlet.java - Copyright © 2012 David Roden
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package net.pterodactylus.demoscenemusic.core;
21 import java.io.FileInputStream;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.io.OutputStream;
26 import javax.servlet.ServletException;
27 import javax.servlet.http.HttpServlet;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
31 import net.pterodactylus.demoscenemusic.data.Artist;
32 import net.pterodactylus.demoscenemusic.data.Track;
33 import net.pterodactylus.demoscenemusic.data.TrackDerivative;
34 import net.pterodactylus.demoscenemusic.utils.AudioCodecs;
35 import net.pterodactylus.util.database.DatabaseException;
36 import net.pterodactylus.util.io.Closer;
37 import net.pterodactylus.util.io.StreamCopier;
40 * {@link HttpServlet} that lets the user download a track.
42 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
44 public class DownloadServlet extends HttpServlet {
50 protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
51 Core core = (Core) getServletContext().getAttribute("core");
53 String derivativeId = httpServletRequest.getParameter("id");
54 TrackDerivative derivative = core.getDataManager().getTrackDerivativeById(derivativeId);
55 Track track = core.getDataManager().getTrackByDerivativeId(derivativeId);
56 /* TODO - checking. */
58 /* create name of file. */
59 StringBuilder filename = new StringBuilder();
60 for (Artist artist : track.getArtists()) {
61 if (filename.length() > 0) {
62 filename.append(" & ");
64 filename.append(artist.getName());
66 filename.append(" - ");
67 filename.append(track.getName());
68 if (track.getRemix() != null) {
69 filename.append(" (");
70 filename.append(track.getRemix());
73 filename.append('.').append(derivative.getProperties().get("file/extension"));
75 /* prepare response. */
76 File file = core.getDataDirectory().getFile(derivativeId);
77 httpServletResponse.addHeader("Content-Disposition", "attachment; filename=" + filename.toString());
78 httpServletResponse.setContentType(AudioCodecs.codecDescriptions.get(derivative.getProperties().get("audio/codec")).mimeType);
79 httpServletResponse.setContentLength((int) file.length());
80 httpServletResponse.setStatus(HttpServletResponse.SC_OK);
83 OutputStream servletOutputStream = httpServletResponse.getOutputStream();
84 InputStream fileInputStream = new FileInputStream(file);
86 StreamCopier.copy(fileInputStream, servletOutputStream);
88 Closer.close(fileInputStream);
89 Closer.close(servletOutputStream);
92 } catch (DatabaseException de1) {
93 throw new RuntimeException("Could not load derivative.", de1);