# HG changeset patch
# User robcast
# Date 1070021977 -3600
# Node ID b3f9a7f646c5e84ed21e030f75dfcd0c1d438523
# Parent 26b2a74e2fe54959cb6dec2e7efa27b5dd1d51ec
Servlet version 1.18b3 new Raster servlet
- new Raster servlet for rastering SVG graphics into PNG
- new SVGFile class and accompanying changes
- fixes in DocuDirectory for better handling of other file classes
diff -r 26b2a74e2fe5 -r b3f9a7f646c5 servlet/src/digilib/io/DocuDirCache.java
--- a/servlet/src/digilib/io/DocuDirCache.java Tue Nov 25 19:26:46 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirCache.java Fri Nov 28 13:19:37 2003 +0100
@@ -149,10 +149,10 @@
}
/**
- * Returns the ImageFileset with the pathname fn
and the
+ * Returns the DocuDirent 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 DocuDirent is
* returned and the index is ignored.
*
* @param fn
@@ -214,7 +214,7 @@
if (dd.isValid()) {
try {
return dd.get(n, fc);
- } catch (ArrayIndexOutOfBoundsException e) {
+ } catch (IndexOutOfBoundsException e) {
}
}
return null;
diff -r 26b2a74e2fe5 -r b3f9a7f646c5 servlet/src/digilib/io/DocuDirectory.java
--- a/servlet/src/digilib/io/DocuDirectory.java Tue Nov 25 19:26:46 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirectory.java Fri Nov 28 13:19:37 2003 +0100
@@ -196,15 +196,7 @@
// sort the file names alphabetically and iterate the list
Arrays.sort(fl);
for (int i = 0; i < nf; i++) {
- DocuDirent f = null;
- // what class of file do we have?
- if (fc == FileOps.CLASS_IMAGE) {
- // image file
- f = new ImageFileset(dirs, fl[i], scalext);
- } else if (fc == FileOps.CLASS_TEXT) {
- // text file
- f = new TextFile(fl[i]);
- }
+ DocuDirent f = FileOps.fileForClass(fc, fl[i], dirs, scalext);
// add the file to our list
list[fc].add(f);
f.setParent(this);
@@ -373,7 +365,7 @@
// linear search -> worst performance
int n = list[fc].size();
for (int i = 0; i < n; i++) {
- ImageFileset fs = (ImageFileset) list[fc].get(i);
+ DocuDirent fs = (DocuDirent) list[fc].get(i);
if (fs.getName().equals(fn)) {
// filename matches
return i;
@@ -381,7 +373,7 @@
}
// try again without extension
for (int i = 0; i < n; i++) {
- ImageFileset fs = (ImageFileset) list[fc].get(i);
+ DocuDirent fs = (DocuDirent) list[fc].get(i);
if (fs.getBasename().equals(FileOps.basename(fn))) {
// basename matches
return i;
@@ -390,35 +382,35 @@
return -1;
}
- /** Finds the ImageFileset with the name fn
.
+ /** Finds the DocuDirent with the name fn
.
*
- * Searches the directory for the ImageFileset with the name fn
and returns
+ * Searches the directory for the DocuDirent with the name fn
and returns
* it. Returns null if the file cannot be found.
*
* @param fn filename
- * @return ImageFileset
+ * @return DocuDirent
*/
- public ImageFileset find(String fn) {
+ public DocuDirent find(String fn) {
int fc = FileOps.classForFilename(fn);
int i = indexOf(fn, fc);
if (i >= 0) {
- return (ImageFileset) list[0].get(i);
+ return (DocuDirent) list[0].get(i);
}
return null;
}
- /** Finds the ImageFileset with the name fn
and class fc
.
+ /** Finds the DocuDirent with the name fn
and class fc
.
*
- * Searches the directory for the ImageFileset with the name fn
and returns
+ * Searches the directory for the DocuDirent with the name fn
and returns
* it. Returns null if the file cannot be found.
*
* @param fn filename
- * @return ImageFileset
+ * @return DocuDirent
*/
- public ImageFileset find(String fn, int fc) {
+ public DocuDirent find(String fn, int fc) {
int i = indexOf(fn, fc);
if (i >= 0) {
- return (ImageFileset) list[fc].get(i);
+ return (DocuDirent) list[fc].get(i);
}
return null;
}
diff -r 26b2a74e2fe5 -r b3f9a7f646c5 servlet/src/digilib/io/FileOps.java
--- a/servlet/src/digilib/io/FileOps.java Tue Nov 25 19:26:46 2003 +0100
+++ b/servlet/src/digilib/io/FileOps.java Fri Nov 28 13:19:37 2003 +0100
@@ -1,22 +1,23 @@
-/* FileOps -- Utility class for file operations
-
- Digital Image Library servlet components
-
- Copyright (C) 2001, 2002 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
-
-*/
+/*
+ * FileOps -- Utility class for file operations
+ *
+ * Digital Image Library servlet components
+ *
+ * Copyright (C) 2001, 2002 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
+ *
+ */
package digilib.io;
@@ -51,22 +52,25 @@
"htm",
"text/html",
"xml",
- "text/xml" };
+ "text/xml",
+ "svg",
+ "image/svg+xml" };
public static String[] imageExtensions =
{ "jpg", "jpeg", "jp2", "png", "gif", "tif", "tiff" };
- public static String[] textExtensions =
- { "txt", "html", "htm", "xml"};
-
+ public static String[] textExtensions = { "txt", "html", "htm", "xml" };
+
+ public static String[] svgExtensions = { "svg" };
+
public static final int CLASS_NONE = -1;
public static final int CLASS_IMAGE = 0;
public static final int CLASS_TEXT = 1;
- public static final int NUM_CLASSES = 2;
-
+ public static final int CLASS_SVG = 2;
+ public static final int NUM_CLASSES = 3;
/**
- * get the mime type for a file format (by extension)
+ * get the mime type for a file format (by extension)
*/
public static String mimeForFile(File f) {
String fn = f.getName();
@@ -80,24 +84,25 @@
/**
* get the file class for the filename (by extension)
+ *
* @param fn
* @return
*/
public static int classForFilename(String fn) {
int n = imageExtensions.length;
- for (int i = 0; i < n; i ++) {
+ for (int i = 0; i < n; i++) {
if (fn.toLowerCase().endsWith(imageExtensions[i])) {
return CLASS_IMAGE;
}
}
n = textExtensions.length;
- for (int i = 0; i < n; i ++) {
+ for (int i = 0; i < n; i++) {
if (fn.toLowerCase().endsWith(textExtensions[i])) {
return CLASS_TEXT;
}
}
return CLASS_NONE;
-
+
}
public static Iterator getImageExtensionIterator() {
@@ -107,10 +112,14 @@
public static Iterator getTextExtensionIterator() {
return Arrays.asList(textExtensions).iterator();
}
-
+
+ public static Iterator getSVGExtensionIterator() {
+ return Arrays.asList(svgExtensions).iterator();
+ }
+
/**
- * convert a string with a list of pathnames into an array of strings
- * using the system's path separator string
+ * convert a string with a list of pathnames into an array of strings using
+ * the system's path separator string
*/
public static String[] pathToArray(String paths) {
// split list into directories
@@ -132,13 +141,14 @@
}
return pathArray;
}
-
- /** Extract the base of a file name (sans extension).
+
+ /**
+ * 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.
- *
+ * 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
*/
@@ -150,31 +160,50 @@
return fn;
}
- /** Extract the extension of a file name.
+ /**
+ * 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.
- *
+ * 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 fn.substring(i + 1);
}
return "";
}
/**
- * FileFilter for image types (helper class for getFile)
+ * 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)&&(mimeForFile(f).startsWith("image")));
+ return (
+ (mimeForFile(f) != null)
+ && (mimeForFile(f).startsWith("image")));
+ } else {
+ return false;
+ }
+ }
+ }
+
+ /**
+ * FileFilter for text types (helper class for getFile)
+ */
+ static class TextFileFilter implements FileFilter {
+
+ public boolean accept(File f) {
+ if (f.isFile()) {
+ return (
+ (mimeForFile(f) != null)
+ && (mimeForFile(f).startsWith("text")));
} else {
return false;
}
@@ -182,24 +211,28 @@
}
/**
- * FileFilter for text types (helper class for getFile)
+ * FileFilter for svg types (helper class for getFile).
+ *
*/
- static class TextFileFilter implements FileFilter {
+ static class SVGFileFilter implements FileFilter {
public boolean accept(File f) {
if (f.isFile()) {
- return ((mimeForFile(f) != null)&&(mimeForFile(f).startsWith("text")));
+ return (
+ (mimeForFile(f) != null)
+ && (mimeForFile(f).startsWith("image/svg")));
} else {
return false;
}
}
}
- /** Factory for FileFilters (image or text).
+ /**
+ * Factory for FileFilters (image or text).
*
* @param fileClass
* @return
- */
+ */
public static FileFilter filterForClass(int fileClass) {
if (fileClass == CLASS_IMAGE) {
return new ImageFileFilter();
@@ -207,7 +240,39 @@
if (fileClass == CLASS_TEXT) {
return new TextFileFilter();
}
+ if (fileClass == CLASS_SVG) {
+ return new SVGFileFilter();
+ }
return null;
}
+ /** Factory for DocuDirents based on file class.
+ *
+ * Returns an ImageFileset, TextFile or SVGFile.
+ * baseDirs and scalext are only for ImageFilesets.
+ *
+ * @param fileClass
+ * @param file
+ * @param baseDirs array of base directories (for ImageFileset)
+ * @param scalext first extension to try for scaled images (for ImageFileset)
+ * @return
+ */
+ public static DocuDirent fileForClass(
+ int fileClass,
+ File file,
+ Directory[] baseDirs,
+ String scalext) {
+ // what class of file do we have?
+ if (fileClass == CLASS_IMAGE) {
+ // image file
+ return new ImageFileset(baseDirs, file, scalext);
+ } else if (fileClass == CLASS_TEXT) {
+ // text file
+ return new TextFile(file);
+ } else if (fileClass == CLASS_SVG) {
+ // text file
+ return new SVGFile(file);
+ }
+ return null;
+ }
}