# HG changeset patch
# User robcast
# Date 1047913152 -3600
# Node ID a398fc09ba71fee76c2a40026afba196a3374116
# Parent 8058d3b3466a99191267725966698dd3cfdbfe09
New version 1.8b4.
DocuFile classes use new Collection classes and has-a instead of is-a
list and map relations.
diff -r 8058d3b3466a -r a398fc09ba71 servlet/src/digilib/io/DocuDirCache.java
--- a/servlet/src/digilib/io/DocuDirCache.java Mon Mar 17 15:57:54 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirCache.java Mon Mar 17 15:59:12 2003 +0100
@@ -22,48 +22,38 @@
package digilib.io;
import java.io.File;
-import java.util.Hashtable;
+import java.util.HashMap;
/**
* @author casties
*/
-public class DocuDirCache extends Hashtable {
+public class DocuDirCache {
+ // HashMap of directories
+ private HashMap map = null;
// names of base directories
private String[] baseDirNames = null;
- // number of files in the whole cache (not reliable)
+ // number of files in the whole cache (approximate)
private long numFiles = 0;
// number of cache hits
private long hits = 0;
// number of cache misses
private long misses = 0;
- /*
- * inherited constructors
- */
- public DocuDirCache(int initialCapacity, float loadFactor) {
- super(initialCapacity, loadFactor);
- }
-
- public DocuDirCache(int initialCapacity) {
- super(initialCapacity);
- }
-
- public DocuDirCache() {
- super();
- }
-
- /*
- * new and exiting stuff
- */
-
/** Constructor with array of base directory names.
*
* @param bd base directory names
*/
public DocuDirCache(String[] bd) {
- super();
baseDirNames = bd;
+ map = new HashMap();
+ }
+
+ /** The number of directories in the cache.
+ * @return
+ */
+ public int size() {
+ return (map != null) ? map.size() : 0;
}
/** Add a DocuDirectory to the cache.
@@ -72,20 +62,91 @@
*/
public void put(DocuDirectory newdir) {
String s = newdir.getDirName();
- if (containsKey(s)) {
+ if (map.containsKey(s)) {
System.out.println("Baah, duplicate key in DocuDirectory.put!");
} else {
- super.put(s, newdir);
+ map.put(s, newdir);
numFiles += newdir.size();
}
}
+ /** Returns the DocuFileset with the pathname fn
and the
+ * index in
.
+ *
+ * If fn
is a file then the corresponding Fileset is
+ * returned and the index is ignored.
+ *
+ * @param fn digilib pathname
+ * @param in file index
+ * @return
+ */
public DocuFileset getFileset(String fn, int in) {
DocuDirectory dd;
// file number is 1-based, vector index is 0-based
int n = in - 1;
// first, assume fn is a directory and look in the cache
- dd = (DocuDirectory) get(fn);
+ dd = (DocuDirectory) map.get(fn);
+ if (dd == null) {
+ // cache miss
+ misses++;
+ // see if it's a directory
+ File f = new File(baseDirNames[0] + fn);
+ if (f.isDirectory()) {
+ dd = new DocuDirectory(fn, baseDirNames);
+ if (dd.isValid()) {
+ // add to the cache
+ put(dd);
+ }
+ } else {
+ // maybe it's a file
+ if (f.canRead()) {
+ // get the parent directory
+ String d = fn.substring(0, fn.lastIndexOf(File.separator));
+ // try it in the cache
+ dd = (DocuDirectory) map.get(d);
+ if (dd == null) {
+ // try to read from disk
+ dd = new DocuDirectory(d, baseDirNames);
+ if (dd.isValid()) {
+ // add to the cache
+ put(dd);
+ } else {
+ // invalid path
+ return null;
+ }
+ } else {
+ // not a real cache miss then
+ misses--;
+ }
+ // get the file's index
+ n = dd.indexOf(f.getName());
+ }
+ }
+ } else {
+ // cache hit
+ hits++;
+ }
+ dd.refresh();
+ if (dd.isValid()) {
+ try {
+ return dd.get(n);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ }
+ }
+ return null;
+ }
+
+ /** Returns the DocuDirectory indicated by the pathname fn
.
+ *
+ * If fn
is a file then its parent directory is returned.
+ *
+ * @param fn digilib pathname
+ * @return
+ */
+ public DocuDirectory getDirectory(String fn) {
+ DocuDirectory dd;
+ // first, assume fn is a directory and look in the cache
+ dd = (DocuDirectory) map.get(fn);
if (dd == null) {
// cache miss
misses++;
@@ -101,7 +162,7 @@
// maybe it's a file
if (f.canRead()) {
// try the parent directory in the cache
- dd = (DocuDirectory) get(f.getParent());
+ dd = (DocuDirectory) map.get(f.getParent());
if (dd == null) {
// try to read from disk
dd = new DocuDirectory(f.getParent(), baseDirNames);
@@ -112,55 +173,9 @@
// invalid path
return null;
}
- }
- // get the file's index
- n = dd.indexOf(f.getName());
- }
- }
- } else {
- // cache hit
- hits++;
- }
- dd.refresh();
- if (dd.isValid()) {
- try {
- return (DocuFileset) dd.elementAt(n);
- } catch (ArrayIndexOutOfBoundsException e) {
- }
- }
- return null;
- }
-
- public DocuDirectory getDirectory(String fn) {
- DocuDirectory dd;
- // first, assume fn is a directory and look in the cache
- dd = (DocuDirectory) get(fn);
- if (dd == null) {
- // cache miss
- misses++;
- // see if it's a directory
- File f = new File(baseDirNames[0] + fn);
- if (f.isDirectory()) {
- dd = new DocuDirectory(fn, baseDirNames);
- if (dd.isValid()) {
- // add to the cache
- put(dd);
- }
- } else {
- // maybe it's a file
- if (f.canRead()) {
- // try the parent directory in the cache
- dd = (DocuDirectory) get(f.getParent());
- if (dd == null) {
- // try to read from disk
- dd = new DocuDirectory(f.getParent(), baseDirNames);
- if (dd.isValid()) {
- // add to the cache
- put(dd);
- } else {
- // invalid path
- return null;
- }
+ } else {
+ // not a real cache miss then
+ misses--;
}
}
}
diff -r 8058d3b3466a -r a398fc09ba71 servlet/src/digilib/io/DocuDirectory.java
--- a/servlet/src/digilib/io/DocuDirectory.java Mon Mar 17 15:57:54 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirectory.java Mon Mar 17 15:59:12 2003 +0100
@@ -22,16 +22,18 @@
package digilib.io;
import java.io.File;
+import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.Vector;
+import java.util.HashMap;
+import java.util.Iterator;
/**
* @author casties
*/
-public class DocuDirectory extends Vector {
+public class DocuDirectory {
+ // list of files
+ private ArrayList list = null;
// directory object is valid (has been read)
private boolean isValid = false;
// names of base directories
@@ -41,30 +43,14 @@
// default/hires directory
private File dir = null;
// directory metadata
- private Hashtable dirMeta = null;
+ private HashMap dirMeta = null;
// time of last access of this object (not the filesystem)
private long objectATime = 0;
// time the file system directory was last modified
private long dirMTime = 0;
/*
- * inherited stuff
- */
-
- public DocuDirectory(int initialCapacity, int capacityIncrement) {
- super(initialCapacity, capacityIncrement);
- }
-
- public DocuDirectory(int initialCapacity) {
- super(initialCapacity);
- }
-
- public DocuDirectory(Collection c) {
- super(c);
- }
-
- /*
- * new stuff
+ * constructors
*/
/** Constructor with directory path and set of base directories.
@@ -77,12 +63,23 @@
* @param bd array of base directory names
*/
public DocuDirectory(String path, String[] bd) {
- super();
dirName = path;
baseDirNames = bd;
readDir();
}
+ /*
+ * other stuff
+ */
+
+ public int size() {
+ return (list != null) ? list.size() : 0;
+ }
+
+ public DocuFileset get(int index) {
+ return (list != null) ? (DocuFileset) list.get(index) : null;
+ }
+
/** Read the directory and fill this object.
*
* Clears the Vector and (re)reads all files.
@@ -90,8 +87,10 @@
* @return boolean the directory exists
*/
public boolean readDir() {
+ // first file extension to try for scaled directories
+ String fext = null;
// clear directory first
- clear();
+ list = null;
isValid = false;
// number of base dirs
int nb = baseDirNames.length;
@@ -114,16 +113,18 @@
// not a directory
return false;
}
- // number of image files
+ // number of image files in the directory
int nf = fl.length;
if (nf > 0) {
- // resize Vector
- this.ensureCapacity(nf);
+ // create new list
+ list = new ArrayList(nf);
// sort the file names alphabetically and iterate the list
Arrays.sort(fl);
for (int i = 0; i < nf; i++) {
String fn = fl[i].getName();
+ String fnx =
+ fn.substring(0, fn.lastIndexOf('.') + 1);
// add the first DocuFile to a new DocuFileset
DocuFileset fs = new DocuFileset(nb);
fs.add(new DocuFile(fl[i]));
@@ -132,14 +133,37 @@
if (dirs[j] == null) {
continue;
}
- File f = new File(dirs[j], fn);
+ File f;
+ if (fext != null) {
+ // use the last extension
+ f = new File(dirs[j], fnx + fext);
+ } else {
+ // try the same filename as the original
+ f = new File(dirs[j], fn);
+ }
// if the file exists, add to the DocuFileset
if (f.canRead()) {
fs.add(new DocuFile(f));
+ } else {
+ // try other file extensions
+ Iterator exts = FileOps.getImageExtensionIterator();
+ while (exts.hasNext()) {
+ String s = (String) exts.next();
+ f =
+ new File(
+ dirs[j],
+ fnx + s);
+ // if the file exists, add to the DocuFileset
+ if (f.canRead()) {
+ fs.add(new DocuFile(f));
+ fext = s;
+ break;
+ }
+ }
}
}
- // add the fileset to our Vector
- add(fs);
+ // add the fileset to our list
+ list.add(fs);
fs.setParent(this);
}
}
@@ -192,8 +216,9 @@
*/
public int indexOf(String fn) {
// linear search -> worst performance
- for (int i = 0; i < elementCount; i++) {
- DocuFileset fs = (DocuFileset) get(i);
+ int n = list.size();
+ for (int i = 0; i < n; i++) {
+ DocuFileset fs = (DocuFileset) list.get(i);
if (fs.getName().equals(fn)) {
return i;
}
@@ -212,7 +237,7 @@
public DocuFileset find(String fn) {
int i = indexOf(fn);
if (i >= 0) {
- return (DocuFileset) get(i);
+ return (DocuFileset) list.get(i);
}
return null;
}
@@ -241,7 +266,7 @@
/**
* @return Hashtable
*/
- public Hashtable getDirMeta() {
+ public HashMap getDirMeta() {
return dirMeta;
}
@@ -256,7 +281,7 @@
* Sets the dirMeta.
* @param dirMeta The dirMeta to set
*/
- public void setDirMeta(Hashtable dirMeta) {
+ public void setDirMeta(HashMap dirMeta) {
this.dirMeta = dirMeta;
}
diff -r 8058d3b3466a -r a398fc09ba71 servlet/src/digilib/io/DocuFileset.java
--- a/servlet/src/digilib/io/DocuFileset.java Mon Mar 17 15:57:54 2003 +0100
+++ b/servlet/src/digilib/io/DocuFileset.java Mon Mar 17 15:59:12 2003 +0100
@@ -19,55 +19,105 @@
*/
package digilib.io;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.ListIterator;
/**
* @author casties
*/
-public class DocuFileset extends Vector {
+public class DocuFileset {
+ // list of files
+ private ArrayList list = null;
// metadata
- private Hashtable fileMeta = null;
+ private HashMap fileMeta = null;
// parent directory
private DocuDirectory parent = null;
- public DocuFileset(int initialCapacity, int capacityIncrement) {
- super(initialCapacity, capacityIncrement);
- }
+ /*
+ * constructors
+ */
public DocuFileset(int initialCapacity) {
- super(initialCapacity);
- }
-
- public DocuFileset() {
- super();
+ list = new ArrayList(initialCapacity);
}
- public DocuFileset(Collection c) {
- super(c);
+ /*
+ * other stuff
+ */
+
+ /** Adds a DocuFile to this Fileset.
+ *
+ * The files should be added in the order of lower resolutions. The first
+ * file is considered the hires "original".
+ *
+ * @param f file to add
+ * @return true (always)
+ */
+ public boolean add(DocuFile f) {
+ f.setParent(this);
+ return list.add(f);
}
-
- /* (non-Javadoc)
- * @see java.util.Collection#add(java.lang.Object)
+
+ /** The number of image files in this Fileset.
+ *
+ * @return number of image files
+ */
+ public int size() {
+ return (list != null) ? list.size() : 0;
+ }
+
+ /** Get the DocuFile at the index.
+ *
+ * @param index
+ * @return
*/
- public synchronized boolean add(DocuFile f) {
- f.setParent(this);
- return super.add(f);
+ public DocuFile get(int index) {
+ return (DocuFile) list.get(index);
+ }
+
+
+ /** Get an Iterator for this Fileset starting at the highest resolution
+ * images.
+ *
+ * @return
+ */
+ public ListIterator getHiresIterator() {
+ return list.listIterator();
}
-
- public void readMeta() {
+
+ /** Get an Iterator for this Fileset starting at the lowest resolution
+ * images.
+ *
+ * The Iterator starts at the last element, so you have to use it backwards
+ * with hasPrevious() and previous().
+ *
+ * @return
+ */
+ public ListIterator getLoresIterator() {
+ return list.listIterator(list.size());
+ }
+
+ /** Reads meta-data for this Fileset if there is any.
+ * (not yet implemented)
+ */
+ public void checkMeta() {
// check for file metadata...
}
+ /** The name of the (original) image file.
+ *
+ * @return
+ */
public String getName() {
- if (this.elementCount > 0) {
- return ((DocuFile) firstElement()).getName();
+ if (!list.isEmpty()) {
+ return ((DocuFile) list.get(0)).getName();
}
return null;
}
- /**
+
+ /** Returns the parent DocuDirectory.
* @return DocuDirectory
*/
public DocuDirectory getParent() {
@@ -82,4 +132,20 @@
this.parent = parent;
}
+ /** Returns the meta-data for this fileset.
+ *
+ * @return HashMap
+ */
+ public HashMap getFileMeta() {
+ return fileMeta;
+ }
+
+ /**
+ * Sets the fileMeta.
+ * @param fileMeta The fileMeta to set
+ */
+ public void setFileMeta(HashMap fileMeta) {
+ this.fileMeta = fileMeta;
+ }
+
}
diff -r 8058d3b3466a -r a398fc09ba71 servlet/src/digilib/io/FileOps.java
--- a/servlet/src/digilib/io/FileOps.java Mon Mar 17 15:57:54 2003 +0100
+++ b/servlet/src/digilib/io/FileOps.java Mon Mar 17 15:59:12 2003 +0100
@@ -25,151 +25,167 @@
import digilib.*;
-
public class FileOps {
- private Utils util = null;
- public static String[] fileTypes = {
- "jpg", "image/jpeg",
- "jpeg", "image/jpeg",
- "jp2", "image/jp2",
- "png", "image/png",
- "gif", "image/gif",
- "tif", "image/tiff",
- "tiff", "image/tiff"};
+ private Utils util = null;
+ public static String[] fileTypes =
+ {
+ "jpg",
+ "image/jpeg",
+ "jpeg",
+ "image/jpeg",
+ "jp2",
+ "image/jp2",
+ "png",
+ "image/png",
+ "gif",
+ "image/gif",
+ "tif",
+ "image/tiff",
+ "tiff",
+ "image/tiff" };
- public FileOps() {
- util = new Utils();
- }
+ public static String[] fileExtensions =
+ { "jpg", "jpeg", "jp2", "png", "gif", "tif", "tiff" };
+
+ public FileOps() {
+ util = new Utils();
+ }
- public FileOps(Utils u) {
- util = u;
- }
+ public FileOps(Utils u) {
+ util = u;
+ }
- public void setUtils(Utils u) {
- util = u;
- }
-
+ public void setUtils(Utils u) {
+ util = u;
+ }
- /**
- * get the mime type for a file format (by extension)
- */
- public static String mimeForFile(File f) {
- String fn = f.getName();
- for (int i = 0; i < fileTypes.length; i += 2) {
- if (fn.toLowerCase().endsWith(fileTypes[i])) {
- return fileTypes[i+1];
- }
- }
- return null;
- }
+ /**
+ * get the mime type for a file format (by extension)
+ */
+ public static String mimeForFile(File f) {
+ String fn = f.getName();
+ for (int i = 0; i < fileTypes.length; i += 2) {
+ if (fn.toLowerCase().endsWith(fileTypes[i])) {
+ return fileTypes[i + 1];
+ }
+ }
+ return null;
+ }
- /**
- * get a filehandle for a file or directory name
- * returns File number n if fn is directory (starts with 1)
- */
- public File getFile(String fn, int n) throws FileOpException {
- util.dprintln(4, "getFile ("+fn+", "+n+")");
+ public static Iterator getImageExtensionIterator() {
+ return Arrays.asList(fileExtensions).iterator();
+ }
- File f = new File(fn);
- // if fn is a file name then return file
- if (f.isFile()) {
- return f;
- }
- // if fn is a directory name then open directory
- if (f.isDirectory()) {
- File[] fl = f.listFiles(new ImageFileFilter());
- Arrays.sort(fl);
- if ((n > 0) && (n <= fl.length)) {
- return fl[n - 1];
- }
- }
- throw new FileOpException("Unable to find file: "+fn);
- }
+ /**
+ * get a filehandle for a file or directory name
+ * returns File number n if fn is directory (starts with 1)
+ */
+ public File getFile(String fn, int n) throws FileOpException {
+ util.dprintln(4, "getFile (" + fn + ", " + n + ")");
- /**
- * get the number of files in a directory
- * (almost the same as getFile)
- * returns 0 in case of problems
- */
- public int getNumFiles(String fn) throws FileOpException {
- util.dprintln(4, "getNumFiles ("+fn+")");
+ File f = new File(fn);
+ // if fn is a file name then return file
+ if (f.isFile()) {
+ return f;
+ }
+ // if fn is a directory name then open directory
+ if (f.isDirectory()) {
+ File[] fl = f.listFiles(new ImageFileFilter());
+ Arrays.sort(fl);
+ if ((n > 0) && (n <= fl.length)) {
+ return fl[n - 1];
+ }
+ }
+ throw new FileOpException("Unable to find file: " + fn);
+ }
- File f = new File(fn);
- // if fn is a file name then return 1
- if (f.isFile()) {
- return 1;
- }
- // if fn is a directory name then return the number of files
- if (f.isDirectory()) {
- return f.listFiles(new ImageFileFilter()).length;
- }
- // then fn must be something strange...
- return 0;
- }
+ /**
+ * get the number of files in a directory
+ * (almost the same as getFile)
+ * returns 0 in case of problems
+ */
+ public int getNumFiles(String fn) throws FileOpException {
+ util.dprintln(4, "getNumFiles (" + fn + ")");
+ File f = new File(fn);
+ // if fn is a file name then return 1
+ if (f.isFile()) {
+ return 1;
+ }
+ // if fn is a directory name then return the number of files
+ if (f.isDirectory()) {
+ return f.listFiles(new ImageFileFilter()).length;
+ }
+ // then fn must be something strange...
+ return 0;
+ }
- /**
- * get a filehandle for a file or directory name out of a list
- * dirs is a list of base directories, fn is the appended file/dirname
- * searches dirs until fn exists (backwards if fwd is false)
- * returns File number n if fn is directory (starts with 1)
- */
- public File getFileVariant(String[] dirs, String fn, int n, boolean fwd) throws FileOpException {
- util.dprintln(4, "getVariantFile ("+dirs+", "+fn+", "+n+")");
+ /**
+ * get a filehandle for a file or directory name out of a list
+ * dirs is a list of base directories, fn is the appended file/dirname
+ * searches dirs until fn exists (backwards if fwd is false)
+ * returns File number n if fn is directory (starts with 1)
+ */
+ public File getFileVariant(String[] dirs, String fn, int n, boolean fwd)
+ throws FileOpException {
+ util.dprintln(
+ 4,
+ "getVariantFile (" + dirs + ", " + fn + ", " + n + ")");
- File f = null;
- int nvar = dirs.length;
+ File f = null;
+ int nvar = dirs.length;
- for (int i = 0; i < nvar; i++) {
- try {
- f = getFile(dirs[(fwd) ? i : (nvar-i-1)]+fn, n);
- } catch (FileOpException e) {
- f = null;
- }
- if (f != null) {
- return f;
- }
- }
- throw new FileOpException("Unable to find file: "+fn);
- }
+ for (int i = 0; i < nvar; i++) {
+ try {
+ f = getFile(dirs[(fwd) ? i : (nvar - i - 1)] + fn, n);
+ } catch (FileOpException e) {
+ f = null;
+ }
+ if (f != null) {
+ return f;
+ }
+ }
+ throw new FileOpException("Unable to find file: " + fn);
+ }
- /**
- * get the number of files in a directory
- * (almost the same as getFileVariant)
- * returns 0 in case of problems
- */
- public int getNumFilesVariant(String[] dirs, String fn, boolean fwd) throws FileOpException {
- util.dprintln(4, "getNumFilesVariant ("+dirs+", "+fn+")");
+ /**
+ * get the number of files in a directory
+ * (almost the same as getFileVariant)
+ * returns 0 in case of problems
+ */
+ public int getNumFilesVariant(String[] dirs, String fn, boolean fwd)
+ throws FileOpException {
+ util.dprintln(4, "getNumFilesVariant (" + dirs + ", " + fn + ")");
- int nf = 0;
- int nvar = dirs.length;
+ int nf = 0;
+ int nvar = dirs.length;
- for (int i = 0; i < nvar; i++) {
- try {
- nf = getNumFiles(dirs[(fwd) ? i : (nvar-i-1)]+fn);
- } catch (FileOpException e) {
- nf = 0;
- }
- if (nf > 0) {
- return nf;
- }
- }
- return 0;
- }
+ for (int i = 0; i < nvar; i++) {
+ try {
+ nf = getNumFiles(dirs[(fwd) ? i : (nvar - i - 1)] + fn);
+ } catch (FileOpException e) {
+ nf = 0;
+ }
+ if (nf > 0) {
+ return nf;
+ }
+ }
+ return 0;
+ }
- /**
- * FileFilter for image types (helper class for getFile)
- */
- static class ImageFileFilter implements FileFilter {
+ /**
+ * FileFilter for image types (helper class for getFile)
+ */
+ static class ImageFileFilter implements FileFilter {
- public boolean accept(File f) {
- if (f.isFile()) {
- return (mimeForFile(f) != null);
- } else {
- return false;
- }
- }
- }
+ public boolean accept(File f) {
+ if (f.isFile()) {
+ return (mimeForFile(f) != null);
+ } else {
+ return false;
+ }
+ }
+ }
}