# HG changeset patch
# User robcast
# Date 1298324195 -3600
# Node ID a23c4c15a6a89f61366a7c202712e3600ff253ea
# Parent 0b43458667979ca2b2f4c8d264b7fce993d12ebe
clean up possible resource leaks. better behaviour with unknown image types.
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/image/DocuImage.java
--- a/servlet/src/digilib/image/DocuImage.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/image/DocuImage.java Mon Feb 21 22:36:35 2011 +0100
@@ -63,15 +63,15 @@
public void loadSubimage(ImageInput ii, Rectangle region, int subsample)
throws FileOpException;
- /** Writes the current image to a ServletResponse.
+ /** Writes the current image to an OutputStream.
*
* The image is encoded to the mime-type mt
and sent to the output
- * stream of the ServletResponse
res
.
+ * stream ostream
.
*
* Currently only mime-types "image/jpeg" and "image/png" are supported.
*
* @param mt mime-type of the image to be sent.
- * @param res ServletResponse where the image is sent.
+ * @param ostream OutputStream where the image is sent.
* @throws ServletException Exception thrown on sending data.
* @throws ImageOpException Exception in other cases.
*/
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/image/DocuImageImpl.java
--- a/servlet/src/digilib/image/DocuImageImpl.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/image/DocuImageImpl.java Mon Feb 21 22:36:35 2011 +0100
@@ -156,11 +156,11 @@
public void crop(int xoff, int yoff, int width, int height)
throws ImageOpException {
- // TODO Auto-generated method stub
+ // emtpy implementation
}
public Image getAwtImage() {
- // TODO Auto-generated method stub
+ // emtpy implementation
return null;
}
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/image/ImageInfoDocuImage.java
--- a/servlet/src/digilib/image/ImageInfoDocuImage.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/image/ImageInfoDocuImage.java Mon Feb 21 22:36:35 2011 +0100
@@ -21,27 +21,35 @@
/* Check image size and type and store in ImageFile f */
public ImageInput identify(ImageInput ii) throws IOException {
logger.debug("identifying (ImageInfo) " + ii);
- // set up ImageInfo object
- ImageInfo iif = new ImageInfo();
- if (ii.hasImageInputStream()) {
- iif.setInput(ii.getImageInputStream());
- } else if (ii.hasFile()) {
- RandomAccessFile raf = new RandomAccessFile(ii.getFile(), "r");
- iif.setInput(raf);
- } else {
+ RandomAccessFile raf = null;
+ try {
+ // set up ImageInfo object
+ ImageInfo iif = new ImageInfo();
+ if (ii.hasImageInputStream()) {
+ iif.setInput(ii.getImageInputStream());
+ } else if (ii.hasFile()) {
+ raf = new RandomAccessFile(ii.getFile(), "r");
+ iif.setInput(raf);
+ } else {
+ return null;
+ }
+ iif.setCollectComments(false);
+ iif.setDetermineImageNumber(false);
+ // try with ImageInfo first
+ if (iif.check()) {
+ ImageSize d = new ImageSize(iif.getWidth(), iif.getHeight());
+ ii.setSize(d);
+ ii.setMimetype(iif.getMimeType());
+ logger.debug("image size: " + ii.getSize());
+ return ii;
+ }
return null;
+ } finally {
+ // close file, don't close stream(?)
+ if (raf != null) {
+ raf.close();
+ }
}
- iif.setCollectComments(false);
- iif.setDetermineImageNumber(false);
- // try with ImageInfo first
- if (iif.check()) {
- ImageSize d = new ImageSize(iif.getWidth(), iif.getHeight());
- ii.setSize(d);
- ii.setMimetype(iif.getMimeType());
- logger.debug("image size: " + ii.getSize());
- return ii;
- }
- return null;
}
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/image/ImageJobDescription.java
--- a/servlet/src/digilib/image/ImageJobDescription.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/image/ImageJobDescription.java Mon Feb 21 22:36:35 2011 +0100
@@ -166,11 +166,12 @@
input = imageSet.getBiggest();
}
}
- logger.info("Planning to load: " + input);
+ if (input == null || input.getMimetype() == null) {
+ throw new FileOpException("Unable to load "+input);
+ }
+ logger.info("Planning to load: " + input);
}
-
return input;
-
}
/** Returns the DocuDirectory for the input (file).
@@ -503,33 +504,27 @@
|| hasOption("rawfile");
}
- /**
- * Returns if the image can be sent without processing. Takes image type and
- * additional image operations into account. Does not check requested size
- * transformation.
- *
- * @return
- * @throws IOException
- */
- public boolean isImageSendable() throws IOException {
- // cached result?
- if (imageSendable == null) {
- String mimeType = getMimeType();
- imageSendable = ( (mimeType.equals("image/jpeg")
- || mimeType.equals("image/png")
- || mimeType.equals("image/gif") )
- &&
- !(hasOption("hmir")
- || hasOption("vmir")
- || (getAsFloat("rot") != 0.0)
- || (getRGBM() != null)
- || (getRGBA() != null)
- || (getAsFloat("cont") != 0.0)
- || (getAsFloat("brgt") != 0.0)));
- }
-
- return imageSendable;
- }
+ /**
+ * Returns if the image can be sent without processing. Takes image type and
+ * additional image operations into account. Does not check requested size
+ * transformation.
+ *
+ * @return
+ * @throws IOException
+ */
+ public boolean isImageSendable() throws IOException {
+ if (imageSendable == null) {
+ String mimeType = getMimeType();
+ imageSendable = (mimeType != null
+ && (mimeType.equals("image/jpeg") || mimeType.equals("image/png")
+ || mimeType.equals("image/gif"))
+ && !(hasOption("hmir")
+ || hasOption("vmir") || (getAsFloat("rot") != 0.0)
+ || (getRGBM() != null) || (getRGBA() != null)
+ || (getAsFloat("cont") != 0.0) || (getAsFloat("brgt") != 0.0)));
+ }
+ return imageSendable;
+ }
/**
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/image/ImageLoaderDocuImage.java
--- a/servlet/src/digilib/image/ImageLoaderDocuImage.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/image/ImageLoaderDocuImage.java Mon Feb 21 22:36:35 2011 +0100
@@ -2,7 +2,7 @@
Digital Image Library servlet components
- Copyright (C) 2002, 2003 Robert Casties (robcast@mail.berlios.de)
+ Copyright (C) 2002 - 2011 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
@@ -60,15 +60,15 @@
/** interpolation type */
protected RenderingHints renderHint;
- /** ImageIO image reader */
- protected ImageReader reader;
-
protected static Kernel[] convolutionKernels = {
null,
new Kernel(1, 1, new float[] {1f}),
new Kernel(2, 2, new float[] {0.25f, 0.25f, 0.25f, 0.25f}),
new Kernel(3, 3, new float[] {1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f})
};
+
+ /** the size of the current image */
+ protected ImageSize imageSize;
/* loadSubimage is supported. */
@@ -95,25 +95,26 @@
/* returns the size of the current image */
public ImageSize getSize() {
- ImageSize is = null;
- // TODO: do we want to cache imageSize?
- int h = 0;
- int w = 0;
- try {
- if (img == null) {
- // get size from ImageReader
- h = reader.getHeight(0);
- w = reader.getWidth(0);
- } else {
- // get size from image
- h = img.getHeight();
- w = img.getWidth();
+ if (imageSize == null) {
+ int h = 0;
+ int w = 0;
+ try {
+ if (img == null) {
+ ImageReader reader = getReader(input);
+ // get size from ImageReader
+ h = reader.getHeight(0);
+ w = reader.getWidth(0);
+ } else {
+ // get size from image
+ h = img.getHeight();
+ w = img.getWidth();
+ }
+ imageSize = new ImageSize(w, h);
+ } catch (IOException e) {
+ logger.debug("error in getSize:", e);
}
- is = new ImageSize(w, h);
- } catch (IOException e) {
- logger.debug("error in getSize:", e);
}
- return is;
+ return imageSize;
}
/* returns a list of supported image formats */
@@ -130,30 +131,36 @@
return ii;
}
logger.debug("identifying (ImageIO) " + input);
- /*
- * try ImageReader
- */
+ ImageReader reader = null;
try {
+ /*
+ * try ImageReader
+ */
reader = getReader(input);
+ // set size
+ ImageSize d = new ImageSize(reader.getWidth(0), reader.getHeight(0));
+ input.setSize(d);
+ // set mime type
+ if (input.getMimetype() == null) {
+ if (input.hasFile()) {
+ String t = FileOps.mimeForFile(input.getFile());
+ input.setMimetype(t);
+ } else {
+ // FIXME: is format name a mime type???
+ String t = reader.getFormatName();
+ input.setMimetype(t);
+ }
+ }
+ return input;
} catch (FileOpException e) {
// maybe just our class doesn't know what to do
+ logger.error("ImageLoaderDocuimage unable to identify:", e);
return null;
- }
- // set size
- ImageSize d = new ImageSize(reader.getWidth(0), reader.getHeight(0));
- input.setSize(d);
- // set mime type
- if (input.getMimetype() == null) {
- if (input.hasFile()) {
- String t = FileOps.mimeForFile(input.getFile());
- input.setMimetype(t);
- } else {
- // FIXME: is format name a mime type???
- String t = reader.getFormatName();
- input.setMimetype(t);
+ } finally {
+ if (reader != null) {
+ reader.dispose();
}
}
- return input;
}
/* load image file */
@@ -178,17 +185,6 @@
*/
public ImageReader getReader(ImageInput input) throws IOException {
logger.debug("get ImageReader for " + input);
- if (this.reader != null) {
- if (this.input == input) {
- // it was the same input
- logger.debug("reusing Reader");
- return reader;
- }
- // clean up old reader (this shouldn't really happen)
- logger.debug("cleaning Reader!");
- dispose();
- }
- this.input = input;
ImageInputStream istream = null;
if (input.hasImageInputStream()) {
// stream input
@@ -201,7 +197,11 @@
throw new FileOpException("Unable to get data from ImageInput");
}
Iterator readers;
- String mt = input.getMimetype();
+ String mt = null;
+ if (input.hasMimetype()) {
+ // check hasMimetype first or we might get into a loop
+ mt = input.getMimetype();
+ }
if (mt == null) {
logger.debug("No mime-type. Trying automagic.");
readers = ImageIO.getImageReaders(istream);
@@ -212,7 +212,7 @@
if (!readers.hasNext()) {
throw new FileOpException("Can't find Reader to load File!");
}
- reader = readers.next();
+ ImageReader reader = readers.next();
/* are there more readers? */
logger.debug("ImageIO: this reader: " + reader.getClass());
/* while (readers.hasNext()) {
@@ -226,6 +226,8 @@
public void loadSubimage(ImageInput ii, Rectangle region, int prescale)
throws FileOpException {
logger.debug("loadSubimage");
+ this.input = ii;
+ ImageReader reader = null;
try {
reader = getReader(ii);
// set up reader parameters
@@ -240,6 +242,10 @@
logger.debug("loaded");
} catch (IOException e) {
throw new FileOpException("Unable to load File!");
+ } finally {
+ if (reader != null) {
+ reader.dispose();
+ }
}
}
@@ -310,7 +316,7 @@
}
public void scale(double scale, double scaleY) throws ImageOpException {
- logger.debug("scale");
+ logger.debug("scale: " + scale);
/* for downscaling in high quality the image is blurred first */
if ((scale <= 0.5) && (quality > 1)) {
int bl = (int) Math.floor(1 / scale);
@@ -524,23 +530,8 @@
img = mirImg;
}
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#finalize()
- */
- protected void finalize() throws Throwable {
- dispose();
- super.finalize();
- }
-
public void dispose() {
- // we must dispose the ImageReader because it keeps the filehandle
- // open!
- if (reader != null) {
- reader.dispose();
- reader = null;
- }
+ // is this necessary?
img = null;
}
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/io/ImageInput.java
--- a/servlet/src/digilib/io/ImageInput.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/io/ImageInput.java Mon Feb 21 22:36:35 2011 +0100
@@ -51,7 +51,15 @@
this.pixelSize = imageSize;
}
- /**
+ /** returns if mimetype has been set.
+ *
+ * @return String
+ */
+ public boolean hasMimetype() {
+ return (mimetype != null);
+ }
+
+ /**
* @return String
*/
public String getMimetype() {
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/io/ImageSet.java
--- a/servlet/src/digilib/io/ImageSet.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/io/ImageSet.java Mon Feb 21 22:36:35 2011 +0100
@@ -92,7 +92,8 @@
public ImageInput getNextSmaller(ImageSize size) {
for (ListIterator i = getHiresIterator(); i.hasNext();) {
ImageInput f = i.next();
- if (f.getSize().isTotallySmallerThan(size)) {
+ ImageSize is = f.getSize();
+ if (is != null && is.isTotallySmallerThan(size)) {
return f;
}
}
@@ -112,7 +113,8 @@
public ImageInput getNextBigger(ImageSize size) {
for (ListIterator i = getLoresIterator(); i.hasPrevious();) {
ImageInput f = i.previous();
- if (f.getSize().isBiggerThan(size)) {
+ ImageSize is = f.getSize();
+ if (is != null && is.isBiggerThan(size)) {
return f;
}
}
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/servlet/AsyncServletWorker.java
--- a/servlet/src/digilib/servlet/AsyncServletWorker.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/servlet/AsyncServletWorker.java Mon Feb 21 22:36:35 2011 +0100
@@ -50,7 +50,7 @@
}
/**
- * runs the ImakeWorker and writes the image to the ServletResponse.
+ * runs the ImageWorker and writes the image to the ServletResponse.
*/
public void run() {
// get fresh response
@@ -60,7 +60,7 @@
DocuImage img = imageWorker.call();
// send image
ServletOps.sendImage(img, null, response, logger);
- logger.debug("Job Processing Time: "
+ logger.debug("Job done in: "
+ (System.currentTimeMillis() - startTime) + "ms");
} catch (ImageOpException e) {
logger.error(e.getClass() + ": " + e.getMessage());
@@ -70,8 +70,11 @@
Scaler.digilibError(errMsgType, Error.FILE, null, response);
} catch (ServletException e) {
logger.error("Servlet error: ", e);
+ } catch (Exception e) {
+ logger.error("Other error: ", e);
} finally {
// submit response
+ logger.debug("context complete.");
asyncContext.complete();
}
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/servlet/Scaler.java
--- a/servlet/src/digilib/servlet/Scaler.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/servlet/Scaler.java Mon Feb 21 22:36:35 2011 +0100
@@ -31,7 +31,7 @@
private static final long serialVersionUID = 5289386646192471549L;
/** digilib servlet version (for all components) */
- public static final String version = "1.9.1a3";
+ public static final String version = "1.9.1a7";
/** servlet error codes */
public static enum Error {UNKNOWN, AUTH, FILE, IMAGE};
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/servlet/ScalerNoAsync.java
--- a/servlet/src/digilib/servlet/ScalerNoAsync.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/servlet/ScalerNoAsync.java Mon Feb 21 22:36:35 2011 +0100
@@ -34,7 +34,7 @@
private static final long serialVersionUID = -5439198888139362735L;
/** digilib servlet version (for all components) */
- public static final String version = "1.9.0a3 noasync";
+ public static final String version = "1.9.0a5 noasync";
/** servlet error codes */
public static enum Error {UNKNOWN, AUTH, FILE, IMAGE};
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/servlet/ScalerNoThread.java
--- a/servlet/src/digilib/servlet/ScalerNoThread.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/servlet/ScalerNoThread.java Mon Feb 21 22:36:35 2011 +0100
@@ -31,7 +31,7 @@
private static final long serialVersionUID = 1450947819851623306L;
/** digilib servlet version (for all components) */
- public static final String version = "1.9.0a3 nothread";
+ public static final String version = "1.9.0a5 nothread";
/** servlet error codes */
public static enum Error {UNKNOWN, AUTH, FILE, IMAGE};
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/servlet/ServletOps.java
--- a/servlet/src/digilib/servlet/ServletOps.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/servlet/ServletOps.java Mon Feb 21 22:36:35 2011 +0100
@@ -191,10 +191,10 @@
* @throws ImageOpException
* @throws ServletException
* Exception on sending data.
+ * @throws IOException
*/
public static void sendFile(File f, String mt, String name,
- HttpServletResponse response) throws ImageOpException,
- ServletException {
+ HttpServletResponse response) throws ImageOpException, IOException {
// use default logger
ServletOps.sendFile(f, mt, name, response, ServletOps.logger);
}
@@ -217,14 +217,11 @@
* Logger to use
* @throws ImageOpException
* @throws ServletException Exception on sending data.
+ * @throws IOException
*/
public static void sendFile(File f, String mt, String name, HttpServletResponse response, Logger logger)
- throws ImageOpException, ServletException {
+ throws ImageOpException, IOException {
logger.debug("sendRawFile(" + mt + ", " + f + ")");
- if (response.isCommitted()) {
- logger.warn("sendFile: response already committed!");
- //return;
- }
if (mt == null) {
// auto-detect mime-type
mt = FileOps.mimeForFile(f);
@@ -254,9 +251,6 @@
// copy out file
outStream.write(dataBuffer, 0, len);
}
- } catch (IOException e) {
- logger.error("Error sending file:", e);
- throw new ServletException("Error sending file:", e);
} finally {
try {
if (inFile != null) {
@@ -297,19 +291,20 @@
HttpServletResponse response, Logger logger) throws ImageOpException,
ServletException {
logger.debug("sending to response:"+ response + " committed=" + response.isCommitted());
- if (response.isCommitted()) {
- logger.warn("sendImage: response already committed!");
- //return;
- }
try {
OutputStream outstream = response.getOutputStream();
// setup output -- if mime type is set use that otherwise
// if source is JPG then dest will be JPG else it's PNG
if (mimeType == null) {
mimeType = img.getMimetype();
+ if (mimeType == null) {
+ // still no mime-type
+ logger.warn("sendImage without mime-type! using image/jpeg.");
+ mimeType = "image/jpeg";
+ }
}
- if ((mimeType.equals("image/jpeg") || mimeType.equals("image/jp2") || mimeType
- .equals("image/fpx"))) {
+ if ((mimeType.equals("image/jpeg") || mimeType.equals("image/jp2") ||
+ mimeType.equals("image/fpx"))) {
mimeType = "image/jpeg";
} else {
mimeType = "image/png";
@@ -318,7 +313,6 @@
response.setContentType(mimeType);
img.writeImage(mimeType, outstream);
} catch (IOException e) {
- logger.error("Error sending image:", e);
throw new ServletException("Error sending image:", e);
}
// TODO: should we: finally { img.dispose(); }
diff -r 0b4345866797 -r a23c4c15a6a8 servlet/src/digilib/servlet/Texter.java
--- a/servlet/src/digilib/servlet/Texter.java Mon Feb 21 10:24:48 2011 +0100
+++ b/servlet/src/digilib/servlet/Texter.java Mon Feb 21 22:36:35 2011 +0100
@@ -43,8 +43,10 @@
*/
public class Texter extends HttpServlet {
- /** Servlet version */
- public static String tlVersion = "0.1b2";
+ private static final long serialVersionUID = 6678666342141409867L;
+
+ /** Servlet version */
+ public static String tlVersion = "0.1b3";
/** DigilibConfiguration instance */
DigilibConfiguration dlConfig = null;
@@ -128,7 +130,7 @@
}
protected void processRequest(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
+ HttpServletResponse response) {
/*
* request parameters
@@ -146,7 +148,7 @@
} else {
f = getTextFile(dlRequest, "");
if (f != null) {
- ServletOps.sendFile(f.getFile(), null, null, response, logger);
+ ServletOps.sendFile(f.getFile(), null, null, response, logger);
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Text-File not found!");
//ServletOps.htmlMessage("No Text-File!", response);
@@ -156,7 +158,13 @@
} catch (ImageOpException e) {
// most likely wrong file format...
logger.error("ERROR sending text file: ", e);
- response.sendError(HttpServletResponse.SC_BAD_REQUEST);
+ try {
+ response.sendError(HttpServletResponse.SC_BAD_REQUEST);
+ } catch (IOException e1) {
+ logger.error("ERROR sending error: ", e1);
+ }
+ } catch (IOException e) {
+ logger.error("ERROR sending text file: ", e);
}
}
@@ -175,7 +183,7 @@
private TextFile getTextFile(DigilibRequest dlRequest, String subDirectory) {
String loadPathName = dlRequest.getFilePath() + subDirectory;
// find the file(set)
- return (TextFile) dirCache.getFile(loadPathName, dlRequest
- .getAsInt("pn"), FileClass.TEXT);
+ return (TextFile) dirCache.getFile(loadPathName, dlRequest.getAsInt("pn"),
+ FileClass.TEXT);
}
}
\ No newline at end of file