changeset 181:afe7ff98bb71

Servlet version 1.18b1 - new transfer mode "rawfile" with mime-type application/octet-stream - finally proper logging with Log4J! - therefore a lot of debugging-prints changed - the Util class is now useless - ServletOps and FileOps are now purely static
author robcast
date Fri, 21 Nov 2003 00:17:31 +0100
parents bd87f802bea1
children 31367c3c8202
files servlet/src/digilib/Utils.java servlet/src/digilib/auth/AuthOpsImpl.java servlet/src/digilib/auth/HashTree.java servlet/src/digilib/auth/XMLAuthOps.java servlet/src/digilib/image/DocuImageImpl.java servlet/src/digilib/image/ImageLoaderDocuImage.java servlet/src/digilib/image/ImageLoaderImageInfoDocuInfo.java servlet/src/digilib/image/JAIDocuImage.java servlet/src/digilib/image/JAIImageLoaderDocuImage.java servlet/src/digilib/image/JIMIDocuImage.java servlet/src/digilib/io/AliasingDocuDirCache.java servlet/src/digilib/io/DocuDirCache.java servlet/src/digilib/io/DocuDirectory.java servlet/src/digilib/io/DocuDirent.java servlet/src/digilib/io/FileOps.java servlet/src/digilib/io/ImageFileset.java servlet/src/digilib/io/XMLListLoader.java servlet/src/digilib/io/XMLMetaLoader.java servlet/src/digilib/servlet/DigilibConfiguration.java servlet/src/digilib/servlet/DigilibRequest.java servlet/src/digilib/servlet/DocumentBean.java servlet/src/digilib/servlet/Parameter.java servlet/src/digilib/servlet/Scaler.java servlet/src/digilib/servlet/ServletOps.java servlet/src/digilib/servlet/Texter.java
diffstat 25 files changed, 505 insertions(+), 690 deletions(-) [+]
line wrap: on
line diff
--- a/servlet/src/digilib/Utils.java	Fri Nov 21 00:11:18 2003 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*  Utils -- general utility classes for scaler servlet
-
-  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;
-
-public class Utils {
-
-  private int debugLevel = 10;
-
-  public Utils() {
-  }
-
-  public Utils(int dbg) {
-    debugLevel = dbg;
-  }
-  
-  public void setDebugLevel(int lvl) {
-    debugLevel = lvl;
-  }
-  public int getDebugLevel() {
-      return debugLevel;
-  }
-  
-  /**
-   *  Debugging help
-   *    dprintln(1, "blabla");
-   *    will be printed on stdout if debug >= 1
-   */
-  public void dprintln(int dbg, String s) {
-    if (debugLevel >= dbg) {
-      String ind = "";
-      // indent by debuglevel
-      for (int i = 0; i < dbg; i++) {
-        ind += "  ";
-      }
-      System.out.println(ind+s);
-    }
-  }
-}
--- a/servlet/src/digilib/auth/AuthOpsImpl.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/auth/AuthOpsImpl.java	Fri Nov 21 00:17:31 2003 +0100
@@ -20,10 +20,14 @@
 
 package digilib.auth;
 
+import java.util.List;
+import java.util.ListIterator;
+
 import javax.servlet.http.HttpServletRequest;
-import java.util.*;
 
