# HG changeset patch
# User robcast
# Date 1097852387 -7200
# Node ID 87dca7119596908b55b4eb47273b7aa213bfa8f7
# Parent 60a064f27d25e4bf3efb421d8952162f7b84f699
Servlet version 1.22b1
- more fast searching (hopefully all working now)
- some simple synchronisation
- some reshuffling of methods to eliminate cruft
diff -r 60a064f27d25 -r 87dca7119596 servlet/src/digilib/image/JAIImageLoaderDocuImage.java
--- a/servlet/src/digilib/image/JAIImageLoaderDocuImage.java Fri Oct 15 16:59:47 2004 +0200
+++ b/servlet/src/digilib/image/JAIImageLoaderDocuImage.java Fri Oct 15 16:59:47 2004 +0200
@@ -92,36 +92,40 @@
}
/* Get an ImageReader for the image file. */
- public void preloadImage(ImageFile f) throws IOException {
+ public ImageReader getReader(ImageFile f) throws IOException {
logger.debug("preloadImage: "+f.getFile());
//System.gc();
RandomAccessFile rf = new RandomAccessFile(f.getFile(), "r");
ImageInputStream istream = new FileImageInputStream(rf);
- Iterator readers = ImageIO.getImageReaders(istream);
- //Iterator readers = ImageIO.getImageReadersByMIMEType(f.getMimetype());
- reader = (ImageReader) readers.next();
- if (reader == null) {
+ //Iterator readers = ImageIO.getImageReaders(istream);
+ Iterator readers = ImageIO.getImageReadersByMIMEType(f.getMimetype());
+ if (! readers.hasNext()) {
throw new FileOpException("Unable to load File!");
}
+ reader = (ImageReader) readers.next();
logger.debug("JAIImageIO: this reader: " + reader.getClass());
+ while (readers.hasNext()) {
+ logger.debug(" next reader: " + readers.next().getClass());
+ }
reader.setInput(istream);
+ return reader;
}
/* Load an image file into the Object. */
public void loadSubimage(ImageFile f, Rectangle region, int prescale)
throws FileOpException {
logger.debug("loadSubimage: "+f.getFile());
- //System.gc();
+ System.gc();
try {
if ((reader == null) || (imgFile != f.getFile())) {
- preloadImage(f);
+ getReader(f);
}
- ImageInputStream istream = (ImageInputStream) reader.getInput();
ImageReadParam readParam = reader.getDefaultReadParam();
readParam.setSourceRegion(region);
readParam.setSourceSubsampling(prescale, prescale, 0, 0);
img = reader.read(0, readParam);
/* JAI imageread seems to ignore the readParam :-(
+ ImageInputStream istream = (ImageInputStream) reader.getInput();
ParameterBlockJAI pb = new ParameterBlockJAI("imageread");
pb.setParameter("Input", istream);
pb.setParameter("ReadParam", readParam);
diff -r 60a064f27d25 -r 87dca7119596 servlet/src/digilib/io/Directory.java
--- a/servlet/src/digilib/io/Directory.java Fri Oct 15 16:59:47 2004 +0200
+++ b/servlet/src/digilib/io/Directory.java Fri Oct 15 16:59:47 2004 +0200
@@ -35,9 +35,9 @@
protected Logger logger = Logger.getLogger(this.getClass());
/** File object pointing to the directory */
- File dir = null;
+ protected File dir = null;
/** parent directory */
- Directory parent = null;
+ protected Directory parent = null;
/** list of filenames in the directory */
protected String[] list = null;
@@ -82,10 +82,10 @@
*/
public boolean readDir() {
if (dir != null) {
- logger.debug("start reading dir");
+ logger.debug("reading dir: "+dir.getPath());
list = dir.list();
Arrays.sort(list);
- logger.debug("done reading dir");
+ logger.debug(" done");
}
return (list != null);
}
diff -r 60a064f27d25 -r 87dca7119596 servlet/src/digilib/io/DocuDirCache.java
--- a/servlet/src/digilib/io/DocuDirCache.java Fri Oct 15 16:59:47 2004 +0200
+++ b/servlet/src/digilib/io/DocuDirCache.java Fri Oct 15 16:59:47 2004 +0200
@@ -40,20 +40,28 @@
/** general logger for this class */
Logger logger = Logger.getLogger(this.getClass());
+
/** HashMap of directories */
Map map = null;
+
/** names of base directories */
String[] baseDirNames = null;
+
/** array of allowed file classes (image/text) */
private int[] fileClasses = null;
+
/** number of files in the whole cache (approximate) */
long numFiles = 0;
+
/** number of cache hits */
long hits = 0;
+
/** number of cache misses */
long misses = 0;
+
/** use safe (but slow) indexing */
boolean safeDirIndex = false;
+
/** the root directory element */
public static Directory ROOT = null;
@@ -63,12 +71,14 @@
* @param bd
* base directory names
*/
- public DocuDirCache(String[] bd, int[] fileClasses, DigilibConfiguration dlConfig) {
+ public DocuDirCache(String[] bd, int[] fileClasses,
+ DigilibConfiguration dlConfig) {
baseDirNames = bd;
map = new HashMap();
this.fileClasses = fileClasses;
safeDirIndex = dlConfig.getAsBoolean("safe-dir-index");
}
+
/**
* Constructor with array of base directory names.
*
@@ -112,7 +122,7 @@
*
* @param newDir
*/
- public void putDir(DocuDirectory newDir) {
+ public synchronized void putDir(DocuDirectory newDir) {
put(newDir);
String parent = FileOps.parent(newDir.getDirName());
if (parent != "") {
@@ -130,9 +140,9 @@
/**
* Get a list with all children of a directory.
*
- * Returns a List of DocuDirectory's. Returns an empty List if the
- * directory has no children. If recurse is false then only direct children
- * are returned.
+ * Returns a List of DocuDirectory's. Returns an empty List if the directory
+ * has no children. If recurse is false then only direct children are
+ * returned.
*
* @param dirname
* @param recurse
@@ -158,8 +168,8 @@
}
/**
- * Returns the DocuDirent with the pathname fn
and the
- * index in
and the class fc
.
+ * Returns the DocuDirent with the pathname fn
and the index
+ * in
and the class fc
.
*
* If fn
is a file then the corresponding DocuDirent is
* returned and the index is ignored.
@@ -169,7 +179,7 @@
* @param in
* file index
* @param fc
- * file class
+ * file class
* @return
*/
public DocuDirent getFile(String fn, int in, int fc) {
diff -r 60a064f27d25 -r 87dca7119596 servlet/src/digilib/io/DocuDirectory.java
--- a/servlet/src/digilib/io/DocuDirectory.java Fri Oct 15 16:59:47 2004 +0200
+++ b/servlet/src/digilib/io/DocuDirectory.java Fri Oct 15 16:59:47 2004 +0200
@@ -166,7 +166,7 @@
*
* @return boolean the directory exists
*/
- public boolean readDir() {
+ public synchronized boolean readDir() {
// check directory first
checkDir();
if (!isValid) {
@@ -204,7 +204,9 @@
File d = new File(baseDirNames[j], dirName);
if (d.isDirectory()) {
dirs[j] = new Directory(d);
+ logger.debug(" reading scaled directory " + d.getPath());
dirs[j].readDir();
+ logger.debug(" done");
}
}
@@ -290,13 +292,9 @@
unresolvedFileMeta = fileMeta;
}
} catch (SAXException e) {
- if (cache != null) {
- cache.logger.warn("error parsing index.meta", e);
- }
+ logger.warn("error parsing index.meta", e);
} catch (IOException e) {
- if (cache != null) {
- cache.logger.warn("error reading index.meta", e);
- }
+ logger.warn("error reading index.meta", e);
}
}
readParentMeta();
@@ -425,16 +423,23 @@
return idx;
} else {
// try closest matches without extension
- idx = -idx;
+ idx = -idx - 1;
String fb = FileOps.basename(fn);
- DocuDirent fs = (DocuDirent) list[fc].get(idx - 1);
- if (FileOps.basename(fs.getName()).equals(fb)) {
- // basename matches
+ DocuDirent fs;
+ if ((idx < list.length)
+ && (FileOps.basename(((DocuDirent) list[fc].get(idx))
+ .getName()).equals(fb))) {
+ // idx matches
+ return idx;
+ } else if ((idx > 0)
+ && (FileOps.basename(((DocuDirent) list[fc].get(idx - 1))
+ .getName()).equals(fb))) {
+ // idx-1 matches
return idx - 1;
- }
- fs = (DocuDirent) list[fc].get(idx + 1);
- if (FileOps.basename(fs.getName()).equals(fb)) {
- // basename matches
+ } else if ((idx + 1 < list.length)
+ && (FileOps.basename(((DocuDirent) list[fc].get(idx - 1))
+ .getName()).equals(fb))) {
+ // idx+1 matches
return idx + 1;
}