package in.partake.controller.action.image;
import in.partake.base.ImageUtil;
import in.partake.base.PartakeException;
import in.partake.base.TimeUtil;
import in.partake.controller.action.AbstractPartakeAction;
import in.partake.model.IPartakeDAOs;
import in.partake.model.access.DBAccess;
import in.partake.model.access.Transaction;
import in.partake.model.dao.DAOException;
import in.partake.model.dao.PartakeConnection;
import in.partake.model.dto.UserImage;
import in.partake.model.dto.UserThumbnail;
import in.partake.resource.ServerErrorCode;
import in.partake.resource.UserErrorCode;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import play.mvc.Result;
public class ThumbnailAction extends AbstractPartakeAction {
static final String IMAGE_ID_PARAM_NAME = "imageId";
private final String imageId;
public ThumbnailAction(String imageId) {
this.imageId = imageId;
}
public static Result get(String imageId) throws DAOException, PartakeException {
return new ThumbnailAction(imageId).execute();
}
public Result doExecute() throws DAOException, PartakeException {
checkIdParameterIsValid(imageId, UserErrorCode.INVALID_NOTFOUND, UserErrorCode.INVALID_NOTFOUND);
UserThumbnail data = new ThumbnailAccess(imageId).execute();
if (data != null)
return render(data.getData(), data.getType(), "inline");
// If not found, we will generate a thumbnail.
UserThumbnail created = new ThumbnailTransaction(imageId).execute();
if (created != null)
return render(created.getData(), created.getType(), "inline");
return renderNotFound();
}
}
class ThumbnailAccess extends DBAccess<UserThumbnail> {
private String imageId;
public ThumbnailAccess(String imageId) {
this.imageId = imageId;
}
@Override
protected UserThumbnail doExecute(PartakeConnection con, IPartakeDAOs daos) throws DAOException, PartakeException {
UserThumbnail thumbnail = daos.getThumbnailAccess().find(con, imageId);
if (thumbnail != null)
return thumbnail;
return null;
}
}
class ThumbnailTransaction extends Transaction<UserThumbnail> {
private String imageId;
public ThumbnailTransaction(String imageId) {
this.imageId = imageId;
}
@Override
protected UserThumbnail doExecute(PartakeConnection con, IPartakeDAOs daos) throws DAOException, PartakeException {
try {
UserImage image = daos.getImageAccess().find(con, imageId);
if (image == null)
return null;
InputStream is = new ByteArrayInputStream(image.getData());
BufferedImage converted = ImageUtil.createThumbnail(ImageIO.read(is), 320, 240);
is.close();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(converted, "png", os);
os.close();
UserThumbnail thumbnail = new UserThumbnail(image.getId(), image.getUserId(), "image/png", os.toByteArray(), TimeUtil.getCurrentDateTime());
daos.getThumbnailAccess().put(con, thumbnail);
return thumbnail;
} catch (IOException e) {
throw new PartakeException(ServerErrorCode.ERROR_IO);
}
}
}