-import digilib.*;
+import org.apache.log4j.Logger;
+
+import digilib.Utils;
 import digilib.servlet.DigilibRequest;
 
 /** Basic implementation of AuthOps interface.
@@ -33,12 +37,11 @@
  */
 public abstract class AuthOpsImpl implements AuthOps {
 
-  /** Local utils object. */    
-  protected Utils util;
-
+	/** general logger for this class */
+	protected Logger logger = Logger.getLogger(this.getClass());
+	
   /** Default constructor. */  
   public AuthOpsImpl() {
-    util = new Utils();
     try {
       init();
     } catch (AuthOpException e) {
@@ -49,7 +52,6 @@
    * @param u utils object.
    */  
   public AuthOpsImpl(Utils u) {
-    util = u;
     try {
       init();
     } catch (AuthOpException e) {
@@ -111,9 +113,9 @@
     String s = "";
     while (r.hasNext()) {
       s = (String)r.next();
-      util.dprintln(5, "Testing role: "+s);
+      logger.debug("Testing role: "+s);
       if (request.isUserInRole(s)) {
-        util.dprintln(5, "Role Authorized");
+      	logger.debug("Role Authorized");
         return true;
       }
     }
@@ -128,9 +130,9 @@
 	String s = "";
 	while (r.hasNext()) {
 	  s = (String)r.next();
-	  util.dprintln(5, "Testing role: "+s);
+	  logger.debug("Testing role: "+s);
 	  if (((HttpServletRequest)request.getServletRequest()).isUserInRole(s)) {
-		util.dprintln(5, "Role Authorized");
+	  	logger.debug("Role Authorized");
 		return true;
 	  }
 	}
--- a/servlet/src/digilib/auth/HashTree.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/auth/HashTree.java	Fri Nov 21 00:17:31 2003 +0100
@@ -57,7 +57,6 @@
         b += twigSep + twig.nextToken();
       }
       m = (String)table.get(b);
-      //System.out.println("CHECK: "+b+" = "+m);
       if (m != null) {
         if (m.indexOf(leafSep) < 0) {
           // single leaf
--- a/servlet/src/digilib/auth/XMLAuthOps.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/auth/XMLAuthOps.java	Fri Nov 21 00:17:31 2003 +0100
@@ -20,12 +20,13 @@
 
 package digilib.auth;
 
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+
 import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-import java.io.*;
 
-import digilib.*;
-import digilib.io.*;
+import digilib.io.XMLListLoader;
 import digilib.servlet.DigilibRequest;
 
 /** Implementation of AuthOps using XML files.
@@ -46,8 +47,7 @@
 	 * @param confFile Configuration file name.
 	 * @throws AuthOpException Exception thrown on error.
 	 */
-	public XMLAuthOps(Utils u, String confFile) throws AuthOpException {
-		util = u;
+	public XMLAuthOps(String confFile) throws AuthOpException {
 		configFile = confFile;
 		init();
 	}
@@ -69,7 +69,7 @@
 	 * @throws AuthOpException Exception thrown on error.
 	 */
 	public void init() throws AuthOpException {
-		util.dprintln(10, "xmlauthops.init (" + configFile + ")");
+		logger.debug("xmlauthops.init (" + configFile + ")");
 		HashMap pathList = null;
 		HashMap ipList = null;
 		try {
@@ -110,9 +110,7 @@
 	 */
 	public List rolesForPath(String filepath, HttpServletRequest request)
 		throws digilib.auth.AuthOpException {
-		util.dprintln(
-			4,
-			"rolesForPath ("
+		logger.debug("rolesForPath ("
 				+ filepath
 				+ ") by ["
 				+ request.getRemoteAddr()
@@ -142,9 +140,7 @@
 	 * @see digilib.auth.AuthOps#rolesForPath(digilib.servlet.DigilibRequest)
 	 */
 	public List rolesForPath(DigilibRequest request) throws AuthOpException {
-		util.dprintln(
-			4,
-			"rolesForPath ("
+		logger.debug("rolesForPath ("
 				+ request.getFilePath()
 				+ ") by ["
 				+ request.getServletRequest().getRemoteAddr()
--- a/servlet/src/digilib/image/DocuImageImpl.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/image/DocuImageImpl.java	Fri Nov 21 00:17:31 2003 +0100
@@ -22,9 +22,11 @@
 
 import java.awt.Rectangle;
 
+import org.apache.log4j.Logger;
+
 import digilib.Utils;
+import digilib.io.FileOpException;
 import digilib.io.ImageFile;
-import digilib.io.FileOpException;
 
 /** Simple abstract implementation of the <code>DocuImage</code> interface.
  *
@@ -36,6 +38,9 @@
  */
 public abstract class DocuImageImpl implements DocuImage {
 
+	/** logger */
+	protected Logger logger = Logger.getLogger(this.getClass());
+	
 	/** Internal utils object. */
 	protected Utils util = null;
 
--- a/servlet/src/digilib/image/ImageLoaderDocuImage.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/image/ImageLoaderDocuImage.java	Fri Nov 21 00:17:31 2003 +0100
@@ -43,7 +43,7 @@
 
 /** Implementation of DocuImage using the ImageLoader API of Java 1.4 and Java2D. */
 public class ImageLoaderDocuImage extends DocuImageImpl {
-
+	
 	/** image object */
 	protected BufferedImage img;
 	/** interpolation type */
@@ -62,10 +62,10 @@
 		quality = qual;
 		// setup interpolation quality
 		if (qual > 0) {
-			util.dprintln(4, "quality q1");
+			logger.debug("quality q1");
 			interpol = AffineTransformOp.TYPE_BILINEAR;
 		} else {
-			util.dprintln(4, "quality q0");
+			logger.debug("quality q0");
 			interpol = AffineTransformOp.TYPE_NEAREST_NEIGHBOR;
 		}
 	}
@@ -79,7 +79,7 @@
 				h = img.getHeight();
 			}
 		} catch (IOException e) {
-			e.printStackTrace();
+			logger.debug("error in getHeight", e);
 		}
 		return h;
 	}
@@ -93,19 +93,18 @@
 				w = img.getWidth();
 			}
 		} catch (IOException e) {
-			e.printStackTrace();
+			logger.debug("error in getHeight", e);
 		}
 		return w;
 	}
 
 	/* load image file */
 	public void loadImage(ImageFile f) throws FileOpException {
-		util.dprintln(10, "loadImage!");
+		logger.debug("loadImage!");
 		//System.gc();
 		try {
 			img = ImageIO.read(f.getFile());
 			if (img == null) {
-				util.dprintln(3, "ERROR(loadImage): unable to load file");
 				throw new FileOpException("Unable to load File!");
 			}
 		} catch (IOException e) {
@@ -129,14 +128,13 @@
 		Iterator readers = ImageIO.getImageReadersByMIMEType(f.getMimetype());
 		reader = (ImageReader) readers.next();
 		/* are there more readers? */
-		System.out.println("this reader: " + reader.getClass());
+		logger.debug("this reader: " + reader.getClass());
 		while (readers.hasNext()) {
-			System.out.println("next reader: " + readers.next().getClass());
+			logger.debug("next reader: " + readers.next().getClass());
 		}
 		//*/
 		reader.setInput(istream);
 		if (reader == null) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
 		}
 		imgFile = f.getFile();
@@ -157,11 +155,9 @@
 			// read image
 			img = reader.read(0, readParam);
 		} catch (IOException e) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
 		}
 		if (img == null) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
 		}
 	}
@@ -169,7 +165,7 @@
 	/* write image of type mt to Stream */
 	public void writeImage(String mt, OutputStream ostream)
 		throws FileOpException {
-		util.dprintln(10, "writeImage!");
+		logger.debug("writeImage!");
 		try {
 			// setup output
 			String type = "png";
@@ -179,7 +175,6 @@
 				type = "png";
 			} else {
 				// unknown mime type
-				util.dprintln(2, "ERROR(writeImage): Unknown mime type " + mt);
 				throw new FileOpException("Unknown mime type: " + mt);
 			}
 
@@ -188,7 +183,7 @@
 			 * image to RGB :-( *Java2D BUG*
 			 */
 			if ((type == "jpeg") && (img.getColorModel().hasAlpha())) {
-				util.dprintln(2, "BARF: JPEG with transparency!!");
+				logger.debug("BARF: JPEG with transparency!!");
 				int w = img.getWidth();
 				int h = img.getHeight();
 				// BufferedImage.TYPE_INT_RGB seems to be fastest (JDK1.4.1,
@@ -207,7 +202,6 @@
 				throw new FileOpException("Error writing image: Unknown image format!");
 			}
 		} catch (IOException e) {
-			// e.printStackTrace();
 			throw new FileOpException("Error writing image.");
 		}
 	}
@@ -236,16 +230,13 @@
 		}
 		scaledImg = scaleOp.filter(img, scaledImg);
 		//DEBUG
-		util.dprintln(
-			3,
-			"SCALE: "
+		logger.debug("SCALE: "
 				+ scale
 				+ " ->"
 				+ scaledImg.getWidth()
 				+ "x"
 				+ scaledImg.getHeight());
 		if (scaledImg == null) {
-			util.dprintln(2, "ERROR(cropAndScale): error in scale");
 			throw new ImageOpException("Unable to scale");
 		}
 		img = scaledImg;
@@ -253,7 +244,7 @@
 
 	public void blur(int radius) throws ImageOpException {
 		//DEBUG
-		util.dprintln(4, "blur: " + radius);
+		logger.debug("blur: " + radius);
 		// minimum radius is 2
 		int klen = Math.max(radius, 2);
 		int ksize = klen * klen;
@@ -277,7 +268,6 @@
 		}
 		blurredImg = blurOp.filter(img, blurredImg);
 		if (blurredImg == null) {
-			util.dprintln(2, "ERROR(cropAndScale): error in scale");
 			throw new ImageOpException("Unable to scale");
 		}
 		img = blurredImg;
@@ -287,14 +277,11 @@
 		throws ImageOpException {
 		// setup Crop
 		BufferedImage croppedImg = img.getSubimage(x_off, y_off, width, height);
-		util.dprintln(
-			3,
-			"CROP:" + croppedImg.getWidth() + "x" + croppedImg.getHeight());
+		logger.debug("CROP:" + croppedImg.getWidth() + "x" + croppedImg.getHeight());
 		//DEBUG
 		//    util.dprintln(2, " time
 		// "+(System.currentTimeMillis()-startTime)+"ms");
 		if (croppedImg == null) {
-			util.dprintln(2, "ERROR(cropAndScale): error in crop");
 			throw new ImageOpException("Unable to crop");
 		}
 		img = croppedImg;
@@ -330,9 +317,7 @@
 
 		int ncol = img.getColorModel().getNumColorComponents();
 		if ((ncol != 3) || (rgbm.length != 3) || (rgba.length != 3)) {
-			util.dprintln(
-				2,
-				"ERROR(enhance): unknown number of color bands or coefficients ("
+			logger.debug("ERROR(enhance): unknown number of color bands or coefficients ("
 					+ ncol
 					+ ")");
 			return;
@@ -410,7 +395,6 @@
 		// calculate new bounding box
 		//Rectangle2D bounds = rotOp.getBounds2D(img);
 		if (rotImg == null) {
-			util.dprintln(2, "ERROR: error in rotate");
 			throw new ImageOpException("Unable to rotate");
 		}
 		img = rotImg;
@@ -450,7 +434,6 @@
 				interpol);
 		BufferedImage mirImg = mirOp.filter(img, null);
 		if (mirImg == null) {
-			util.dprintln(2, "ERROR: error in mirror");
 			throw new ImageOpException("Unable to mirror");
 		}
 		img = mirImg;
@@ -458,7 +441,6 @@
 
 	/* (non-Javadoc) @see java.lang.Object#finalize() */
 	protected void finalize() throws Throwable {
-		//System.out.println("FIN de ImageLoaderDocuImage!");
 		// we must dispose the ImageReader because it keeps the filehandle
 		// open!
 		reader.dispose();
--- a/servlet/src/digilib/image/ImageLoaderImageInfoDocuInfo.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/image/ImageLoaderImageInfoDocuInfo.java	Fri Nov 21 00:17:31 2003 +0100
@@ -29,6 +29,7 @@
 import javax.imageio.ImageReader;
 import javax.imageio.stream.ImageInputStream;
 
+import org.apache.log4j.Logger;
 import org.marcoschmidt.image.ImageInfo;
 
 import digilib.io.FileOpException;
@@ -41,6 +42,8 @@
  *
  */
 public class ImageLoaderImageInfoDocuInfo implements DocuInfo {
+	
+	private Logger logger = Logger.getLogger(this.getClass());
 
 	/* check image size and type and store in ImageFile f */
 	public boolean checkFile(ImageFile imgf) throws IOException {
@@ -76,9 +79,9 @@
 			}
 			ImageReader reader = (ImageReader) readers.next();
 			/* are there more readers? */
-			System.out.println("this reader: " + reader.getClass());
+			logger.debug("this reader: " + reader.getClass());
 			while (readers.hasNext()) {
-				System.out.println("next reader: " + readers.next().getClass());
+				logger.debug("next reader: " + readers.next().getClass());
 			}
 			reader.setInput(istream);
 			ImageSize d =
--- a/servlet/src/digilib/image/JAIDocuImage.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/image/JAIDocuImage.java	Fri Nov 21 00:17:31 2003 +0100
@@ -60,7 +60,6 @@
 		System.gc();
 		img = JAI.create("fileload", f.getFile().getAbsolutePath());
 		if (img == null) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
 		}
 	}
@@ -79,7 +78,6 @@
 				pb3.add("PNG");
 			} else {
 				// unknown mime type
-				util.dprintln(2, "ERROR(writeImage): Unknown mime type " + mt);
 				throw new FileOpException("Unknown mime type: " + mt);
 			}
 			// render output
@@ -97,13 +95,13 @@
 		quality = qual;
 		// setup interpolation quality
 		if (qual > 1) {
-			util.dprintln(4, "quality q2");
+			logger.debug("quality q2");
 			interpol = Interpolation.getInstance(Interpolation.INTERP_BICUBIC);
 		} else if (qual == 1) {
-			util.dprintln(4, "quality q1");
+			logger.debug("quality q1");
 			interpol = Interpolation.getInstance(Interpolation.INTERP_BILINEAR);
 		} else {
-			util.dprintln(4, "quality q0");
+			logger.debug("quality q0");
 			interpol = Interpolation.getInstance(Interpolation.INTERP_NEAREST);
 		}
 	}
@@ -152,16 +150,14 @@
 		}
 
 		//DEBUG
-		util.dprintln(
-			3,
-			"SCALE: " + scale + " ->" + img.getWidth() + "x" + img.getHeight());
+		logger.debug("SCALE: " + scale + " ->" + img.getWidth() + "x" + img.getHeight());
 
 	}
 
 	public void scaleAll(float scale) throws ImageOpException {
 		RenderedImage scaledImg;
 		//DEBUG
-		util.dprintln(4, "scaleAll: " + scale);
+		logger.debug("scaleAll: " + scale);
 		ParameterBlockJAI param = new ParameterBlockJAI("Scale");
 		param.addSource(img);
 		param.setParameter("xScale", scale);
@@ -176,7 +172,6 @@
 		scaledImg = JAI.create("Scale", param, hint);
 
 		if (scaledImg == null) {
-			util.dprintln(2, "ERROR(scale): error in scale");
 			throw new ImageOpException("Unable to scale");
 		}
 		img = scaledImg;
@@ -185,7 +180,7 @@
 	public void blur(int radius) throws ImageOpException {
 		RenderedImage blurredImg;
 		//DEBUG
-		util.dprintln(4, "blur: " + radius);
+		logger.debug("blur: " + radius);
 		int klen = Math.max(radius, 2);
 		int ksize = klen * klen;
 		float f = 1f / ksize;
@@ -204,7 +199,6 @@
 				BorderExtender.createInstance(BorderExtender.BORDER_COPY));
 		blurredImg = JAI.create("Convolve", param, hint);
 		if (blurredImg == null) {
-			util.dprintln(2, "ERROR(scale): error in scale");
 			throw new ImageOpException("Unable to scale");
 		}
 		img = blurredImg;
@@ -213,7 +207,7 @@
 	public void scaleBinary(float scale) throws ImageOpException {
 		RenderedImage scaledImg;
 		//DEBUG
-		util.dprintln(4, "scaleBinary: " + scale);
+		logger.debug("scaleBinary: " + scale);
 		ParameterBlockJAI param =
 			new ParameterBlockJAI("SubsampleBinaryToGray");
 		param.addSource(img);
@@ -227,7 +221,6 @@
 		// scale
 		scaledImg = JAI.create("SubsampleBinaryToGray", param, hint);
 		if (scaledImg == null) {
-			util.dprintln(2, "ERROR(scale): error in scale");
 			throw new ImageOpException("Unable to scale");
 		}
 		img = scaledImg;
@@ -245,9 +238,7 @@
 		param.add((float) height);
 		RenderedImage croppedImg = JAI.create("crop", param);
 
-		util.dprintln(
-			3,
-			"CROP: "
+		logger.debug("CROP: "
 				+ x_off
 				+ ","
 				+ y_off
@@ -262,7 +253,6 @@
 		//DEBUG
 
 		if (croppedImg == null) {
-			util.dprintln(2, "ERROR(crop): error in crop");
 			throw new ImageOpException("Unable to crop");
 		}
 		img = croppedImg;
@@ -312,9 +302,7 @@
 			rotImg = JAI.create("rotate", param);
 		}
 
-		util.dprintln(
-			3,
-			"ROTATE: "
+		logger.debug("ROTATE: "
 				+ x
 				+ ","
 				+ y
@@ -330,7 +318,6 @@
 		//DEBUG
 
 		if (rotImg == null) {
-			util.dprintln(2, "ERROR: error in rotate");
 			throw new ImageOpException("Unable to rotate");
 		}
 		img = rotImg;
@@ -366,7 +353,6 @@
 		mirImg = JAI.create("transpose", param);
 
 		if (mirImg == null) {
-			util.dprintln(2, "ERROR(mirror): error in flip");
 			throw new ImageOpException("Unable to flip");
 		}
 		img = mirImg;
@@ -384,9 +370,7 @@
 		param.add(aa);
 		enhImg = JAI.create("rescale", param);
 
-		util.dprintln(
-			3,
-			"ENHANCE: *"
+		logger.debug("ENHANCE: *"
 				+ mult
 				+ ", +"
 				+ add
@@ -397,7 +381,6 @@
 		//DEBUG
 
 		if (enhImg == null) {
-			util.dprintln(2, "ERROR(enhance): error in enhance");
 			throw new ImageOpException("Unable to enhance");
 		}
 		img = enhImg;
@@ -423,9 +406,7 @@
 		param.add(aa);
 		enhImg = JAI.create("rescale", param);
 
-		util.dprintln(
-			3,
-			"ENHANCE_RGB: *"
+		logger.debug("ENHANCE_RGB: *"
 				+ rgbm
 				+ ", +"
 				+ rgba
@@ -436,7 +417,6 @@
 		//DEBUG
 
 		if (enhImg == null) {
-			util.dprintln(2, "ERROR(enhance): error in enhanceRGB");
 			throw new ImageOpException("Unable to enhanceRGB");
 		}
 		img = enhImg;
--- a/servlet/src/digilib/image/JAIImageLoaderDocuImage.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/image/JAIImageLoaderDocuImage.java	Fri Nov 21 00:17:31 2003 +0100
@@ -61,7 +61,7 @@
 				h = img.getHeight();
 			}
 		} catch (IOException e) {
-			e.printStackTrace();
+			logger.debug("error in getHeight", e);
 		}
 		return h;
 	}
@@ -75,7 +75,7 @@
 				w = img.getWidth();
 			}
 		} catch (IOException e) {
-			e.printStackTrace();
+			logger.debug("error in getHeight", e);
 		}
 		return w;
 	}
@@ -85,7 +85,6 @@
 		System.gc();
 		img = JAI.create("ImageRead", f.getFile().getAbsolutePath());
 		if (img == null) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
 		}
 	}
@@ -100,7 +99,6 @@
 		reader = (ImageReader) readers.next();
 		reader.setInput(istream);
 		if (reader == null) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
 		}
 	}
@@ -126,11 +124,9 @@
 			img = JAI.create("imageread", pb);
 			*/
 		} catch (IOException e) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
 		}
 		if (img == null) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
 		}
 		imgFile = f.getFile();
@@ -151,7 +147,6 @@
 				pb3.add("PNG");
 			} else {
 				// unknown mime type
-				util.dprintln(2, "ERROR(writeImage): Unknown mime type " + mt);
 				throw new FileOpException("Unknown mime type: " + mt);
 			}
 			// render output
@@ -165,7 +160,6 @@
 	 * @see java.lang.Object#finalize()
 	 */
 	protected void finalize() throws Throwable {
-		//System.out.println("FIN de JAIImageLoaderDocuImage!");
 		// we must dispose the ImageReader because it keeps the filehandle open!
 		reader.dispose();
 		reader = null;
--- a/servlet/src/digilib/image/JIMIDocuImage.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/image/JIMIDocuImage.java	Fri Nov 21 00:17:31 2003 +0100
@@ -58,13 +58,13 @@
 		try {
 			img = Jimi.getRasterImage(f.getFile().toURL());
 		} catch (java.net.MalformedURLException e) {
-			util.dprintln(3, "ERROR(loadImage): MalformedURLException");
+			logger.debug("ERROR(loadImage): MalformedURLException");
 		} catch (JimiException e) {
-			util.dprintln(3, "ERROR(loadImage): JIMIException");
+			logger.debug("ERROR(loadImage): JIMIException");
 			throw new FileOpException("Unable to load File!" + e);
 		}
 		if (img == null) {
-			util.dprintln(3, "ERROR(loadImage): unable to load file");
+			logger.debug("ERROR(loadImage): unable to load file");
 			throw new FileOpException("Unable to load File!");
 		}
 		imgp = img.getImageProducer();
@@ -102,17 +102,16 @@
 
 		// setup scale and interpolation quality
 		if (quality > 0) {
-			util.dprintln(4, "quality q1");
+			logger.debug("quality q1");
 			scaleFilter = new AreaAverageScaleFilter(destWidth, destHeight);
 		} else {
-			util.dprintln(4, "quality q0");
+			logger.debug("quality q0");
 			scaleFilter = new ReplicatingScaleFilter(destWidth, destHeight);
 		}
 
 		ImageProducer scaledImg = new FilteredImageSource(imgp, scaleFilter);
 
 		if (scaledImg == null) {
-			util.dprintln(2, "ERROR(cropAndScale): error in scale");
 			throw new ImageOpException("Unable to scale");
 		}
 
@@ -126,10 +125,8 @@
 		// setup Crop
 		ImageProducer croppedImg =
 			img.getCroppedImageProducer(x_off, y_off, width, height);
-		//util.dprintln(3, "CROP:"+croppedImg.getWidth()+"x"+croppedImg.getHeight()); //DEBUG
 
 		if (croppedImg == null) {
-			util.dprintln(2, "ERROR(cropAndScale): error in crop");
 			throw new ImageOpException("Unable to crop");
 		}
 		imgp = croppedImg;
--- a/servlet/src/digilib/io/AliasingDocuDirCache.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/io/AliasingDocuDirCache.java	Fri Nov 21 00:17:31 2003 +0100
@@ -85,7 +85,7 @@
 	 */
 	public void putName(String name, DocuDirectory newdir) {
 		if (map.containsKey(name)) {
-			System.out.println("Baah, duplicate key in AliasingDocuDirCache.put!");
+			logger.warn("Baah, duplicate key in AliasingDocuDirCache.put!");
 		} else {
 			map.put(name, newdir);
 		}
--- a/servlet/src/digilib/io/DocuDirCache.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirCache.java	Fri Nov 21 00:17:31 2003 +0100
@@ -28,11 +28,15 @@
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.log4j.Logger;
+
 /**
  * @author casties
  */
 public class DocuDirCache {
 
+	/** general logger for this class */
+	protected Logger logger = Logger.getLogger(this.getClass());
 	/** HashMap of directories */
 	protected HashMap map = null;
 	/** names of base directories */
@@ -88,7 +92,7 @@
 	public void put(DocuDirectory newdir) {
 		String s = newdir.getDirName();
 		if (map.containsKey(s)) {
-			System.out.println("Baah, duplicate key in DocuDirCache.put!");
+			logger.warn("Baah, duplicate key in DocuDirCache.put!");
 		} else {
 			map.put(s, newdir);
 			numFiles += newdir.size();
--- a/servlet/src/digilib/io/DocuDirectory.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirectory.java	Fri Nov 21 00:17:31 2003 +0100
@@ -255,11 +255,13 @@
 					unresolvedFileMeta = fileMeta;
 				}
 			} catch (SAXException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
+				if (cache != null) {
+					cache.logger.warn("error parsing index.meta", e);
+				}
 			} catch (IOException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
+				if (cache != null) {
+					cache.logger.warn("error reading index.meta", e);
+				}
 			}
 		}
 		readParentMeta();
--- a/servlet/src/digilib/io/DocuDirent.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/io/DocuDirent.java	Fri Nov 21 00:17:31 2003 +0100
@@ -1,38 +1,42 @@
-/* DocuDirent.java --  Abstract directory entry in a DocuDirectory
-
-  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
-
+/*
+ * DocuDirent.java -- Abstract directory entry in a DocuDirectory
+ * 
+ * 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 15.09.2003 by casties
- *
+ *  
  */
 package digilib.io;
 
 import java.io.File;
 import java.util.HashMap;
 
-/** Abstract directory entry in a DocuDirectory.
+import org.apache.log4j.Logger;
+
+/**
+ * Abstract directory entry in a DocuDirectory.
  * 
  * @author casties
- *
+ *  
  */
 public abstract class DocuDirent {
 
 	/** the file class of this file */
-	protected static int fileClass = FileOps.CLASS_NONE; 
+	protected static int fileClass = FileOps.CLASS_NONE;
 	/** HashMap with metadata */
 	protected HashMap fileMeta = null;
 	/** Is the Metadata valid */
@@ -40,19 +44,22 @@
 	/** the parent directory */
 	protected Directory parent = null;
 
-	/** Checks metadata and does something with it.
-	 * 
+	/**
+	 * Checks metadata and does something with it.
+	 *  
 	 */
 	public abstract void checkMeta();
 
 	/**
 	 * gets the (default) File
+	 * 
 	 * @return
 	 */
 	public abstract File getFile();
 
-	/** Reads meta-data for this Fileset if there is any.
-	 * 
+	/**
+	 * Reads meta-data for this Fileset if there is any.
+	 *  
 	 */
 	public void readMeta() {
 		if ((fileMeta != null) || (getFile() != null)) {
@@ -72,15 +79,15 @@
 				}
 				fileMeta = (HashMap) meta.get(getName());
 			} catch (Exception e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
+				Logger.getLogger(this.getClass()).warn("error reading index.meta", e);
 			}
 		}
 	}
 
-	/** The name of the file.
+	/**
+	 * The name of the file.
 	 * 
-	 * If this is a Fileset, the method returns the name of the default file 
+	 * If this is a Fileset, the method returns the name of the default file
 	 * (for image filesets the highest resolution file).
 	 * 
 	 * @return
@@ -88,62 +95,55 @@
 	public String getName() {
 		File f = getFile();
 		return (f != null) ? f.getName() : null;
-	}
-
-	/** The filename sans extension.
-	 * 
-	 * @return
-	 */
+	} /**
+	   * 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
-	 */
+	} /**
+	   * Returns the parent Directory.
+	   * 
+	   * @return DocuDirectory
+	   */
 	public Directory getParent() {
 		return parent;
-	}
-
-	/** Sets the parent Directory.
-	 * 
-	 * @param parent The parent to set
-	 */
+	} /**
+	   * Sets the parent Directory.
+	   * 
+	   * @param parent
+	   *            The parent to set
+	   */
 	public void setParent(Directory parent) {
 		this.parent = parent;
-	}
-
-	/** Returns the meta-data for this file(set).
-	 * 
-	 * @return HashMap
-	 */
+	} /**
+	   * Returns the meta-data for this file(set).
+	   * 
+	   * @return HashMap
+	   */
 	public HashMap getFileMeta() {
 		return fileMeta;
-	}
-
-	/** Sets the meta-data for this file(set)
-	 * .
-	 * @param fileMeta The fileMeta to set
-	 */
+	} /**
+	   * Sets the meta-data for this file(set) .
+	   * 
+	   * @param fileMeta
+	   *            The fileMeta to set
+	   */
 	public void setFileMeta(HashMap fileMeta) {
 		this.fileMeta = fileMeta;
-	}
-
-	/**
-	 * @return
-	 */
+	} /**
+	   * @return
+	   */
 	public boolean isMetaChecked() {
 		return metaChecked;
-	}
-
-	/**
-	 * @return
-	 */
+	} /**
+	   * @return
+	   */
 	public static int getFileClass() {
 		return fileClass;
 	}
