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
+