# HG changeset patch
# User robcast
# Date 1068494340 -3600
# Node ID 67ff8c7fecb97d295f6b14ed92fa64c5de829bf5
# Parent 633947100c86f4126d33b7c3fc25d1aea77aad95
Servlet version 1.17b2
- new mapping file for "virtual directories"
- direct file URLs now work without extension (even with wrong ones)
diff -r 633947100c86 -r 67ff8c7fecb9 servlet/src/digilib/io/AliasingDocuDirCache.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/servlet/src/digilib/io/AliasingDocuDirCache.java Mon Nov 10 20:59:00 2003 +0100
@@ -0,0 +1,94 @@
+/*
+ * AliasingDocuDirCache -- DocuDirCache using alias entries from config file
+ *
+ * Digital Image Library servlet components
+ *
+ * Copyright (C) 2003 Robert Casties (robcast@mail.berlios.de)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * Please read license.txt for the full details. A copy of the GPL may be found
+ * at http://www.gnu.org/copyleft/lgpl.html
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Created on 04.11.2003
+ */
+
+package digilib.io;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * @author casties
+ *
+ */
+public class AliasingDocuDirCache extends DocuDirCache {
+
+ /**
+ * @param baseDirs
+ * @param fileClasses
+ * @param confFileName
+ * @throws FileOpException
+ */
+ public AliasingDocuDirCache(
+ String[] baseDirs,
+ int[] fileClasses,
+ String confFileName)
+ throws FileOpException {
+ // create standard DocuDirCache
+ super(baseDirs, fileClasses);
+ HashMap pathMap = null;
+ // read alias config file
+ try {
+ // create data loader for mapping-file
+ File confFile = new File(confFileName);
+ // load into pathMap
+ XMLListLoader mapLoader =
+ new XMLListLoader("digilib-aliases", "mapping", "link", "dir");
+ pathMap = mapLoader.loadURL(confFile.toURL().toString());
+ } catch (Exception e) {
+ throw new FileOpException("ERROR loading mapping file: " + e);
+ }
+ if (pathMap == null) {
+ throw new FileOpException("ERROR unable to load mapping file!");
+ }
+
+ /*
+ * load map entries into cache
+ */
+
+ for (Iterator i = pathMap.keySet().iterator(); i.hasNext();) {
+ String link = (String)i.next();
+ String dir = (String) pathMap.get(link);
+ DocuDirectory destDir = new DocuDirectory(dir, this);
+ if (destDir.isValid()) {
+ // add the alias name
+ putName(link, destDir);
+ // add the real dir
+ putDir(destDir);
+ }
+ }
+ }
+
+ /** Adds a DocuDirectory under another name to the cache.
+ *
+ * @param name
+ * @param newdir
+ */
+ public void putName(String name, DocuDirectory newdir) {
+ if (map.containsKey(name)) {
+ System.out.println("Baah, duplicate key in AliasingDocuDirCache.put!");
+ } else {
+ map.put(name, newdir);
+ }
+ }
+
+}
diff -r 633947100c86 -r 67ff8c7fecb9 servlet/src/digilib/io/DocuDirCache.java
--- a/servlet/src/digilib/io/DocuDirCache.java Mon Nov 10 20:50:32 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirCache.java Mon Nov 10 20:59:00 2003 +0100
@@ -1,21 +1,22 @@
-/* DocuDirCache.java
-
- Digital Image Library servlet components
-
- Copyright (C) 2003 Robert Casties (robcast@mail.berlios.de)
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- Please read license.txt for the full details. A copy of the GPL
- may be found at http://www.gnu.org/copyleft/lgpl.html
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
+/*
+ * DocuDirCache.java
+ *
+ * Digital Image Library servlet components
+ *
+ * Copyright (C) 2003 Robert Casties (robcast@mail.berlios.de)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * Please read license.txt for the full details. A copy of the GPL may be found
+ * at http://www.gnu.org/copyleft/lgpl.html
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA 02111-1307 USA
+ *
* Created on 03.03.2003
*/
@@ -33,7 +34,7 @@
public class DocuDirCache {
/** HashMap of directories */
- private HashMap map = null;
+ protected HashMap map = null;
/** names of base directories */
private String[] baseDirNames = null;
/** array of allowed file classes (image/text) */
@@ -45,18 +46,22 @@
/** number of cache misses */
private long misses = 0;
- /** Constructor with array of base directory names and file classes.
- *
- * @param bd base directory names
+ /**
+ * Constructor with array of base directory names and file classes.
+ *
+ * @param bd
+ * base directory names
*/
public DocuDirCache(String[] bd, int[] fileClasses) {
baseDirNames = bd;
map = new HashMap();
this.fileClasses = fileClasses;
}
- /** Constructor with array of base directory names.
- *
- * @param bd base directory names
+ /**
+ * Constructor with array of base directory names.
+ *
+ * @param bd
+ * base directory names
*/
public DocuDirCache(String[] bd) {
baseDirNames = bd;
@@ -66,14 +71,17 @@
fileClasses[0] = FileOps.CLASS_IMAGE;
}
- /** The number of directories in the cache.
+ /**
+ * The number of directories in the cache.
+ *
* @return
*/
public int size() {
return (map != null) ? map.size() : 0;
}
- /** Add a DocuDirectory to the cache.
+ /**
+ * Add a DocuDirectory to the cache.
*
* @param newdir
*/
@@ -87,7 +95,8 @@
}
}
- /** Add a directory to the cache and check its parents.
+ /**
+ * Add a directory to the cache and check its parents.
*
* @param newDir
*/
@@ -96,7 +105,7 @@
String parent = newDir.getParentDirName();
if (parent != null) {
// check the parent in the cache
- DocuDirectory pd = (DocuDirectory)map.get(parent);
+ DocuDirectory pd = (DocuDirectory) map.get(parent);
if (pd == null) {
// the parent is unknown
pd = new DocuDirectory(parent, this);
@@ -106,20 +115,22 @@
}
}
- /** Get a list with all children of a directory.
+ /**
+ * 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 find all children and their children.
+ * @param recurse
+ * find all children and their children.
* @return
*/
public List getChildren(String dirname, boolean recurse) {
List l = new LinkedList();
- for (Iterator i = map.keySet().iterator(); i.hasNext(); ) {
- DocuDirectory dd = (DocuDirectory)i.next();
+ for (Iterator i = map.keySet().iterator(); i.hasNext();) {
+ DocuDirectory dd = (DocuDirectory) i.next();
if (recurse) {
if (dd.getDirName().startsWith(dirname)) {
l.add(dd);
@@ -133,15 +144,18 @@
return l;
}
- /** Returns the ImageFileset with the pathname fn
and the
+ /**
+ * Returns the ImageFileset with the pathname fn
and the
* index in
and the class fc
.
*
- * If fn
is a file then the corresponding Fileset is
+ * 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
+ * @param fn
+ * digilib pathname
+ * @param in
+ * file index
+ * @return
*/
public DocuDirent getFile(String fn, int in, int fc) {
DocuDirectory dd;
@@ -152,7 +166,9 @@
if (dd == null) {
// cache miss
misses++;
- // see if it's a directory
+ /*
+ * see if it's a directory
+ */
File f = new File(baseDirNames[0], fn);
if (f.isDirectory()) {
dd = new DocuDirectory(fn, this);
@@ -161,32 +177,30 @@
putDir(dd);
}
} else {
- // maybe it's a file
- if (f.canRead()) {
- // get the parent directory string (like we store it in the cache)
- String d = fn.substring(0, fn.lastIndexOf("/"));
- // try it in the cache
- dd = (DocuDirectory) map.get(d);
- if (dd == null) {
- // try to read from disk
- dd = new DocuDirectory(d, this);
- if (dd.isValid()) {
- // add to the cache
- putDir(dd);
- } else {
- // invalid path
- return null;
- }
+ /*
+ * maybe it's a file
+ */
+ // get the parent directory string (like we store it in the
+ // cache)
+ String d = fn.substring(0, fn.lastIndexOf("/"));
+ // try it in the cache
+ dd = (DocuDirectory) map.get(d);
+ if (dd == null) {
+ // try to read from disk
+ dd = new DocuDirectory(d, this);
+ if (dd.isValid()) {
+ // add to the cache
+ putDir(dd);
} else {
- // then it was not a real cache miss
- misses--;
+ // invalid path
+ return null;
}
- // get the file's index
- n = dd.indexOf(f.getName(), fc);
} else {
- // it's not even a file :-(
- return null;
+ // it was not a real cache miss
+ misses--;
}
+ // get the file's index
+ n = dd.indexOf(f.getName(), fc);
}
} else {
// cache hit
@@ -202,11 +216,13 @@
return null;
}
- /** Returns the DocuDirectory indicated by the pathname fn
.
+ /**
+ * Returns the DocuDirectory indicated by the pathname fn
.
*
* If fn
is a file then its parent directory is returned.
*
- * @param fn digilib pathname
+ * @param fn
+ * digilib pathname
* @return
*/
public DocuDirectory getDirectory(String fn) {
@@ -275,7 +291,9 @@
/**
* Sets the baseDirNames.
- * @param baseDirNames The baseDirNames to set
+ *
+ * @param baseDirNames
+ * The baseDirNames to set
*/
public void setBaseDirNames(String[] baseDirNames) {
this.baseDirNames = baseDirNames;
@@ -308,5 +326,5 @@
public void setFileClasses(int[] fileClasses) {
this.fileClasses = fileClasses;
}
-
+
}
diff -r 633947100c86 -r 67ff8c7fecb9 servlet/src/digilib/io/DocuDirectory.java
--- a/servlet/src/digilib/io/DocuDirectory.java Mon Nov 10 20:50:32 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirectory.java Mon Nov 10 20:59:00 2003 +0100
@@ -57,13 +57,11 @@
*
* Directory names at the given path are appended to the base directories
* from the cache. The directory is checked on disk and isValid is set.
- * If read is true the directory is read and filled.
*
* @see readDir
*
* @param path digilib directory path name
- * @param bd array of base directory names
- * @param read the directory is read and filled
+ * @param cache parent DocuDirCache
*/
public DocuDirectory(String path, DocuDirCache cache) {
this.dirName = path;
@@ -364,11 +362,26 @@
* @return int index of file fn
*/
public int indexOf(String fn, int fc) {
+ if (!isRead()) {
+ // read directory now
+ if (!readDir()) {
+ return -1;
+ }
+ }
// linear search -> worst performance
int n = list[fc].size();
for (int i = 0; i < n; i++) {
ImageFileset fs = (ImageFileset) list[fc].get(i);
if (fs.getName().equals(fn)) {
+ // filename matches
+ return i;
+ }
+ }
+ // try again without extension
+ for (int i = 0; i < n; i++) {
+ ImageFileset fs = (ImageFileset) list[fc].get(i);
+ if (fs.getBasename().equals(FileOps.basename(fn))) {
+ // basename matches
return i;
}
}
diff -r 633947100c86 -r 67ff8c7fecb9 servlet/src/digilib/io/DocuDirent.java
--- a/servlet/src/digilib/io/DocuDirent.java Mon Nov 10 20:50:32 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirent.java Mon Nov 10 20:59:00 2003 +0100
@@ -78,7 +78,10 @@
}
}
- /** The name of the (hires) image file.
+ /** The name of the file.
+ *
+ * If this is a Fileset, the method returns the name of the default file
+ * (for image filesets the highest resolution file).
*
* @return
*/
@@ -87,7 +90,19 @@
return (f != null) ? f.getName() : null;
}
- /** Returns the parent DocuDirectory.
+ /** The filename sans extension.
+ *
+ * @return
+ */
+ public String getBasename() {
+ File f = getFile();
+ if (f == null) {
+ return null;
+ }
+ return FileOps.basename(f.getName());
+ }
+
+ /** Returns the parent Directory.
*
* @return DocuDirectory
*/
@@ -95,15 +110,15 @@
return parent;
}
- /**
- * Sets the parent.
+ /** Sets the parent Directory.
+ *
* @param parent The parent to set
*/
public void setParent(Directory parent) {
this.parent = parent;
}
- /** Returns the meta-data for this fileset.
+ /** Returns the meta-data for this file(set).
*
* @return HashMap
*/
@@ -111,8 +126,8 @@
return fileMeta;
}
- /**
- * Sets the fileMeta.
+ /** Sets the meta-data for this file(set)
+ * .
* @param fileMeta The fileMeta to set
*/
public void setFileMeta(HashMap fileMeta) {
diff -r 633947100c86 -r 67ff8c7fecb9 servlet/src/digilib/io/FileOps.java
--- a/servlet/src/digilib/io/FileOps.java Mon Nov 10 20:50:32 2003 +0100
+++ b/servlet/src/digilib/io/FileOps.java Mon Nov 10 20:59:00 2003 +0100
@@ -148,6 +148,40 @@
}
return pathArray;
}
+
+ /** Extract the base of a file name (sans extension).
+ *
+ * Returns the filename without the extension. The extension is the part behind
+ * the last dot in the filename. If the filename has no dot the full file name
+ * is returned.
+ *
+ * @param fn
+ * @return
+ */
+ public static String basename(String fn) {
+ int i = fn.lastIndexOf('.');
+ if (i > 0) {
+ return fn.substring(0, i);
+ }
+ return fn;
+ }
+
+ /** Extract the extension of a file name.
+ *
+ * Returns the extension of a file name. The extension is the part behind
+ * the last dot in the filename. If the filename has no dot the empty string
+ * is returned.
+ *
+ * @param fn
+ * @return
+ */
+ public static String extname(String fn) {
+ int i = fn.lastIndexOf('.');
+ if (i > 0) {
+ return fn.substring(i+1);
+ }
+ return "";
+ }
/**
* FileFilter for image types (helper class for getFile)
diff -r 633947100c86 -r 67ff8c7fecb9 servlet/src/digilib/io/ImageFileset.java
--- a/servlet/src/digilib/io/ImageFileset.java Mon Nov 10 20:50:32 2003 +0100
+++ b/servlet/src/digilib/io/ImageFileset.java Mon Nov 10 20:59:00 2003 +0100
@@ -1,16 +1,20 @@
-/*
- * ImageFileset -- digilib image file info class. Digital Image Library
- * servlet components Copyright (C) 2003 Robert Casties
- * (robcast@mail.berlios.de) This program is free software; you can
+/* ImageFileset -- digilib image file info class.
+ * Digital Image Library servlet components
+ * Copyright (C) 2003 Robert Casties (robcast@mail.berlios.de)
+ *
+ * This program is free software; you can
* redistribute it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version. Please read license.txt
- * for the full details. A copy of the GPL may be found at
- * http://www.gnu.org/copyleft/lgpl.html You should have received a copy of
- * the GNU General Public License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA
+ * the License, or (at your option) any later version.
+ *
+ * Please read license.txt for the full details. A copy of the GPL may be
+ * found at http://www.gnu.org/copyleft/lgpl.html
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+
package digilib.io;
import java.io.File;
@@ -74,7 +78,7 @@
}
/**
- * Adds a ImageFile to this Fileset.
+ * Adds an ImageFile to this Fileset.
*
* The files should be added in the order of higher to lower resolutions.
* The first file is considered the hires "original".
diff -r 633947100c86 -r 67ff8c7fecb9 servlet/src/digilib/io/XMLListLoader.java
--- a/servlet/src/digilib/io/XMLListLoader.java Mon Nov 10 20:50:32 2003 +0100
+++ b/servlet/src/digilib/io/XMLListLoader.java Mon Nov 10 20:59:00 2003 +0100
@@ -34,6 +34,17 @@
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
+/** Loads a simple XML list into a HashMap.
+ *
+ * The XML file has an outer list_tag
. Every entry is an
+ * entry_tag
with two attributes: the key_att
+ * key and the value_att
value.
+ *
+ * The file is read by the loadURL
method, that returns a
+ * HashMap with the key-value pairs.
+ *
+ * @author casties
+ */
public class XMLListLoader {
private String listTag = "list";