diff servlet/src/digilib/image/JAIImageLoaderDocuImage.java @ 588:aee436f0549d stream

more work on stream input
author robcast
date Thu, 06 Jan 2011 14:37:50 +0100
parents fd2ef7e46119
children 73e041c710d3
line wrap: on
line diff
--- a/servlet/src/digilib/image/JAIImageLoaderDocuImage.java	Thu Jan 06 11:57:32 2011 +0100
+++ b/servlet/src/digilib/image/JAIImageLoaderDocuImage.java	Thu Jan 06 14:37:50 2011 +0100
@@ -38,7 +38,7 @@
 import javax.servlet.ServletException;
 
 import digilib.io.FileOpException;
-import digilib.io.ImageFile;
+import digilib.io.ImageInput;
 
 /** DocuImage implementation using the Java Advanced Imaging API and the ImageLoader
  * API of Java 1.4.
@@ -80,44 +80,70 @@
 
 
 	/* Load an image file into the Object. */
-	public void loadImage(ImageFile f) throws FileOpException {
-		logger.debug("loadImage: "+f.getFile());
+	public void loadImage(ImageInput ii) throws FileOpException {
+		logger.debug("loadImage: "+ii.getFile());
 		//System.gc();
-		img = JAI.create("ImageRead", f.getFile().getAbsolutePath());
+		img = JAI.create("ImageRead", ii.getFile().getAbsolutePath());
 		if (img == null) {
 			throw new FileOpException("Unable to load File!");
 		}
-        mimeType = f.getMimetype();
 	}
 
 	/* Get an ImageReader for the image file. */
-	public ImageReader getReader(ImageFile f) throws IOException {
-		logger.debug("preloadImage: "+f.getFile());
-		//System.gc();
-		RandomAccessFile rf = new RandomAccessFile(f.getFile(), "r");
-		ImageInputStream istream = new FileImageInputStream(rf);
-		//Iterator readers = ImageIO.getImageReaders(istream);
-		Iterator<ImageReader> readers = ImageIO.getImageReadersByMIMEType(f.getMimetype());
-		if (! readers.hasNext()) {
-			throw new FileOpException("Unable to load File!");
-		}
-		reader = readers.next();
-		logger.debug("JAIImageIO: this reader: " + reader.getClass());
-		while (readers.hasNext()) {
-			logger.debug("  next reader: " + readers.next().getClass());
-		}
-		reader.setInput(istream);
-		return reader;
+	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
+            logger.debug("cleaning Reader!");
+            dispose();
+        }
+        this.input = input;
+        ImageInputStream istream = null;
+        if (input.hasImageInputStream()) {
+            // stream input
+            istream = input.getImageInputStream();
+        } else if (input.hasFile()) {
+            // file only input
+            RandomAccessFile rf = new RandomAccessFile(input.getFile(), "r");
+            istream = new FileImageInputStream(rf);
+        } else {
+            throw new FileOpException("Unable to get data from ImageInput");
+        }
+        Iterator<ImageReader> readers;
+        String mt = input.getMimetype();
+        if (mt == null) {
+            logger.debug("No mime-type. Trying automagic.");
+            readers = ImageIO.getImageReaders(istream);
+        } else {
+            logger.debug("File type:" + mt);
+            readers = ImageIO.getImageReadersByMIMEType(mt);
+        }
+        if (!readers.hasNext()) {
+            throw new FileOpException("Can't find Reader to load File!");
+        }
+        reader = readers.next();
+        /* are there more readers? */
+        logger.debug("ImageIO: this reader: " + reader.getClass());
+        /* while (readers.hasNext()) {
+            logger.debug("ImageIO: next reader: " + readers.next().getClass());
+        } */
+        reader.setInput(istream);
+        return reader;
 	}
 
 	/* Load an image file into the Object. */
-	public void loadSubimage(ImageFile f, Rectangle region, int prescale)
+	public void loadSubimage(ImageInput ii, Rectangle region, int prescale)
 		throws FileOpException {
-		logger.debug("loadSubimage: "+f.getFile());
+		logger.debug("loadSubimage: "+ii.getFile());
 		//System.gc();
 		try {
-			if ((reader == null) || (imgFile != f.getFile())) {
-				getReader(f);
+			if ((reader == null) || (imgFile != ii.getFile())) {
+				getReader(ii);
 			}
 			ImageReadParam readParam = reader.getDefaultReadParam();
 			readParam.setSourceRegion(region);
@@ -137,8 +163,7 @@
 		if (img == null) {
 			throw new FileOpException("Unable to load File!");
 		}
-		imgFile = f.getFile();
-        mimeType = f.getMimetype();
+		imgFile = ii.getFile();
 	}