package org.wahlzeit.servlets;
import com.google.appengine.api.images.Image;
import org.apache.http.HttpStatus;
import org.wahlzeit.model.Photo;
import org.wahlzeit.model.PhotoManager;
import org.wahlzeit.model.PhotoSize;
import org.wahlzeit.model.persistence.ImageStorage;
import org.wahlzeit.services.LogBuilder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Serializable;
import java.util.logging.Logger;
/**
* Servlet that returns static data like the Photos to the user.
*
* As there are several links for each Photo, this can not the handled via the MainServlet, which has a unique link for
* each Handler. Instead web.xml redirects all static requests to this Servlet.
*
* @review
*/
public class StaticDataServlet extends AbstractServlet {
Logger log = Logger.getLogger(StaticDataServlet.class.getName());
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
String type = request.getParameter("type");
String photoId = request.getParameter("photoId");
String sizeString = request.getParameter("size");
int size = Integer.valueOf(sizeString);
log.info(LogBuilder.createSystemMessage().
addAction("Provide static resource").
addParameter("type", type).
addParameter("photoId", photoId).
addParameter("size", size).toString());
if ("image".equals(type)) {
Image image = getImage(photoId, size);
if (image != null) {
response.getOutputStream().write(image.getImageData());
response.getOutputStream().flush();
response.setStatus(HttpStatus.SC_OK);
} else {
log.warning(LogBuilder.createSystemMessage().addMessage("image not found").toString());
response.setStatus(HttpStatus.SC_NOT_FOUND);
}
} else {
log.warning(LogBuilder.createSystemMessage().
addMessage("unimplemented static resource type has been requested").toString());
response.setStatus(HttpStatus.SC_NOT_IMPLEMENTED);
}
} catch (Exception e) {
log.severe(LogBuilder.createSystemMessage().addException("Problem when loading image", e).toString());
}
}
/**
* @methodtype command
*
* Loads image either from the <@link>PhotoManager</@link> or from the <@link>ImageStorage</@link>. If image does
* not exist, null is returned.
*/
private Image getImage(String photoId, int size) {
Image image = null;
Photo photo = PhotoManager.getInstance().getPhoto(photoId);
if (photo != null) {
PhotoSize photoSize = PhotoSize.getFromInt(size);
image = photo.getImage(photoSize);
}
// if not in cache load from Google Cloud Storage
if (image == null) {
Serializable rawImage = null;
try {
rawImage = ImageStorage.getInstance().readImage(photoId, size);
} catch (IOException e) {
log.warning(LogBuilder.createSystemMessage().addException("Problem when reading image.", e).toString());
}
if (rawImage != null && rawImage instanceof Image) {
image = (Image) rawImage;
}
}
return image;
}
}