# HG changeset patch # User robcast # Date 1062433287 -7200 # Node ID bc8df0133c04b26f27039668b365b53ab231ae34 # Parent 84ddd05c95d578860b04440f9781831b072fd092 Servlet version 1.15b1 - information in index.meta works finally for files in subdirectories. diff -r 84ddd05c95d5 -r bc8df0133c04 client/digitallibrary/WEB-INF/lib/DigilibServlet.jar Binary file client/digitallibrary/WEB-INF/lib/DigilibServlet.jar has changed diff -r 84ddd05c95d5 -r bc8df0133c04 servlet/src/digilib/io/Directory.java --- a/servlet/src/digilib/io/Directory.java Tue Aug 26 22:30:02 2003 +0200 +++ b/servlet/src/digilib/io/Directory.java Mon Sep 01 18:21:27 2003 +0200 @@ -1,4 +1,4 @@ -/* Directory -- +/* Directory -- Filesystem directory object Digital Image Library servlet components @@ -30,6 +30,8 @@ public class Directory { // File object pointing to the directory File dir = null; + // parent directory + Directory parent = null; /** Default constructor. * @@ -46,6 +48,15 @@ dir = d; } + /** Constructor taking a File object and a parent. + * + * @param d + */ + public Directory(File dir, Directory parent) { + this.dir = dir; + this.parent = parent; + } + /** Constructor taking a directory name. * * @param d @@ -67,5 +78,20 @@ public void setDir(File dir) { this.dir = dir; } + + /** + * @return + */ + Directory getParent() { + return parent; + } + + /** + * @param parent + */ + void setParent(Directory parent) { + this.parent = parent; + } + } diff -r 84ddd05c95d5 -r bc8df0133c04 servlet/src/digilib/io/DocuDirCache.java --- a/servlet/src/digilib/io/DocuDirCache.java Tue Aug 26 22:30:02 2003 +0200 +++ b/servlet/src/digilib/io/DocuDirCache.java Mon Sep 01 18:21:27 2003 +0200 @@ -70,6 +70,27 @@ } } + /** Add a directory to the cache and check its parents. + * + * @param newDir + */ + public void putDir(DocuDirectory newDir) { + put(newDir); + String parent = newDir.getParentDirName(); + if (parent != null) { + // check the parent in the cache + DocuDirectory pd = (DocuDirectory)map.get(parent); + if (pd == null) { + // the parent is unknown + pd = new DocuDirectory(parent, this); + putDir(pd); + } + newDir.setParent(pd); + } + // update dir in the end + newDir.readParentMeta(); + } + /** Returns the DocuFileset with the pathname fn and the * index in. * @@ -92,10 +113,10 @@ // see if it's a directory File f = new File(baseDirNames[0] + fn); if (f.isDirectory()) { - dd = new DocuDirectory(fn, baseDirNames); + dd = new DocuDirectory(fn, this); if (dd.isValid()) { // add to the cache - put(dd); + putDir(dd); } } else { // maybe it's a file @@ -106,10 +127,10 @@ dd = (DocuDirectory) map.get(d); if (dd == null) { // try to read from disk - dd = new DocuDirectory(d, baseDirNames); + dd = new DocuDirectory(d, this); if (dd.isValid()) { // add to the cache - put(dd); + putDir(dd); } else { // invalid path return null; @@ -156,10 +177,10 @@ // see if it's a directory File f = new File(baseDirNames[0] + fn); if (f.isDirectory()) { - dd = new DocuDirectory(fn, baseDirNames); + dd = new DocuDirectory(fn, this); if (dd.isValid()) { // add to the cache - put(dd); + putDir(dd); } } else { // maybe it's a file @@ -168,10 +189,10 @@ dd = (DocuDirectory) map.get(f.getParent()); if (dd == null) { // try to read from disk - dd = new DocuDirectory(f.getParent(), baseDirNames); + dd = new DocuDirectory(f.getParent(), this); if (dd.isValid()) { // add to the cache - put(dd); + putDir(dd); } else { // invalid path return null; diff -r 84ddd05c95d5 -r bc8df0133c04 servlet/src/digilib/io/DocuDirectory.java --- a/servlet/src/digilib/io/DocuDirectory.java Tue Aug 26 22:30:02 2003 +0200 +++ b/servlet/src/digilib/io/DocuDirectory.java Mon Sep 01 18:21:27 2003 +0200 @@ -39,16 +39,19 @@ private ArrayList list = null; // directory object is valid (has been read) private boolean isValid = false; - // names of base directories - private String[] baseDirNames = null; + // reference of the parent DocuDirCache + private DocuDirCache cache = null; // directory name (digilib canonical form) private String dirName = null; // directory metadata private HashMap dirMeta = null; + // unresolved file metadata + private HashMap unresolvedFileMeta = 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; + /* * constructors @@ -63,34 +66,56 @@ * @param path digilib directory path name * @param bd array of base directory names */ - public DocuDirectory(String path, String[] bd) { - dirName = path; - baseDirNames = bd; + public DocuDirectory(String path, DocuDirCache cache) { + this.dirName = path; + this.cache = cache; readDir(); } /* * other stuff */ + + /** The digilib name of the parent directory. + * + * Returns null if there is no parent. + */ + public String getParentDirName() { + String s = null; + int lastidx = dirName.lastIndexOf("/"); + if (lastidx > 0) { + s = dirName.substring(0, lastidx); + } + return s; + } + /** number of DocuFiles in this directory. + * + */ public int size() { return (list != null) ? list.size() : 0; } + /** Returns the DocuFile at the index. + * + * @param index + * @return + */ public DocuFileset get(int index) { - if ((list == null)||(index >= list.size())) { + if ((list == null) || (index >= list.size())) { return null; - } - return (DocuFileset)list.get(index); + } + return (DocuFileset) list.get(index); } - /** Read the directory and fill this object. + /** Read the filesystem directory and fill this object. * * Clears the List and (re)reads all files. * * @return boolean the directory exists */ public boolean readDir() { + String[] baseDirNames = cache.getBaseDirNames(); // first file extension to try for scaled directories String fext = null; // clear directory first @@ -127,8 +152,7 @@ Arrays.sort(fl); for (int i = 0; i < nf; i++) { String fn = fl[i].getName(); - String fnx = - fn.substring(0, fn.lastIndexOf('.') + 1); + 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(fn, fs, this)); @@ -153,13 +177,11 @@ Iterator exts = FileOps.getImageExtensionIterator(); while (exts.hasNext()) { String s = (String) exts.next(); - f = - new File( - dirs[j].getDir(), - fnx + s); + f = new File(dirs[j].getDir(), fnx + s); // if the file exists, add to the DocuFileset if (f.canRead()) { - fs.add(new DocuFile(f.getName(), fs, dirs[j])); + fs.add( + new DocuFile(f.getName(), fs, dirs[j])); fext = s; break; } @@ -210,18 +232,12 @@ return; } // meta for the directory itself is in the "" bin - dirMeta = (HashMap)fileMeta.remove(""); - // is there meta for other files? + dirMeta = (HashMap) fileMeta.remove(""); + // read meta for files in this directory + readFileMeta(fileMeta, null); + // is there meta for other files left? if (fileMeta.size() > 0) { - // iterate through the list of files - for (Iterator i = list.iterator(); i.hasNext();) { - DocuFileset df = (DocuFileset)i.next(); - // look up meta for this file - HashMap meta = (HashMap)fileMeta.get(df.getName()); - if (meta != null) { - df.setFileMeta(meta); - } - } + unresolvedFileMeta = fileMeta; } } catch (SAXException e) { // TODO Auto-generated catch block @@ -230,7 +246,53 @@ // TODO Auto-generated catch block e.printStackTrace(); } + } + readParentMeta(); + } + /** Read metadata from all known parent directories. + * + */ + public void readParentMeta() { + // check the parent directories for additional file meta + Directory dd = parent; + String path = dir.getName() ; + while (dd != null) { + if (((DocuDirectory)dd).hasUnresolvedFileMeta()) { + readFileMeta(((DocuDirectory)dd).unresolvedFileMeta, path); + } + // prepend parent dir path + path = dd.dir.getName() + "/" + path; + // become next parent + dd = dd.parent; + } + } + + /** Read metadata for the files in this directory. + * + * Takes a HashMap with meta-information, adding the relative path + * before the lookup. + * + * @param fileMeta + * @param relPath + */ + public void readFileMeta(HashMap fileMeta, String relPath) { + if (list == null) { + // there are no files + return; + } + String path = (relPath != null) ? (relPath + "/") : ""; + // iterate through the list of files in this directory + for (Iterator i = list.iterator(); i.hasNext();) { + DocuFileset df = (DocuFileset) i.next(); + // prepend path to the filename + String fn = path + df.getName(); + // look up meta for this file and remove from dir + HashMap meta = (HashMap) fileMeta.remove(fn); + if (meta != null) { + // store meta in file + df.setFileMeta(meta); + } } } @@ -323,4 +385,8 @@ this.dirMeta = dirMeta; } + public boolean hasUnresolvedFileMeta() { + return (this.unresolvedFileMeta != null); + } + } diff -r 84ddd05c95d5 -r bc8df0133c04 servlet/src/digilib/io/XMLMetaLoader.java --- a/servlet/src/digilib/io/XMLMetaLoader.java Tue Aug 26 22:30:02 2003 +0200 +++ b/servlet/src/digilib/io/XMLMetaLoader.java Mon Sep 01 18:21:27 2003 +0200 @@ -117,25 +117,25 @@ String localName, String qName) throws SAXException { - + String name = getName(localName, qName); // exit the tag tags.removeLast(); - - // was it a file.name tag? + + // was it a file/name tag? if (name.equals(fileNameTag) && tags.contains(fileTag)) { // save name as filename - if ((content != null)&&(content.length() > 0)) { - fileName = content.toString(); + if ((content != null) && (content.length() > 0)) { + fileName = content.toString().trim(); } return; } - // was it a file.path tag? + // was it a file/path tag? if (name.equals(filePathTag) && tags.contains(fileTag)) { // save path as filepath - if ((content != null)&&(content.length() > 0)) { - filePath = content.toString(); + if ((content != null) && (content.length() > 0)) { + filePath = content.toString().trim(); } return; } @@ -143,13 +143,16 @@ // was it a file tag? if (name.equals(fileTag)) { // is there meta to save? - if ((meta != null)&&(meta.size() > 0)) { - // file name is either file.path or file.name + if ((meta != null) && (meta.size() > 0)) { + // file name is (optional file/path) / file/name String fn = null; - if (filePath != null) { - fn = filePath; - } else if (fileName != null) { - fn = fileName; + + if (fileName != null) { + if (filePath != null) { + fn = filePath + "/" + fileName; + } else { + fn = fileName; + } } else { // no file name, no file return; @@ -163,20 +166,20 @@ // was it a meta tag outside a file tag? if (name.equals(metaTag) && !tags.contains(fileTag)) { // save meta as dir meta - if ((meta != null)&&(meta.size() > 0)) { + if ((meta != null) && (meta.size() > 0)) { files.put("", meta); } return; } - // is this inside an info tag? + // is this inside an info (=img) tag? if (tags.contains(infoTag)) { // then add whatever this is - if ((content != null)&&(content.length() > 0)) { - meta.put(name, content.toString()); + if ((content != null) && (content.length() > 0)) { + meta.put(name, content.toString().trim()); } } - + } } diff -r 84ddd05c95d5 -r bc8df0133c04 servlet/src/digilib/servlet/Scaler.java --- a/servlet/src/digilib/servlet/Scaler.java Tue Aug 26 22:30:02 2003 +0200 +++ b/servlet/src/digilib/servlet/Scaler.java Mon Sep 01 18:21:27 2003 +0200 @@ -58,7 +58,7 @@ public class Scaler extends HttpServlet { // digilib servlet version (for all components) - public static final String dlVersion = "1.14b1"; + public static final String dlVersion = "1.15b1"; // Utils instance with debuglevel Utils util;