extensions/net.sf.basedb.thumbnails/trunk/src/net/sf/basedb/thumbnails/ThumbnailsServlet.java

Code
Comments
Other
Rev Date Author Line
3399 15 Jun 15 nicklas 1 package net.sf.basedb.thumbnails;
3399 15 Jun 15 nicklas 2
3401 15 Jun 15 nicklas 3 import java.io.ByteArrayInputStream;
3399 15 Jun 15 nicklas 4 import java.io.IOException;
3399 15 Jun 15 nicklas 5 import java.io.InputStream;
3399 15 Jun 15 nicklas 6 import java.io.OutputStream;
3399 15 Jun 15 nicklas 7 import java.util.Date;
3399 15 Jun 15 nicklas 8
3399 15 Jun 15 nicklas 9 import javax.servlet.ServletException;
3399 15 Jun 15 nicklas 10 import javax.servlet.http.HttpServlet;
3399 15 Jun 15 nicklas 11 import javax.servlet.http.HttpServletRequest;
3399 15 Jun 15 nicklas 12 import javax.servlet.http.HttpServletResponse;
3399 15 Jun 15 nicklas 13
6043 11 Nov 20 nicklas 14 import org.imgscalr.Scalr.Rotation;
6043 11 Nov 20 nicklas 15
3399 15 Jun 15 nicklas 16 import net.sf.basedb.core.Application;
3399 15 Jun 15 nicklas 17 import net.sf.basedb.core.DbControl;
3399 15 Jun 15 nicklas 18 import net.sf.basedb.core.File;
3399 15 Jun 15 nicklas 19 import net.sf.basedb.core.SessionControl;
3399 15 Jun 15 nicklas 20 import net.sf.basedb.util.FileUtil;
3401 15 Jun 15 nicklas 21 import net.sf.basedb.util.StaticCache;
3399 15 Jun 15 nicklas 22 import net.sf.basedb.util.Values;
3399 15 Jun 15 nicklas 23
3399 15 Jun 15 nicklas 24 /**
3399 15 Jun 15 nicklas 25   Servlet for serving thumbnails of images. Parameters:
3399 15 Jun 15 nicklas 26   
3399 15 Jun 15 nicklas 27   ID: Session id (required)
3399 15 Jun 15 nicklas 28   file: ID of the file (required)
3403 16 Jun 15 nicklas 29   size: SMALL, MEDIUM, LARGE or XLARGE (optional, default is MEDIUM)
3399 15 Jun 15 nicklas 30
3399 15 Jun 15 nicklas 31   @author nicklas
3399 15 Jun 15 nicklas 32   @since 1.0
3399 15 Jun 15 nicklas 33 */
3399 15 Jun 15 nicklas 34 public class ThumbnailsServlet 
3399 15 Jun 15 nicklas 35   extends HttpServlet
3399 15 Jun 15 nicklas 36 {
3399 15 Jun 15 nicklas 37
3403 16 Jun 15 nicklas 38   private static final long serialVersionUID = 1546645672774681120L;
3403 16 Jun 15 nicklas 39
3403 16 Jun 15 nicklas 40   public ThumbnailsServlet() 
3403 16 Jun 15 nicklas 41   {}
3403 16 Jun 15 nicklas 42   
3399 15 Jun 15 nicklas 43   @Override
3399 15 Jun 15 nicklas 44   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
3399 15 Jun 15 nicklas 45     throws ServletException, IOException 
3399 15 Jun 15 nicklas 46   {
3399 15 Jun 15 nicklas 47     final String ID = req.getParameter("ID");
3399 15 Jun 15 nicklas 48     InputStream in = null;
3399 15 Jun 15 nicklas 49     OutputStream out = null;
5351 10 Apr 19 nicklas 50     DbControl dc = null;
3399 15 Jun 15 nicklas 51     
3399 15 Jun 15 nicklas 52     try
3399 15 Jun 15 nicklas 53     {
5351 10 Apr 19 nicklas 54       final SessionControl sc = Application.getSessionControl(ID, null, req.getRemoteAddr(), false);
5351 10 Apr 19 nicklas 55       final int fileId = Values.getInt(req.getParameter("file"));
5351 10 Apr 19 nicklas 56       
5351 10 Apr 19 nicklas 57       ThumbnailSize thumbSize = req.getParameter("size") != null ?
5351 10 Apr 19 nicklas 58         ThumbnailSize.valueOf(req.getParameter("size")) : ThumbnailSize.MEDIUM;
5351 10 Apr 19 nicklas 59         
6043 11 Nov 20 nicklas 60       Rotation rotation = req.getParameter("rotate") != null ?
6043 11 Nov 20 nicklas 61         Rotation.valueOf(req.getParameter("rotate")) : null;
6053 13 Nov 20 nicklas 62
6053 13 Nov 20 nicklas 63       Crop crop = req.getParameter("crop") != null ?
6053 13 Nov 20 nicklas 64         Crop.valueOf(req.getParameter("crop")) : null;
6043 11 Nov 20 nicklas 65       
6046 11 Nov 20 nicklas 66       int imageIndex = Values.getInt(req.getParameter("index"), -1);
6046 11 Nov 20 nicklas 67       
5351 10 Apr 19 nicklas 68       dc = sc.newDbControl();    
3399 15 Jun 15 nicklas 69       File f = File.getById(dc, fileId);
5351 10 Apr 19 nicklas 70       ImageLoader imageLoader = Thumbnails.getImageLoader(f);
3401 15 Jun 15 nicklas 71       
3401 15 Jun 15 nicklas 72       // Try to read from cache
5351 10 Apr 19 nicklas 73       StaticCache cache = Application.getStaticCache();
6053 13 Nov 20 nicklas 74       String cacheKey = Thumbnails.getCacheKey(f.getId(), f.getVersion(), imageLoader.getThumbExtension(), thumbSize, rotation, crop, imageIndex);
3401 15 Jun 15 nicklas 75       in = cache.read(cacheKey, 50);
3401 15 Jun 15 nicklas 76       
3401 15 Jun 15 nicklas 77       long size = -1;
3401 15 Jun 15 nicklas 78       if (in != null)
3399 15 Jun 15 nicklas 79       {
3401 15 Jun 15 nicklas 80         size = cache.size(cacheKey);
3399 15 Jun 15 nicklas 81       }
3401 15 Jun 15 nicklas 82       else
3399 15 Jun 15 nicklas 83       {
3417 24 Jun 15 nicklas 84         in = f.getDownloadStream(0);
6046 11 Nov 20 nicklas 85         imageLoader.loadImage(in, imageIndex);
3417 24 Jun 15 nicklas 86         in.close();
3417 24 Jun 15 nicklas 87         
6053 13 Nov 20 nicklas 88         byte[] jpg = imageLoader.getThumbImage(thumbSize, rotation, crop);
6043 11 Nov 20 nicklas 89         
3417 24 Jun 15 nicklas 90         size = jpg.length;
5351 10 Apr 19 nicklas 91         
3401 15 Jun 15 nicklas 92         // Store the thumbnail in the static cache
3417 24 Jun 15 nicklas 93         cache.write(cacheKey, new ByteArrayInputStream(jpg), 50);
3401 15 Jun 15 nicklas 94         
3401 15 Jun 15 nicklas 95         // Send back image from the byte array
3417 24 Jun 15 nicklas 96         in = new ByteArrayInputStream(jpg);        
3399 15 Jun 15 nicklas 97       }
3401 15 Jun 15 nicklas 98       
3401 15 Jun 15 nicklas 99       // Set some response headers
3401 15 Jun 15 nicklas 100       if (size > 0 && size < Integer.MAX_VALUE)
3401 15 Jun 15 nicklas 101       {
3401 15 Jun 15 nicklas 102         resp.setContentLength((int)size);
3401 15 Jun 15 nicklas 103       }
3399 15 Jun 15 nicklas 104       Date lastUpdate = f.getLastUpdate();
3399 15 Jun 15 nicklas 105       if (lastUpdate != null)
3399 15 Jun 15 nicklas 106       {
3399 15 Jun 15 nicklas 107         resp.setDateHeader("Date", lastUpdate.getTime());
3399 15 Jun 15 nicklas 108       }
5351 10 Apr 19 nicklas 109       resp.setContentType(imageLoader.getThumbMimeType());
6053 13 Nov 20 nicklas 110
3401 15 Jun 15 nicklas 111       // Return image
3399 15 Jun 15 nicklas 112       out = resp.getOutputStream();
3401 15 Jun 15 nicklas 113       FileUtil.copy(in, out);
3399 15 Jun 15 nicklas 114     }
3405 16 Jun 15 nicklas 115     catch (Exception ex)
3405 16 Jun 15 nicklas 116     {
3405 16 Jun 15 nicklas 117       ex.printStackTrace(System.err);
3405 16 Jun 15 nicklas 118       resp.sendRedirect("error-image.png");
3405 16 Jun 15 nicklas 119     }
3399 15 Jun 15 nicklas 120     finally
3399 15 Jun 15 nicklas 121     {
3399 15 Jun 15 nicklas 122       if (dc != null) dc.close();
3399 15 Jun 15 nicklas 123       FileUtil.close(in);
3399 15 Jun 15 nicklas 124       FileUtil.close(out);
3399 15 Jun 15 nicklas 125     }
3399 15 Jun 15 nicklas 126   }
3401 15 Jun 15 nicklas 127   
3401 15 Jun 15 nicklas 128   
3399 15 Jun 15 nicklas 129 }