Using BerkeleyDB for resized images.
This commit is contained in:
parent
65a8226302
commit
167d068c7b
5 changed files with 59 additions and 25 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -1,3 +1,5 @@
|
|||
target
|
||||
cache.properties
|
||||
build
|
||||
db
|
||||
|
||||
|
|
|
|||
19
pom.xml
19
pom.xml
|
|
@ -108,16 +108,17 @@
|
|||
<version>2.4</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sf.ehcache</groupId>
|
||||
<artifactId>ehcache</artifactId>
|
||||
<version>1.5.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.14</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sleepycat</groupId>
|
||||
<artifactId>je</artifactId>
|
||||
<version>4.0.92</version>
|
||||
</dependency>
|
||||
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.2</version></dependency>
|
||||
</dependencies>
|
||||
<repositories>
|
||||
<repository>
|
||||
|
|
@ -125,8 +126,14 @@
|
|||
<name>forkalsrud.org maven proxy</name>
|
||||
<releases><enabled>true</enabled></releases>
|
||||
<snapshots><enabled>false</enabled></snapshots>
|
||||
<url>http://www.forkalsrud.org/maven-proxy/repository</url>
|
||||
<url>http://forkalsrud.org:8080/maven-proxy/repository</url>
|
||||
<layout>legacy</layout>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>oracleReleases</id>
|
||||
<name>Oracle Released Java Packages</name>
|
||||
<url>http://download.oracle.com/maven</url>
|
||||
<layout>default</layout>
|
||||
</repository>
|
||||
</repositories>
|
||||
</project>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -19,6 +19,10 @@
|
|||
<param-name>base</param-name>
|
||||
<param-value>photos</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>dbdir</param-name>
|
||||
<param-value>db</param-value>
|
||||
</init-param>
|
||||
</servlet>
|
||||
|
||||
<servlet>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue