/*
* Sone - ReloadingPage.java - Copyright © 2010–2016 David Roden
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.pterodactylus.sone.web;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import net.pterodactylus.util.io.Closer;
import net.pterodactylus.util.io.StreamCopier;
import net.pterodactylus.util.web.Page;
import net.pterodactylus.util.web.Request;
import net.pterodactylus.util.web.Response;
/**
* {@link Page} implementation that delivers static files from the filesystem.
*
* @param <REQ>
* The type of the request
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
public class ReloadingPage<REQ extends Request> implements Page<REQ> {
private final String pathPrefix;
private final String filesystemPath;
private final String mimeType;
public ReloadingPage(String pathPrefix, String filesystemPathPrefix, String mimeType) {
this.pathPrefix = pathPrefix;
this.filesystemPath = filesystemPathPrefix;
this.mimeType = mimeType;
}
/**
* {@inheritDoc}
*/
@Override
public String getPath() {
return pathPrefix;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isPrefixPage() {
return true;
}
/**
* {@inheritDoc}
*/
@Override
public Response handleRequest(REQ request, Response response) throws IOException {
String path = request.getUri().getPath();
int lastSlash = path.lastIndexOf('/');
String filename = path.substring(lastSlash + 1);
InputStream fileInputStream;
try {
fileInputStream = new FileInputStream(new File(filesystemPath, filename));
} catch (FileNotFoundException fnfe1) {
return response.setStatusCode(404).setStatusText("Not found.");
}
OutputStream contentOutputStream = response.getContent();
try {
StreamCopier.copy(fileInputStream, contentOutputStream);
} finally {
Closer.close(fileInputStream);
Closer.close(contentOutputStream);
}
return response.setStatusCode(200).setStatusText("OK").setContentType(mimeType);
}
}