From 167d068c7b48a941ef7ddbfa9aef70d0b175743a Mon Sep 17 00:00:00 2001 From: Knut Forkalsrud Date: Fri, 5 Feb 2010 21:16:10 -0800 Subject: [PATCH] Using BerkeleyDB for resized images. --- .gitignore | 2 + pom.xml | 19 ++++-- .../forkalsrud/album/web/AlbumServlet.java | 58 +++++++++++++------ .../forkalsrud/album/web/PictureScaler.java | 1 + webapp/WEB-INF/web.xml | 4 ++ 5 files changed, 59 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 51eab7f..18aed1a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ target cache.properties build +db + diff --git a/pom.xml b/pom.xml index 9909a11..27e53e6 100644 --- a/pom.xml +++ b/pom.xml @@ -108,16 +108,17 @@ 2.4 provided - - net.sf.ehcache - ehcache - 1.5.0 - log4j log4j 1.2.14 + + com.sleepycat + je + 4.0.92 + + junitjunit3.8.2 @@ -125,8 +126,14 @@ forkalsrud.org maven proxy true false - http://www.forkalsrud.org/maven-proxy/repository + http://forkalsrud.org:8080/maven-proxy/repository legacy + + oracleReleases + Oracle Released Java Packages + http://download.oracle.com/maven + default + diff --git a/src/org/forkalsrud/album/web/AlbumServlet.java b/src/org/forkalsrud/album/web/AlbumServlet.java index 83012cd..b96f9fd 100644 --- a/src/org/forkalsrud/album/web/AlbumServlet.java +++ b/src/org/forkalsrud/album/web/AlbumServlet.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.IOException; import java.util.Calendar; import java.util.Date; +import java.util.Properties; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; @@ -11,12 +12,9 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import net.sf.ehcache.Cache; -import net.sf.ehcache.CacheManager; -import net.sf.ehcache.Element; - import org.apache.commons.logging.LogFactory; import org.apache.log4j.PropertyConfigurator; +import org.forkalsrud.album.db.ThumbnailDatabase; import org.forkalsrud.album.exif.DirectoryEntry; import org.forkalsrud.album.exif.Entry; import org.forkalsrud.album.exif.FileEntry; @@ -27,38 +25,56 @@ public class AlbumServlet { File base; String basePrefix; - Cache imageCache; - CacheManager cacheManager; +// Cache imageCache; +// CacheManager cacheManager; PictureScaler pictureScaler; long lastCacheFlushTime; + ThumbnailDatabase db = new ThumbnailDatabase(); @Override public void init() throws ServletException { + log4jInit("/log4j.properties"); System.out.println("in init of Album"); base = new File(getServletConfig().getInitParameter("base")).getAbsoluteFile(); basePrefix = "/" + base.getName(); - PropertyConfigurator.configure("log4j.properties"); LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.Log4JLogger"); - cacheManager = CacheManager.create(); - imageCache = cacheManager.getCache("imageCache"); + + String dbDirName = getServletConfig().getInitParameter("dbdir"); + File dbDir = dbDirName != null ? new File(dbDirName) : new File(System.getProperty("java.io.tmpdir"), "album"); + dbDir.mkdir(); + db.init(dbDir); +// cacheManager = CacheManager.create(); +// imageCache = cacheManager.getCache("imageCache"); pictureScaler = new PictureScaler(); lastCacheFlushTime = System.currentTimeMillis(); } + private void log4jInit(String resource) { + try { + Properties props = new Properties(); + props.load(getClass().getResourceAsStream(resource)); + PropertyConfigurator.configure(props); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + @Override public void destroy() { - imageCache.flush(); - cacheManager.shutdown(); + System.out.println("Shutting down Album"); + db.destroy(); +// imageCache.flush(); + // cacheManager.shutdown(); } @Override public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { - if (req.getParameter("cacheFlush") != null) imageCache.flush(); +// if (req.getParameter("cacheFlush") != null) imageCache.flush(); req.setAttribute("assets", req.getContextPath() + "/assets"); req.setAttribute("req", req); @@ -166,28 +182,32 @@ public class AlbumServlet String key = file.getPath() + ":" + size; - CachedImage cimg = null; - Element element = imageCache.get(key); - if (element != null) { - cimg = (CachedImage) element.getObjectValue(); + CachedImage cimg = db.load(key); +// Element element = imageCache.get(key); +// if (element != null) { +// cimg = (CachedImage) element.getObjectValue(); + if (cimg != null) { if (cimg.lastModified == file.lastModified()) { System.out.println("cache hit on " + key); } else { System.out.println(" " + key + " has changed so cache entry wil be refreshed"); - imageCache.remove(key); + // imageCache.remove(key); cimg = null; } } if (cimg == null) { // try { cimg = pictureScaler.scalePicture(file, thumbnail, size); - imageCache.put(new Element(key, cimg)); + db.store(key, cimg); +// imageCache.put(new Element(key, cimg)); + /* long millisSinceLastFlush = System.currentTimeMillis() - lastCacheFlushTime; if (millisSinceLastFlush > 10 * 60 * 1000L) { imageCache.flush(); lastCacheFlushTime = System.currentTimeMillis(); } - System.out.println(" " + key + " added to the cache with size " + cimg.bits.length + " -- now " + imageCache.getSize() + " entries"); + */ + System.out.println(" " + key + " added to the cache with size " + cimg.bits.length + " -- now " + db.size() + " entries"); // } catch (TimeoutException e) { // res.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE); // return; diff --git a/src/org/forkalsrud/album/web/PictureScaler.java b/src/org/forkalsrud/album/web/PictureScaler.java index bf22fb5..0859888 100644 --- a/src/org/forkalsrud/album/web/PictureScaler.java +++ b/src/org/forkalsrud/album/web/PictureScaler.java @@ -171,6 +171,7 @@ public class PictureScaler { reader.setInput(iis, true); ImageReadParam param = reader.getDefaultReadParam(); BufferedImage img = reader.read(0, param); + iis.close(); // The orientation is about flipping and rotating. Here is what an 'F' looks like // on pictures with each orientation. diff --git a/webapp/WEB-INF/web.xml b/webapp/WEB-INF/web.xml index e3677c2..01424c2 100644 --- a/webapp/WEB-INF/web.xml +++ b/webapp/WEB-INF/web.xml @@ -19,6 +19,10 @@ base photos + + dbdir + db +