--- a/servlet/src/digilib/io/FileOps.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/io/FileOps.java	Fri Nov 21 00:17:31 2003 +0100
@@ -69,18 +69,6 @@
 	public static final int NUM_CLASSES = 2;
 	
 
-	public FileOps() {
-		util = new Utils();
-	}
-
-	public FileOps(Utils u) {
-		util = u;
-	}
-
-	public void setUtils(Utils u) {
-		util = u;
-	}
-
 	/**
 	 *  get the mime type for a file format (by extension)
 	 */
--- a/servlet/src/digilib/io/ImageFileset.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/io/ImageFileset.java	Fri Nov 21 00:17:31 2003 +0100
@@ -145,8 +145,6 @@
 					return f;
 				}
 			} catch (IOException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
 			}
 		}
 		return null;
@@ -175,8 +173,6 @@
 					return f;
 				}
 			} catch (IOException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
 			}
 		}
 		return null;
--- a/servlet/src/digilib/io/XMLListLoader.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/io/XMLListLoader.java	Fri Nov 21 00:17:31 2003 +0100
@@ -29,6 +29,7 @@
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.apache.log4j.Logger;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
@@ -47,6 +48,7 @@
  */
 public class XMLListLoader {
 
+	private Logger logger = Logger.getLogger(this.getClass());
 	private String listTag = "list";
 	private String entryTag = "entry";
 	private String keyAtt = "key";
@@ -60,7 +62,7 @@
 		String entry_tag,
 		String key_att,
 		String value_att) {
-		//System.out.println("xmlListLoader("+list_tag+","+entry_tag+","+key_att+","+value_att+")");
+		logger.debug("xmlListLoader("+list_tag+","+entry_tag+","+key_att+","+value_att+")");
 		listTag = list_tag;
 		entryTag = entry_tag;
 		keyAtt = key_att;
@@ -100,8 +102,7 @@
 			if (qName.equals(entryTag)) {
 				// is it inside a list tag?
 				if ((listTag.length() > 0) && (!tagSpace.contains(listTag))) {
-					System.out.println(
-						"BOO: Entry "
+					logger.error("BOO: Entry "
 							+ entryTag
 							+ " not inside list "
 							+ listTag);
@@ -113,8 +114,7 @@
 				String key = atts.getValue(keyAtt);
 				String val = atts.getValue(valueAtt);
 				if ((key == null) || (val == null)) {
-					System.out.println(
-						"BOO: Entry "
+					logger.error("BOO: Entry "
 							+ entryTag
 							+ " does not have Attributes "
 							+ keyAtt
--- a/servlet/src/digilib/io/XMLMetaLoader.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/io/XMLMetaLoader.java	Fri Nov 21 00:17:31 2003 +0100
@@ -28,12 +28,14 @@
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.apache.log4j.Logger;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 
 public class XMLMetaLoader {
 
+	private Logger logger = Logger.getLogger(this.getClass());
 	private String outerTag = "resource";
 	private String metaTag = "meta";
 	private String fileTag = "file";
--- a/servlet/src/digilib/servlet/DigilibConfiguration.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/servlet/DigilibConfiguration.java	Fri Nov 21 00:17:31 2003 +0100
@@ -1,22 +1,23 @@
-/* DigilibConfiguration -- Holding all parameters for digilib servlet.
-
-  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
-
-*/
+/*
+ * DigilibConfiguration -- Holding all parameters for digilib servlet.
+ * 
+ * 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.servlet;
 
@@ -27,7 +28,10 @@
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 
-import digilib.Utils;
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Logger;
+import org.apache.log4j.xml.DOMConfigurator;
+
 import digilib.auth.AuthOps;
 import digilib.auth.XMLAuthOps;
 import digilib.image.DocuImage;
@@ -37,52 +41,58 @@
 import digilib.io.FileOps;
 import digilib.io.XMLListLoader;
 
-/** Class to hold the digilib servlet configuration parameters.
- * The parameters can be read from the digilib-config file and be passed to
- * other servlets or beans.<br>
- * errorImgFileName: image file to send in case of error.<br>
- * denyImgFileName: image file to send if access is denied.<br>
- * baseDirs: array of base directories in order of preference (prescaled
- * versions first).<br>
- * useAuth: use authentication information.<br>
- * authConfPath: authentication configuration file.<br>
- * authOp: AuthOps instance for authentication.<br>
- * ...<br>
+/**
+ * Class to hold the digilib servlet configuration parameters. The parameters
+ * can be read from the digilib-config file and be passed to other servlets or
+ * beans. <br>errorImgFileName: image file to send in case of error. <br>
+ * denyImgFileName: image file to send if access is denied. <br>baseDirs:
+ * array of base directories in order of preference (prescaled versions first).
+ * <br>useAuth: use authentication information. <br>authConfPath:
+ * authentication configuration file. <br>authOp: AuthOps instance for
+ * authentication. <br>... <br>
  * 
  * @author casties
- *
+ *  
  */
 public class DigilibConfiguration extends ParameterMap {
-	
+
 	/** DocuImage class instance */
 	private Class docuImageClass = null;
-	
-	/** Utils instance */
-	private Utils util = new Utils(5);
+
+	/** Log4J logger */
+	private Logger logger = Logger.getLogger("digilib.config");
 
-
-	/** Default constructor defines all parameters and their default values.
-	 * 
+	/**
+	 * Default constructor defines all parameters and their default values.
+	 *  
 	 */
 	public DigilibConfiguration() {
 		// create HashMap(20)
 		super(20);
-
+		// we start with a default logger config
+		BasicConfigurator.configure();
+		
 		/*
-		 * Definition of parameters and default values.
-		 * System parameters that are not read from config file have a type 's'.
+		 * Definition of parameters and default values. System parameters that
+		 * are not read from config file have a type 's'.
 		 */
-		 
+
 		// digilib servlet version
-		putParameter("servlet.version", digilib.servlet.Scaler.dlVersion, null, 's');
+		putParameter(
+			"servlet.version",
+			digilib.servlet.Scaler.dlVersion,
+			null,
+			's');
 		// configuration file location
 		putParameter("servlet.config.file", null, null, 's');
-		// Utils instance
-		putParameter("servlet.util", util, null, 's');
 		// DocuDirCache instance
 		putParameter("servlet.dir.cache", null, null, 's');
 		// DocuImage class instance
-		putParameter("servlet.docuimage.class", digilib.image.JAIDocuImage.class, null, 's');
+		putParameter(
+			"servlet.docuimage.class",
+			digilib.image.JAIDocuImage.class,
+			null,
+			's');
 		// AuthOps instance for authentication
 		putParameter("servlet.auth.op", null, null, 's');
 
@@ -91,9 +101,17 @@
 		 */
 
 		// image file to send in case of error
-		putParameter("error-image", "/docuserver/images/icons/scalerror.gif", null, 'f');
+		putParameter(
+			"error-image",
+			"/docuserver/images/icons/scalerror.gif",
+			null,
+			'f');
 		// image file to send if access is denied
-		putParameter("denied-image", "/docuserver/images/icons/denied.gif", null, 'f');
+		putParameter(
+			"denied-image",
+			"/docuserver/images/icons/denied.gif",
+			null,
+			'f');
 		// base directories in order of preference (prescaled versions last)
 		String[] bd = { "/docuserver/images", "/docuserver/scaled/small" };
 		putParameter("basedir-list", bd, null, 'f');
@@ -106,7 +124,11 @@
 		// Debug level
 		putParameter("debug-level", new Integer(5), null, 'f');
 		// Type of DocuImage instance
-		putParameter("docuimage-class", "digilib.image.JAIDocuImage", null, 'f');
+		putParameter(
+			"docuimage-class",
+			"digilib.image.JAIDocuImage",
+			null,
+			'f');
 		// part of URL used to indicate authorized access
 		putParameter("auth-url-path", "authenticated/", null, 'f');
 		// degree of subsampling on image load
@@ -117,11 +139,14 @@
 		putParameter("use-mapping", Boolean.FALSE, null, 'f');
 		// mapping file location
 		putParameter("mapping-file", "digilib-map.xml", null, 'f');
+		// log4j config file location
+		putParameter("log-config-file", "log4j-config.xml", null, 'f');
+
 	}
 
-	/** Constructor taking a ServletConfig.
-	 * Reads the config file location from an init parameter and loads the
-	 * config file. Calls <code>readConfig()</code>.
+	/**
+	 * Constructor taking a ServletConfig. Reads the config file location from
+	 * an init parameter and loads the config file. Calls <code>readConfig()</code>.
 	 * 
 	 * @see readConfig()
 	 */
@@ -129,16 +154,15 @@
 		this();
 		readConfig(c);
 	}
-	
+
 	/**
 	 * read parameter list from the XML file in init parameter "config-file"
 	 */
 	public void readConfig(ServletConfig c) throws Exception {
-				
+
 		/*
-		 * Get config file name.
-		 * The file name is first looked for as an init parameter, then in a fixed location
-		 * in the webapp.
+		 * Get config file name. The file name is first looked for as an init
+		 * parameter, then in a fixed location in the webapp.
 		 */
 		if (c == null) {
 			// no config no file...
@@ -146,10 +170,11 @@
 		}
 		String fn = c.getInitParameter("config-file");
 		if (fn == null) {
-			fn = c.getServletContext().getRealPath("WEB-INF/digilib-config.xml");
+			fn =
+				c.getServletContext().getRealPath("WEB-INF/digilib-config.xml");
 			if (fn == null) {
-				util.dprintln(4, "setConfig: no param config-file");
-				throw new ServletException("ERROR no digilib config file!");
+				logger.fatal("readConfig: no param config-file");
+				throw new ServletException("ERROR: no digilib config file!");
 			}
 		}
 		File f = new File(fn);
@@ -158,11 +183,11 @@
 			new XMLListLoader("digilib-config", "parameter", "name", "value");
 		// read config file into HashMap
 		HashMap confTable = lilo.loadURL(f.toURL().toString());
-		
+
 		// set config file path parameter
 		setValue("servlet.config.file", f.getCanonicalPath());
 
-		/* 
+		/*
 		 * read parameters
 		 */
 
@@ -175,11 +200,11 @@
 					// type 's' Parameters are not overwritten.
 					continue;
 				}
-				if (! p.setValueFromString(val)) {
+				if (!p.setValueFromString(val)) {
 					/*
 					 * automatic conversion failed -- try special cases
 					 */
-					
+
 					// basedir-list
 					if (key.equals("basedir-list")) {
 						// split list into directories
@@ -188,7 +213,7 @@
 							p.setValue(sa);
 						}
 					}
-					
+
 				}
 			} else {
 				// parameter unknown -- just add
@@ -200,18 +225,25 @@
 		 * further initialization
 		 */
 
-		// debugLevel
-		util.setDebugLevel(getAsInt("debug-level"));
+		// set up logger
+		String logConfPath = getAsString("log-config-file");
+		if (!logConfPath.startsWith("/")) {
+			// relative path -> use getRealPath to resolve in WEB-INF
+			logConfPath =
+				c.getServletContext().getRealPath("WEB-INF/" + logConfPath);
+		}
+		DOMConfigurator.configure(logConfPath);
 		// directory cache
 		String[] bd = (String[]) getValue("basedir-list");
-		int[] fcs = { FileOps.CLASS_IMAGE, FileOps.CLASS_TEXT};
+		int[] fcs = { FileOps.CLASS_IMAGE, FileOps.CLASS_TEXT };
 		DocuDirCache dirCache;
 		if (getAsBoolean("use-mapping")) {
 			// with mapping file
 			String mapConfPath = getAsString("mapping-file");
-			if (! mapConfPath.startsWith("/")) {
+			if (!mapConfPath.startsWith("/")) {
 				// relative path -> use getRealPath to resolve in WEB-INF
-				mapConfPath = c.getServletContext().getRealPath("WEB-INF/"+mapConfPath);
+				mapConfPath =
+					c.getServletContext().getRealPath("WEB-INF/" + mapConfPath);
 			}
 			dirCache = new AliasingDocuDirCache(bd, fcs, mapConfPath);
 		} else {
@@ -225,11 +257,13 @@
 			//authOp = new DBAuthOpsImpl(util);
 			// XML version
 			String authConfPath = getAsString("auth-file");
-			if (! authConfPath.startsWith("/")) {
+			if (!authConfPath.startsWith("/")) {
 				// relative path -> use getRealPath to resolve in WEB-INF
-				authConfPath = c.getServletContext().getRealPath("WEB-INF/"+authConfPath);
+				authConfPath =
+					c.getServletContext().getRealPath(
+						"WEB-INF/" + authConfPath);
 			}
-			AuthOps authOp = new XMLAuthOps(util, authConfPath);
+			AuthOps authOp = new XMLAuthOps(authConfPath);
 			setValue("servlet.auth.op", authOp);
 		}
 		// DocuImage class
@@ -239,7 +273,8 @@
 		setValue("servlet.docuimage.class", docuImageClass);
 	}
 
-	/** Creates a new DocuImage instance.
+	/**
+	 * Creates a new DocuImage instance.
 	 * 
 	 * The type of DocuImage is specified by docuImageType.
 	 * 
@@ -252,17 +287,9 @@
 				docuImageClass = Class.forName(getAsString("docuimage-class"));
 			}
 			di = (DocuImageImpl) docuImageClass.newInstance();
-			di.setUtils(util);
 		} catch (Exception e) {
 		}
 		return di;
 	}
 
-	/**
-	 * @return
-	 */
-	public Utils getUtil() {
-		return util;
-	}
-
 }
--- a/servlet/src/digilib/servlet/DigilibRequest.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/servlet/DigilibRequest.java	Fri Nov 21 00:17:31 2003 +0100
@@ -36,6 +36,8 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.log4j.Logger;
+
 import com.hp.hpl.mesa.rdf.jena.common.SelectorImpl;
 import com.hp.hpl.mesa.rdf.jena.mem.ModelMem;
 import com.hp.hpl.mesa.rdf.jena.model.Model;
@@ -65,6 +67,7 @@
  */
 public class DigilibRequest extends ParameterMap {
 
+	private Logger logger = Logger.getLogger(this.getClass());
 	private boolean boolRDF = false; // use RDF Parameters
 	private DocuImage image; // internal DocuImage instance for this request
 	private ServletRequest servletRequest; // internal ServletRequest
@@ -373,9 +376,7 @@
 		String strRDF;
 		strRDF = request.getParameter("rdf");
 		if (strRDF != null) {
-			//System.out.println(strRDF);
 			Hashtable hashRDF = rdf2hash(strRDF);
-			//System.out.println(hashRDF.toString());
 			// go through all parameters
 			for (Iterator i = hashRDF.keySet().iterator(); i.hasNext();) {
 				String name = (String) i.next();
@@ -404,7 +405,6 @@
 			// get Property fn -> digilib
 			Property p =
 				model.getProperty("http://echo.unibe.ch/digilib/rdf#", "fn");
-			//System.out.println(p.toString());
 			if (p != null) {
 				// get URI
 				String strURI = null;
@@ -412,7 +412,6 @@
 				if (i.hasNext()) {
 					strURI = "urn:echo:" + i.next().toString();
 					Resource r = model.getResource(strURI);
-					//System.out.println(r.toString());
 					Selector selector =
 						new SelectorImpl(r, null, (RDFNode) null);
 					// list the statements in the graph
@@ -444,7 +443,7 @@
 				}
 			}
 		} catch (Exception e) {
-			System.out.println("Failed: " + e);
+			logger.warn("rdf3hash failed", e);
 		}
 		return hashParams;
 	}
--- a/servlet/src/digilib/servlet/DocumentBean.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/servlet/DocumentBean.java	Fri Nov 21 00:17:31 2003 +0100
@@ -28,21 +28,19 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import digilib.Utils;
+import org.apache.log4j.Logger;
+
 import digilib.auth.AuthOpException;
 import digilib.auth.AuthOps;
 import digilib.io.DocuDirCache;
 import digilib.io.DocuDirectory;
-import digilib.io.FileOps;
 
 public class DocumentBean {
 
-	// Utils object for logging
-	private Utils util = new Utils(0);
+	// general logger
+	Logger logger = Logger.getLogger("digilib.docubean");
 	// AuthOps object to check authorization
 	private AuthOps authOp;
-	// FileOps object
-	private FileOps fileOp = new FileOps(util);
 	// use authorization database
 	private boolean useAuthentication = true;
 	// path to add for authenticated access
@@ -64,12 +62,12 @@
 		try {
 			setConfig(conf);
 		} catch (Exception e) {
-			util.dprintln(2, "ERROR: Unable to read config: " + e.toString());
+			logger.fatal("ERROR: Unable to read config: ", e);
 		}
 	}
 
 	public void setConfig(ServletConfig conf) throws ServletException {
-		util.dprintln(10, "setConfig");
+		logger.debug("setConfig");
 		// get our ServletContext
 		ServletContext context = conf.getServletContext();
 		// see if there is a Configuration instance
@@ -86,8 +84,6 @@
 			}
 		}
 
-		// get util
-		util = dlConfig.getUtil();
 		// get cache
 		dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache");
 
@@ -104,7 +100,7 @@
 	 */
 	public boolean isAuthRequired(DigilibRequest request)
 		throws AuthOpException {
-		util.dprintln(10, "isAuthRequired");
+		logger.debug("isAuthRequired");
 		return useAuthentication ? authOp.isAuthRequired(request) : false;
 	}
 
@@ -113,7 +109,7 @@
 	 */
 	public boolean isAuthorized(DigilibRequest request)
 		throws AuthOpException {
-		util.dprintln(10, "isAuthorized");
+		logger.debug("isAuthorized");
 		return useAuthentication ? authOp.isAuthorized(request) : true;
 	}
 
@@ -122,7 +118,7 @@
 	 *  to access the specified path
 	 */
 	public List rolesForPath(DigilibRequest request) throws AuthOpException {
-		util.dprintln(10, "rolesForPath");
+		logger.debug("rolesForPath");
 		return useAuthentication ? authOp.rolesForPath(request) : null;
 	}
 
@@ -130,7 +126,7 @@
 	 * check request authorization against a list of roles
 	 */
 	public boolean isRoleAuthorized(List roles, DigilibRequest request) {
-		util.dprintln(10, "isRoleAuthorized");
+		logger.debug("isRoleAuthorized");
 		return useAuthentication
 			? authOp.isRoleAuthorized(roles, request)
 			: true;
@@ -143,7 +139,7 @@
 		DigilibRequest request,
 		HttpServletResponse response)
 		throws Exception {
-		util.dprintln(10, "doAuthentication");
+		logger.debug("doAuthentication");
 		if (!useAuthentication) {
 			// shortcut if no authentication
 			return true;
@@ -151,10 +147,10 @@
 		// check if we are already authenticated
 		if (((HttpServletRequest) request.getServletRequest()).getRemoteUser()
 			== null) {
-			util.dprintln(3, "unauthenticated so far");
+			logger.debug("unauthenticated so far");
 			// if not maybe we must?
 			if (isAuthRequired(request)) {
-				util.dprintln(3, "auth required, redirect");
+				logger.debug("auth required, redirect");
 				// we are not yet authenticated -> redirect
 				response.sendRedirect(
 					authURLPath
@@ -173,7 +169,7 @@
 	 *  (not yet functional)
 	 */
 	public int getFirstPage(DigilibRequest request) {
-		util.dprintln(10, "getFirstPage");
+		logger.debug("getFirstPage");
 		return 1;
 	}
 
@@ -181,7 +177,7 @@
 	 *  get the number of pages/files in the directory
 	 */
 	public int getNumPages(DigilibRequest request) throws Exception {
-		util.dprintln(10, "getNumPages");
+		logger.debug("getNumPages");
 		DocuDirectory dd =
 			(dirCache != null)
 				? dirCache.getDirectory(request.getFilePath())
--- a/servlet/src/digilib/servlet/Parameter.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/servlet/Parameter.java	Fri Nov 21 00:17:31 2003 +0100
@@ -183,7 +183,6 @@
 				fa[i] = f;
 			}
 		} catch (Exception e) {
-			//System.out.println("ERROR: trytoGetParam(int) failed on param "+name);
 		}
 		
 		return fa;
--- a/servlet/src/digilib/servlet/Scaler.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/servlet/Scaler.java	Fri Nov 21 00:17:31 2003 +0100
@@ -1,22 +1,23 @@
-/* Scaler -- Scaler servlet main class
-
-  Digital Image Library servlet components
-
-  Copyright (C) 2001, 2002, 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
-
-*/
+/*
+ * Scaler -- Scaler servlet main class
+ * 
+ * Digital Image Library servlet components
+ * 
+ * Copyright (C) 2001, 2002, 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
+ *  
+ */
 
 package digilib.servlet;
 
@@ -34,7 +35,8 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import digilib.Utils;
+import org.apache.log4j.Logger;
+
 import digilib.auth.AuthOpException;
 import digilib.auth.AuthOps;
 import digilib.image.DocuImage;
@@ -43,23 +45,30 @@
 import digilib.image.ImageOpException;
 import digilib.image.ImageSize;
 import digilib.io.DocuDirCache;
+import digilib.io.FileOpException;
+import digilib.io.FileOps;
 import digilib.io.ImageFile;
 import digilib.io.ImageFileset;
-import digilib.io.FileOpException;
-import digilib.io.FileOps;
 
 //import tilecachetool.*;
 
 /**
- * @author casties */
+ * @author casties
+ */
 //public class Scaler extends HttpServlet implements SingleThreadModel {
 public class Scaler extends HttpServlet {
 
 	// digilib servlet version (for all components)
-	public static final String dlVersion = "1.17b2";
+	public static final String dlVersion = "1.18b1";
 
-	// Utils instance with debuglevel
-	Utils util;
+	// logger for accounting requests
+	Logger accountlog = Logger.getLogger("account.request");
+	// gengeral logger for this class
+	Logger logger = Logger.getLogger("digilib.servlet");
+	// logger for authentication related
+	Logger authlog = Logger.getLogger("digilib.auth");
+	
+	
 	// FileOps instance
 	FileOps fileOp;
 	// AuthOps instance
@@ -121,15 +130,15 @@
 				throw new ServletException(e);
 			}
 		}
-		// first we need an Utils
-		util = dlConfig.getUtil();
+		// say hello in the log file
+		logger.info("***** Digital Image Library Servlet (version "
+				+ dlVersion
+				+ ") *****");
 		// set our AuthOps
 		useAuthentication = dlConfig.getAsBoolean("use-authorization");
+		// AuthOps instance
 		authOp = (AuthOps) dlConfig.getValue("servlet.auth.op");
-		// FileOps instance
-		fileOp = new FileOps(util);
-		// AuthOps instance
-		servletOp = new ServletOps(util);
+
 		// DocuDirCache instance
 		dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache");
 		denyImgFile = new File(dlConfig.getAsString("denied-image"));
@@ -139,10 +148,10 @@
 		defaultQuality = dlConfig.getAsInt("default-quality");
 	}
 
-	/** Process the HTTP Get request*/
+	/** Process the HTTP Get request */
 	public void doGet(HttpServletRequest request, HttpServletResponse response)
 		throws ServletException, IOException {
-		util.dprintln(1, "The servlet has received a GET!");
+		accountlog.info("GET from "+request.getRemoteAddr());
 		// create new request with defaults
 		DigilibRequest dlReq = new DigilibRequest();
 		// set with request parameters
@@ -153,12 +162,12 @@
 		processRequest(request, response);
 	}
 
-	/**Process the HTTP Post request*/
+	/** Process the HTTP Post request */
 	public void doPost(
 		HttpServletRequest request,
 		HttpServletResponse response)
 		throws ServletException, IOException {
-		util.dprintln(1, "The servlet has received a POST!");
+		accountlog.info("POST from "+request.getRemoteAddr());
 		// create new request with defaults
 		DigilibRequest dlReq = new DigilibRequest();
 		// set with request parameters
@@ -175,6 +184,8 @@
 		HttpServletResponse response)
 		throws ServletException, IOException {
 
+		accountlog.debug("request: "+request.getQueryString());
+		
 		// time for benchmarking
 		long startTime = System.currentTimeMillis();
 		// output mime/type
@@ -273,18 +284,6 @@
 			cropToFit = false;
 			sendFile = false;
 			hiresOnly = true;
-		} else if (dlRequest.hasOption("mo", "file")) {
-			scaleToFit = false;
-			absoluteScale = false;
-			if (sendFileAllowed) {
-				cropToFit = false;
-				sendFile = true;
-			} else {
-				// crop to fit if send file not allowed
-				cropToFit = true;
-				sendFile = false;
-			}
-			hiresOnly = true;
 		}
 		// operation mode: "lores": try to use scaled image, "hires": use
 		// unscaled image
@@ -334,18 +333,18 @@
 				// get a list of required roles (empty if no restrictions)
 				List rolesRequired = authOp.rolesForPath(loadPathName, request);
 				if (rolesRequired != null) {
-					util.dprintln(1, "Role required: " + rolesRequired);
-					util.dprintln(2, "User: " + request.getRemoteUser());
+					authlog.info("Role required: " + rolesRequired);
+					authlog.info("User: " + request.getRemoteUser());
 					// is the current request/user authorized?
 					if (!authOp.isRoleAuthorized(rolesRequired, request)) {
 						// send deny answer and abort
-						util.dprintln(1, "ERROR: access denied!");
+						authlog.error("ERROR: access denied!");
 						if (errorMsgHtml) {
 							ServletOps.htmlMessage(
 								"ERROR: Unauthorized access!",
 								response);
 						} else {
-							servletOp.sendFile(denyImgFile, response);
+							ServletOps.sendFile(denyImgFile, null, response);
 						}
 						return;
 					}
@@ -367,7 +366,7 @@
 						+ dlRequest.getAsInt("pn")
 						+ ") not found.");
 			}
-			
+
 			/* calculate expected source image size */
 			ImageSize expectedSourceSize = new ImageSize();
 			if (scaleToFit) {
@@ -402,8 +401,25 @@
 					fileToLoad = fileset.getBiggest();
 				}
 			}
-			util.dprintln(1, "Loading: " + fileToLoad.getFile());
+			logger.info("Loading: " + fileToLoad.getFile());
 
+			/*
+			 * send the image if its mo=(raw)file
+			 */
+			if (dlRequest.hasOption("mo", "file")
+				|| dlRequest.hasOption("mo", "rawfile")) {
+				if (sendFileAllowed) {
+					String mt = null;
+					if (dlRequest.hasOption("mo", "rawfile")) {
+						mt = "application/octet-stream";
+					}
+					ServletOps.sendFile(fileToLoad.getFile(), mt, response);
+				}
+			}
+
+			/*
+			 * prepare resolution for original size
+			 */
 			if (absoluteScale) {
 				// get original resolution from metadata
 				fileset.checkMeta();
@@ -448,20 +464,17 @@
 			 * if not autoScale and not scaleToFit nor cropToFit then send as
 			 * is (mo=file)
 			 */
-			if ((loresOnly
-				&& imageSendable
-				&& fileToLoad.getSize().isSmallerThan(expectedSourceSize))
-				|| (!(loresOnly || hiresOnly)
-					&& fileToLoad.getSize().fitsIn(expectedSourceSize))
-				|| sendFile) {
+			if (imageSendable
+				&& ((loresOnly
+					&& fileToLoad.getSize().isSmallerThan(expectedSourceSize))
+					|| (!(loresOnly || hiresOnly)
+						&& fileToLoad.getSize().fitsIn(expectedSourceSize)))) {
 
-				util.dprintln(1, "Sending File as is.");
-
-				servletOp.sendFile(fileToLoad.getFile(), response);
+				logger.debug("Sending File as is.");
 
-				util.dprintln(
-					1,
-					"Done in "
+				ServletOps.sendFile(fileToLoad.getFile(), null, response);
+
+				logger.info("Done in "
 						+ (System.currentTimeMillis() - startTime)
 						+ "ms");
 				return;
@@ -475,7 +488,7 @@
 
 			// set interpolation quality
 			docuImage.setQuality(scaleQual);
-			
+
 			// set missing dw or dh from aspect ratio
 			double imgAspect = fileToLoad.getAspect();
 			if (paramDW == 0) {
@@ -486,12 +499,8 @@
 
 			/* crop and scale the image */
 
-			util.dprintln(
-				2,
-				"IMG: " + imgSize.getWidth() + "x" + imgSize.getHeight());
-			util.dprintln(
-				2,
-				"time " + (System.currentTimeMillis() - startTime) + "ms");
+			logger.debug("IMG: " + imgSize.getWidth() + "x" + imgSize.getHeight());
+			logger.debug("time " + (System.currentTimeMillis() - startTime) + "ms");
 
 			// coordinates and scaling
 			double areaXoff;
@@ -589,9 +598,7 @@
 				}
 			}
 
-			util.dprintln(
-				1,
-				"Scale "
+			logger.debug("Scale "
 					+ scaleXY
 					+ "("
 					+ scaleX
@@ -608,9 +615,7 @@
 			areaXoff = outerUserImgArea.getX();
 			areaYoff = outerUserImgArea.getY();
 
-			util.dprintln(
-				2,
-				"crop: "
+			logger.debug("crop: "
 					+ areaXoff
 					+ ","
 					+ areaYoff
@@ -624,7 +629,7 @@
 				|| (areaHeight < 1)
 				|| (scaleXY * areaWidth < 2)
 				|| (scaleXY * areaHeight < 2)) {
-				util.dprintln(1, "ERROR: invalid scale parameter set!");
+				logger.error("ERROR: invalid scale parameter set!");
 				throw new ImageOpException("Invalid scale parameter set!");
 			}
 
@@ -632,8 +637,7 @@
 
 			// use subimage loading if possible
 			if (docuImage.isSubimageSupported()) {
-				System.out.println(
-					"Subimage: scale " + scaleXY + " = " + (1 / scaleXY));
+				logger.debug("Subimage: scale " + scaleXY + " = " + (1 / scaleXY));
 				double subf = 1d;
 				double subsamp = 1d;
 				if (scaleXY < 1) {
@@ -646,8 +650,7 @@
 						subsamp = Math.floor(subf);
 					}
 					scaleXY = subsamp / subf;
-					System.out.println(
-						"Using subsampling: " + subsamp + " rest " + scaleXY);
+					logger.debug("Using subsampling: " + subsamp + " rest " + scaleXY);
 				}
 
 				docuImage.loadSubimage(
@@ -655,8 +658,7 @@
 					outerUserImgArea.getBounds(),
 					(int) subsamp);
 
-				System.out.println(
-					"SUBSAMP: "
+				logger.debug("SUBSAMP: "
 						+ subsamp
 						+ " -> "
 						+ docuImage.getWidth()
@@ -736,9 +738,7 @@
 				docuImage.enhance((float) mult, (float) paramBRGT);
 			}
 
-			util.dprintln(
-				2,
-				"time " + (System.currentTimeMillis() - startTime) + "ms");
+			logger.debug("time " + (System.currentTimeMillis() - startTime) + "ms");
 
 			/* write the resulting image */
 
@@ -755,59 +755,57 @@
 			// write the image
 			docuImage.writeImage(mimeType, response.getOutputStream());
 
-			util.dprintln(
-				1,
-				"Done in " + (System.currentTimeMillis() - startTime) + "ms");
+			logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms");
 
 			/* error handling */
 
 		} // end of "big" try
 		catch (IOException e) {
-			util.dprintln(1, "ERROR: File IO Error: " + e);
+			logger.fatal("ERROR: File IO Error: ", e);
 			try {
 				if (errorMsgHtml) {
 					ServletOps.htmlMessage(
 						"ERROR: File IO Error: " + e,
 						response);
 				} else {
-					servletOp.sendFile(errorImgFile, response);
+					ServletOps.sendFile(errorImgFile, null, response);
 				}
 			} catch (FileOpException ex) {
 			} // so we don't get a loop
 		} catch (AuthOpException e) {
-			util.dprintln(1, "ERROR: Authorization error: " + e);
+			logger.fatal("ERROR: Authorization error: ", e);
 			try {
 				if (errorMsgHtml) {
 					ServletOps.htmlMessage(
 						"ERROR: Authorization error: " + e,
 						response);
 				} else {
-					servletOp.sendFile(errorImgFile, response);
+					ServletOps.sendFile(errorImgFile, null, response);
 				}
 			} catch (FileOpException ex) {
 			} // so we don't get a loop
 		} catch (ImageOpException e) {
-			util.dprintln(1, "ERROR: Image Error: " + e);
+			logger.fatal("ERROR: Image Error: ", e);
 			try {
 				if (errorMsgHtml) {
 					ServletOps.htmlMessage(
 						"ERROR: Image Operation Error: " + e,
 						response);
 				} else {
-					servletOp.sendFile(errorImgFile, response);
+					ServletOps.sendFile(errorImgFile, null, response);
 				}
 			} catch (FileOpException ex) {
 			} // so we don't get a loop
 		} catch (RuntimeException e) {
 			// JAI likes to throw RuntimeExceptions ;-(
-			util.dprintln(1, "ERROR: Other Image Error: " + e);
+			logger.fatal("ERROR: Other Image Error: ", e);
 			try {
 				if (errorMsgHtml) {
 					ServletOps.htmlMessage(
 						"ERROR: Other Image Operation Error: " + e,
 						response);
 				} else {
-					servletOp.sendFile(errorImgFile, response);
+					ServletOps.sendFile(errorImgFile, null, response);
 				}
 			} catch (FileOpException ex) {
 			} // so we don't get a loop
--- a/servlet/src/digilib/servlet/ServletOps.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/servlet/ServletOps.java	Fri Nov 21 00:17:31 2003 +0100
@@ -1,219 +1,120 @@
-/* ServletOps -- Servlet utility class
-
-  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
-
-*/
+/*
+ * ServletOps -- Servlet utility class
+ * 
+ * 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.servlet;
 
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
-import java.util.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.StringTokenizer;
 
-import digilib.*;
-import digilib.io.*;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
 
+import org.apache.log4j.Logger;
+
+import digilib.io.FileOpException;
+import digilib.io.FileOps;
 
 public class ServletOps {
 
-  private Utils util = null;
-  private HashMap confTable = null;
-
-  public ServletOps() {
-    util = new Utils();
-  }
-
-  public ServletOps(Utils u) {
-    util = u;
-  }
-
-  public ServletOps(Utils u, ServletConfig sc) throws ServletException {
-    util = u;
-    setConfig(sc);
-  }
-
-  public void setUtils(Utils u) {
-    util = u;
-  }
+	private static Logger logger = Logger.getLogger("servlet.op");
 
-  /**
-   * read parameter list from the XML file in init parameter "config-file"
-   */
-  public void setConfig(ServletConfig c) throws ServletException {
-    // reset parameter table
-    confTable = null;
-    if (c == null) {
-      return;
-    }
-    // get config file name
-    String fn = c.getInitParameter("config-file");
-    if (fn == null) {
-      util.dprintln(4, "setConfig: no param config-file");
-      return;
-    }
-    File f = new File(fn);
-    // setup config file list reader
-    XMLListLoader lilo = new XMLListLoader("digilib-config", "parameter", "name", "value");
-    try {
-      confTable = lilo.loadURL(f.toURL().toString());
-    } catch (Exception e) {
-      util.dprintln(4, "setConfig: unable to read file "+fn);
-      throw new ServletException(e);
-    }
-  }
+	/**
+	 * convert a string with a list of pathnames into an array of strings using
+	 * the system's path seperator string
+	 */
+	public static String[] getPathArray(String paths) {
+		// split list into directories
+		StringTokenizer dirs =
+			new StringTokenizer(paths, java.io.File.pathSeparator);
+		int n = dirs.countTokens();
+		if (n < 1) {
+			return null;
+		}
+		// add directories into array
+		String[] pathArray = new String[n];
+		for (int i = 0; i < n; i++) {
+			pathArray[i] = dirs.nextToken();
+		}
+		return pathArray;
+	}
 
-  /**
-   * convert a string with a list of pathnames into an array of strings
-   * using the system's path seperator string
-   */
-  public String[] getPathArray(String paths) {
-    // split list into directories
-    StringTokenizer dirs = new StringTokenizer(paths, java.io.File.pathSeparator);
-    int n = dirs.countTokens();
-    if (n < 1) {
-        return null;
-    }
-    // add directories into array
-    String[] pathArray = new String[n];
-    for (int i = 0; i < n; i++) {
-      pathArray[i] = dirs.nextToken();
-    }
-    return pathArray;
-  }
-  
-  /**
-   * getPathArray with default fall back
-   */
-  public String[] tryToGetPathArray(String paths, String[] defaultPath) {
-    String[] pa = getPathArray(paths);
-    return (pa != null) ? pa : defaultPath;
-  }
-      
-  /**
-   *  print a servlet response and exit
-   */
-  public static void htmlMessage(String s, HttpServletResponse response) throws IOException {
-    response.setContentType("text/html; charset=iso-8859-1");
-    PrintWriter out = response.getWriter();
-    out.println("<html>");
-    out.println("<head><title>Scaler</title></head>");
-    out.println("<body>");
-    out.println("<p>"+s+"</p>");
-    out.println("</body></html>");
-  }
+	/**
+	 * print a servlet response and exit
+	 */
+	public static void htmlMessage(String s, HttpServletResponse response)
+		throws IOException {
+		response.setContentType("text/html; charset=iso-8859-1");
+		PrintWriter out = response.getWriter();
+		out.println("<html>");
+		out.println("<head><title>Scaler</title></head>");
+		out.println("<body>");
+		out.println("<p>" + s + "</p>");
+		out.println("</body></html>");
+	}
 
-  /** Transfers an image file as-is.
-   *
-   * The local file is copied to the <code>OutputStream</code> of the
-   * <code>ServletResponse</code>. The mime-type for the response is detected
-   * from the file.
-   *
-   * @param f Image file to be sent.
-   * @param res ServletResponse where the image file will be sent.
-   * @throws FileOpException Exception is thrown for a IOException.
-   */
-  public void sendFile(File f, ServletResponse response) throws FileOpException {
-	util.dprintln(4, "sendFile("+f+")");
-	String mimeType = FileOps.mimeForFile(f);
-	if (mimeType == null) {
-	  util.dprintln(2, "ERROR(sendFile): unknown file Type");
-	  throw new FileOpException("Unknown file type.");
-	}
-	response.setContentType(mimeType);
-	// open file
-	try {
-	  FileInputStream inFile = new FileInputStream(f);
-	  OutputStream outStream = response.getOutputStream();
-	  byte dataBuffer[] = new byte[4096];
-	  int len;
-	  while ((len = inFile.read(dataBuffer)) != -1) {
-		// copy out file
-		outStream.write(dataBuffer, 0, len);
-	  }
-	  inFile.close();
-	} catch (IOException e) {
-	  util.dprintln(2, "ERROR(sendFile): unable to send file");
-	  throw new FileOpException("Unable to send file.");
+	/**
+	 * Transfers an image file as-is with the mime type mt.
+	 * 
+	 * The local file is copied to the <code>OutputStream</code> of the
+	 * <code>ServletResponse</code>. If mt is null then the mime-type is
+	 * auto-detected with mimeForFile.
+	 * 
+	 * @param mt
+	 *            mime-type of the file.
+	 * @param f
+	 *            Image file to be sent.
+	 * @param res
+	 *            ServletResponse where the image file will be sent.
+	 * @throws FileOpException
+	 *             Exception is thrown for a IOException.
+	 */
+	public static void sendFile(File f, String mt, ServletResponse response)
+		throws FileOpException {
+		logger.debug("sendRawFile(" + mt + ", " + f + ")");
+		if (mt == null) {
+			// auto-detect mime-type
+			mt = FileOps.mimeForFile(f);
+			if (mt == null) {
+				throw new FileOpException("Unknown file type.");
+			}
+		}
+		response.setContentType(mt);
+		// open file
+		try {
+			FileInputStream inFile = new FileInputStream(f);
+			OutputStream outStream = response.getOutputStream();
+			byte dataBuffer[] = new byte[4096];
+			int len;
+			while ((len = inFile.read(dataBuffer)) != -1) {
+				// copy out file
+				outStream.write(dataBuffer, 0, len);
+			}
+			inFile.close();
+		} catch (IOException e) {
+			throw new FileOpException("Unable to send file.");
+		}
 	}
-  }
-
-
-  /**
-   *  get a parameter from request and return it if set, otherwise return default
-   */
-  public int tryToGetParam(String s, int i, HttpServletRequest r) {
-    try {
-      i = Integer.parseInt(r.getParameter(s));
-    } catch(Exception e) {
-      util.dprintln(4, "trytoGetParam(int) failed on param "+s);
-      //e.printStackTrace();
-    }
-    return i;
-  }
-  public float tryToGetParam(String s, float f, HttpServletRequest r) {
-    try {
-      f = Float.parseFloat(r.getParameter(s));
-    } catch(Exception e) {
-      util.dprintln(4, "trytoGetParam(float) failed on param "+s);
-      //e.printStackTrace();
-    }
-    return f;
-  }
-  public String tryToGetParam(String s, String x, HttpServletRequest r) {
-    if (r.getParameter(s) != null) {
-      x = r.getParameter(s);
-    } else {
-      util.dprintln(4, "trytoGetParam(string) failed on param "+s);
-    }
-    return x;
-  }
-
-
-  /**
-   *  get an init parameter from config and return it if set, otherwise return default
-   */
-  public int tryToGetInitParam(String s, int i) {
-    //System.out.println("trytogetInitParam("+s+", "+i+")");
-    try {
-      //System.out.println("trytogetInitParam: "+(String)confTable.get(s));
-      i = Integer.parseInt((String)confTable.get(s));
-    } catch(Exception e) {
-      util.dprintln(4, "trytogetInitParam(int) failed on param "+s);
-      //e.printStackTrace();
-    }
-    return i;
-  }
-  public float tryToGetInitParam(String s, float f) {
-    try {
-      f = Float.parseFloat((String)confTable.get(s));
-    } catch(Exception e) {
-      util.dprintln(4, "trytoGetInitParam(float) failed on param "+s);
-      //e.printStackTrace();
-    }
-    return f;
-  }
-  public String tryToGetInitParam(String s, String x) {
-    if ((confTable != null)&&((String)confTable.get(s) != null)) {
-      x = (String)confTable.get(s);
-    } else {
-      util.dprintln(4, "trytoGetInitParam(string) failed on param "+s);
-    }
-    return x;
-  }
 
 }
--- a/servlet/src/digilib/servlet/Texter.java	Fri Nov 21 00:11:18 2003 +0100
+++ b/servlet/src/digilib/servlet/Texter.java	Fri Nov 21 00:17:31 2003 +0100
@@ -22,7 +22,8 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import digilib.Utils;
+import org.apache.log4j.Logger;
+
 import digilib.auth.AuthOps;
 import digilib.io.DocuDirCache;
 import digilib.io.FileOpException;
@@ -39,11 +40,11 @@
 public class Texter extends HttpServlet {
 
 	/** Servlet version */
-	public static String tlVersion = "0.1a2";
+	public static String tlVersion = "0.1a3";
 	/** DigilibConfiguration instance */
 	DigilibConfiguration dlConfig = null;
-	/** Utils instance with debuglevel */
-	Utils util;
+	/** general logger */
+	Logger logger = Logger.getLogger("digilib.texter");
 	/** FileOps instance */
 	FileOps fileOp;
 	/** AuthOps instance */
@@ -63,10 +64,10 @@
 		super.init(config);
 
 		System.out.println(
-			"***** Digital Image Library Text Servlet (version "
+				"***** Digital Image Library Text Servlet (version "
 				+ tlVersion
 				+ ") *****");
-
+		
 		// get our ServletContext
 		ServletContext context = config.getServletContext();
 		// see if there is a Configuration instance
@@ -82,15 +83,15 @@
 				throw new ServletException(e);
 			}
 		}
-		// first we need an Utils
-		util = dlConfig.getUtil();
+		// say hello in the log file
+		logger.info(
+				"***** Digital Image Library Text Servlet (version "
+				+ tlVersion
+				+ ") *****");
+		
 		// set our AuthOps
 		useAuthentication = dlConfig.getAsBoolean("use-authorization");
 		authOp = (AuthOps) dlConfig.getValue("servlet.auth.op");
-		// FileOps instance
-		fileOp = new FileOps(util);
-		// AuthOps instance
-		servletOp = new ServletOps(util);
 		// DocuDirCache instance
 		dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache");
 	}
@@ -147,19 +148,19 @@
 			 * find the file to load/send
 			 */
 			if (this.getTextFile(dlRequest, "/txt") != null) {
-				servletOp.sendFile(
+				ServletOps.sendFile(
 					this.getTextFile(dlRequest, "txt").getFile(),
-					response);
+					null, response);
 			} else if (this.getTextFile(dlRequest, "") != null) {
-				servletOp.sendFile(
+				ServletOps.sendFile(
 					this.getTextFile(dlRequest, "").getFile(),
-					response);
+					null, response);
 			} else {
 				ServletOps.htmlMessage("No Text-File!", response);
 			}
 
 		} catch (FileOpException e) {
-			util.dprintln(1, "ERROR: File IO Error: " + e);
+			logger.error("ERROR: File IO Error: ", e);
 			try {
 				ServletOps.htmlMessage("ERROR: File IO Error: " + e, response);
 			} catch (FileOpException ex) {