]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
handle image stream better, try to make sure only
authorKeiron Liddle <keiron@apache.org>
Fri, 8 Nov 2002 10:48:00 +0000 (10:48 +0000)
committerKeiron Liddle <keiron@apache.org>
Fri, 8 Nov 2002 10:48:00 +0000 (10:48 +0000)
opened once and properly closed
gif image broken until it can be loaded from a stream

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@195455 13f79535-47bb-0310-9956-ffa450edef68

23 files changed:
src/org/apache/fop/fo/FOUserAgent.java
src/org/apache/fop/image/AbstractFopImage.java
src/org/apache/fop/image/BmpImage.java
src/org/apache/fop/image/EPSImage.java
src/org/apache/fop/image/FopImage.java
src/org/apache/fop/image/FopImageConsumer.java
src/org/apache/fop/image/GifImage.java
src/org/apache/fop/image/ImageFactory.java
src/org/apache/fop/image/JAIImage.java
src/org/apache/fop/image/JimiImage.java
src/org/apache/fop/image/JpegImage.java
src/org/apache/fop/image/XMLImage.java
src/org/apache/fop/image/analyser/BMPReader.java
src/org/apache/fop/image/analyser/EPSReader.java
src/org/apache/fop/image/analyser/GIFReader.java
src/org/apache/fop/image/analyser/ImageReader.java
src/org/apache/fop/image/analyser/ImageReaderFactory.java
src/org/apache/fop/image/analyser/JPEGReader.java
src/org/apache/fop/image/analyser/PNGReader.java
src/org/apache/fop/image/analyser/SVGReader.java
src/org/apache/fop/image/analyser/TIFFReader.java
src/org/apache/fop/image/analyser/XMLReader.java
src/org/apache/fop/svg/PDFGraphics2D.java

index 543b461915e71b2b68081fb5092f372e04dd7fce..adb2fc8c952d77bce9b426432453203f0c2d7c5a 100644 (file)
@@ -13,9 +13,10 @@ import org.apache.fop.render.RendererContext;
 import org.apache.avalon.framework.logger.LogEnabled;
 import org.apache.avalon.framework.logger.Logger;
 
-import org.w3c.dom.*;
-
 import java.util.HashMap;
+import java.io.InputStream;
+
+import org.w3c.dom.Document;
 
 /**
  * The User Agent for fo.
@@ -54,6 +55,14 @@ public class FOUserAgent implements LogEnabled {
         return base;
     }
 
+    /**
+     * Get an input stream for a reference.
+     * Temporary solution until API better.
+     */
+    public InputStream getStream(String uri) {
+        return null;
+    }
+
     public float getPixelUnitToMillimeter() {
         return 0.35277777777777777778f;
     }
index ef9de7992f84a726c37c114eadceebbc06080541..3e3b3220d9215bd90d330a5ce365f00c395aa21b 100644 (file)
@@ -11,6 +11,7 @@ package org.apache.fop.image;
 import java.net.URL;
 import java.awt.color.ColorSpace;
 import java.awt.color.ICC_Profile;
+import java.io.InputStream;
 
 // FOP
 import org.apache.fop.pdf.PDFColor;
@@ -38,9 +39,9 @@ public abstract class AbstractFopImage implements FopImage {
     protected int m_height = 0;
 
     /**
-     * Image URL.
+     * Image input stream.
      */
-    protected URL m_href = null;
+    protected InputStream inputStream = null;
 
     /**
      * ImageReader object (to obtain image header informations).
@@ -85,12 +86,12 @@ public abstract class AbstractFopImage implements FopImage {
      * <LI>image height
      * </UL>
      * The image data isn't kept in memory.
-     * @param href image URL
+     * @param input input stream
      * imgReader ImageReader object
      * @return a new FopImage object
      */
-    public AbstractFopImage(URL href, FopImage.ImageInfo info) {
-        this.m_href = href;
+    public AbstractFopImage(FopImage.ImageInfo info) {
+        this.inputStream = info.inputStream;
         this.imageInfo = info;
         if(this.imageInfo.width != -1) {
             m_width = imageInfo.width;
@@ -146,14 +147,6 @@ public abstract class AbstractFopImage implements FopImage {
         return false;
     }
 
-    /**
-     * Return the image URL.
-     * @return the image URL (as String)
-     */
-    public String getURL() {
-        return this.m_href.toString();
-    }
-
     /**
      * Return the image width.
      * @return the image width
@@ -178,6 +171,9 @@ public abstract class AbstractFopImage implements FopImage {
         return this.m_colorSpace;
     }
 
+    /**
+     * Get ICC profile for this image.
+     */
     public ICC_Profile getICCProfile() {
         return null;
     }
index 583cc756e129ce63110d53249482c56f1e25369b..c6d17d8ff197d7262ea0392b3f065f71fa980b2a 100644 (file)
@@ -25,8 +25,8 @@ import org.apache.fop.image.analyser.ImageReader;
 import org.apache.fop.fo.FOUserAgent;
 
 public class BmpImage extends AbstractFopImage {
-    public BmpImage(URL href, FopImage.ImageInfo imgReader) {
-        super(href, imgReader);
+    public BmpImage(FopImage.ImageInfo imgReader) {
+        super(imgReader);
     }
 
     protected boolean loadBitmap(FOUserAgent ua) {
@@ -34,13 +34,11 @@ public class BmpImage extends AbstractFopImage {
         int hpos = 22; // offset positioning for w and height in  bmp files
         int[] headermap = new int[54];
         int filepos = 0;
-        InputStream file = null;
         byte palette[] = null;
         try {
-            file = this.m_href.openStream();
             boolean eof = false;
             while ((!eof) && (filepos < 54)) {
-                int input = file.read();
+                int input = inputStream.read();
                 if (input == -1)
                     eof = true;
                 else
@@ -54,7 +52,7 @@ public class BmpImage extends AbstractFopImage {
                 while (!eof && countr < palettesize) {
                     int count2 = 2;
                     while (!eof && count2 >= -1) {
-                        int input = file.read();
+                        int input = inputStream.read();
                         if (input == -1)
                             eof = true;
                         else if (count2 >= 0) {
@@ -69,7 +67,7 @@ public class BmpImage extends AbstractFopImage {
             }
         } catch (IOException e) {
             ua.getLogger().error("Error while loading image "
-                                         + this.m_href.toString() + " : "
+                                         + "" + " : "
                                          + e.getClass() + " - "
                                          + e.getMessage(), e);
             return false;
@@ -94,7 +92,7 @@ public class BmpImage extends AbstractFopImage {
         else if (this.m_bitsPerPixel == 4 || this.m_bitsPerPixel == 8)
             bytes = this.m_width / (8 / this.m_bitsPerPixel);
         else {
-            ua.getLogger().error("Image (" + this.m_href.toString()
+            ua.getLogger().error("Image (" + ""
                                          + ") has " + this.m_bitsPerPixel
                                          + " which is not a supported BMP format.");
             return false;
@@ -112,13 +110,14 @@ public class BmpImage extends AbstractFopImage {
         try {
             int input;
             int count = 0;
-            file.skip((long)(imagestart - filepos));
-            while ((input = file.read()) != -1)
+            inputStream.skip((long)(imagestart - filepos));
+            while ((input = inputStream.read()) != -1)
                 temp[count++] = input;
-            file.close();
+            inputStream.close();
+            inputStream = null;
         } catch (IOException e) {
             ua.getLogger().error("Error while loading image "
-                                         + this.m_href.toString() + " : "
+                                         + "" + " : "
                                          + e.getClass() + " - "
                                          + e.getMessage(), e);
             return false;
index 88b0582f3733cb2653e0bd1a2a5ea72bbc2594c9..b6d20755500278daafe2fcf8491818c986fafd91 100644 (file)
@@ -35,14 +35,14 @@ public class EPSImage extends AbstractFopImage {
     /**
      * Initialize docName and bounding box
      */
-    private void init(URL href) {
+    private void init(String name) {
         bbox = new int[4];
         bbox[0] = 0;
         bbox[1] = 0;
         bbox[2] = 0;
         bbox[3] = 0;
 
-        docName = href.toString();
+        docName = name;
     }
 
     /**
@@ -59,9 +59,9 @@ public class EPSImage extends AbstractFopImage {
         return bbox;
     }
 
-    public EPSImage(URL href, FopImage.ImageInfo imgInfo) {
-        super(href, imgInfo);
-        init(href);
+    public EPSImage(FopImage.ImageInfo imgInfo) {
+        super(imgInfo);
+        init("");
         if (imgInfo.data instanceof EPSData) {
             epsData = (EPSData) imgInfo.data;
             bbox = new int[4];
index a09272a2a93f522d71d22e50d30bd550582a5a1b..229bec44ad3dd58f21fb9c2aef80e196a3f33892 100644 (file)
@@ -32,9 +32,6 @@ public interface FopImage {
      */
     public boolean load(int type, FOUserAgent ua);
 
-    // Ressource location
-    public String getURL();
-
     // image size
     public int getWidth();
     public int getHeight();
@@ -65,7 +62,7 @@ public interface FopImage {
     public int getRessourceBytesSize();
 
     public static class ImageInfo {
-        public InputStream stream;
+        public InputStream inputStream;
         public int width;
         public int height;
         public Object data;
index 15b8c5ca3070df1580a53de79c241438799093b5..b4ed55b91b874c082bddc3e37150ecf6d4336c2f 100644 (file)
@@ -134,3 +134,4 @@ public class FopImageConsumer implements ImageConsumer {
     }
 
 }
+
index 32495c0e008c959c9c1832cdf6c81203d978afa3..31c6966272c06c0adea3d2d90357108080442234 100644 (file)
@@ -13,6 +13,7 @@ import java.awt.image.ImageProducer;
 import java.awt.image.ColorModel;
 import java.awt.image.IndexColorModel;
 import java.awt.color.ColorSpace;
+import java.io.InputStream;
 
 // FOP
 import org.apache.fop.pdf.PDFColor;
@@ -27,14 +28,19 @@ import org.apache.fop.fo.FOUserAgent;
  * @see FopImage
  */
 public class GifImage extends AbstractFopImage {
-    public GifImage(URL href, FopImage.ImageInfo imgReader) {
-        super(href, imgReader);
+    public GifImage(FopImage.ImageInfo imgReader) {
+        super(imgReader);
     }
 
     protected boolean loadBitmap(FOUserAgent ua) {
         int[] tmpMap = null;
+
         try {
-            ImageProducer ip = (ImageProducer) this.m_href.getContent();
+            ImageProducer ip = null;
+            // todo: how to load gif image from stream
+            //ip = (ImageProducer) inputStream.getContent();
+            inputStream.close();
+            inputStream = null;
             FopImageConsumer consumer = new FopImageConsumer(ip);
             ip.startProduction(consumer);
 
@@ -66,21 +72,18 @@ public class GifImage extends AbstractFopImage {
                 } else if (transparencyType ==
                     java.awt.Transparency.BITMASK) {
                     if (cm instanceof IndexColorModel) {
+                        IndexColorModel indexcm = (IndexColorModel) cm;
                         this.m_isTransparent = false;
-                        byte[] alphas = new byte[
-                                          ((IndexColorModel) cm).getMapSize()];
-                        byte[] reds = new byte[
-                                        ((IndexColorModel) cm).getMapSize()];
-                        byte[] greens = new byte[
-                                          ((IndexColorModel) cm).getMapSize()];
-                        byte[] blues = new byte[
-                                         ((IndexColorModel) cm).getMapSize()];
-                        ((IndexColorModel) cm).getAlphas(alphas);
-                        ((IndexColorModel) cm).getReds(reds);
-                        ((IndexColorModel) cm).getGreens(greens);
-                        ((IndexColorModel) cm).getBlues(blues);
+                        byte[] alphas = new byte[indexcm.getMapSize()];
+                        byte[] reds = new byte[indexcm.getMapSize()];
+                        byte[] greens = new byte[indexcm.getMapSize()];
+                        byte[] blues = new byte[indexcm.getMapSize()];
+                        indexcm.getAlphas(alphas);
+                        indexcm.getReds(reds);
+                        indexcm.getGreens(greens);
+                        indexcm.getBlues(blues);
                         for (int i = 0;
-                                i < ((IndexColorModel) cm).getMapSize();
+                                i < indexcm.getMapSize();
                                 i++) {
                             if ((alphas[i] & 0xFF) == 0) {
                                 this.m_isTransparent = true;
@@ -114,7 +117,7 @@ public class GifImage extends AbstractFopImage {
             }
         } catch (Exception ex) {
             ua.getLogger().error("Error while loading image "
-                                         + this.m_href.toString() + " : "
+                                         + "" + " : "
                                          + ex.getClass() + " - "
                                          + ex.getMessage(), ex);
             return false;
index 8189c0559c1b9486557cbb06610e617d3094b6c0..a4fc8c92c7aedd14a28fcc8ed62fd05102ff6469 100644 (file)
@@ -10,6 +10,7 @@ package org.apache.fop.image;
 // Java
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.BufferedInputStream;
 import java.io.File;
 import java.net.URL;
 import java.net.MalformedURLException;
@@ -59,7 +60,6 @@ public class ImageFactory {
          */
         // Get the absolute URL
         URL absoluteURL = null;
-        InputStream imgIS = null;
         href = href.trim();
         if (href.startsWith("url(") && (href.indexOf(")") != -1)) {
             href = href.substring(4, href.indexOf(")")).trim();
@@ -102,9 +102,92 @@ public class ImageFactory {
     protected static FopImage loadImage(String href, String baseURL,
                                         FOUserAgent ua) {
         Logger log = ua.getLogger();
+
+        InputStream imgIS = openStream(href, baseURL, ua);
+
+        // If not, check image type
+        FopImage.ImageInfo imgInfo = null;
+        try {
+            imgInfo = ImageReaderFactory.make(
+                          href, imgIS, ua);
+        } catch (Exception e) {
+            log.error("Error while recovering Image Informations (" +
+                      href + ") : " + e.getMessage(), e);
+            return null;
+        }
+        if (imgInfo == null) {
+            try {
+                imgIS.close();
+                imgIS = null;
+            } catch (Exception e) {
+            }
+            log.error("No ImageReader for this type of image (" +
+                      href + ")");
+            return null;
+        }
+        // Associate mime-type to FopImage class
+        String imgMimeType = imgInfo.mimeType;
+        String imgClassName = getImageClassName(imgMimeType);
+        if (imgClassName == null) {
+            log.error("Unsupported image type (" +
+                      href + ") : " + imgMimeType);
+            return null;
+        }
+
+        // load the right image class
+        // return new <FopImage implementing class>
+        Object imageInstance = null;
+        Class imageClass = null;
+        try {
+            imageClass = Class.forName(imgClassName);
+            Class[] imageConstructorParameters = new Class[1];
+            imageConstructorParameters[0] = org.apache.fop.image.FopImage.ImageInfo.class;
+            Constructor imageConstructor =
+              imageClass.getDeclaredConstructor(
+                imageConstructorParameters);
+            Object[] initArgs = new Object[1];
+            initArgs[0] = imgInfo;
+            imageInstance = imageConstructor.newInstance(initArgs);
+        } catch (java.lang.reflect.InvocationTargetException ex) {
+            Throwable t = ex.getTargetException();
+            String msg;
+            if (t != null) {
+                msg = t.getMessage();
+            } else {
+                msg = ex.getMessage();
+            }
+            log.error("Error creating FopImage object (" +
+                      href + ") : " + msg, (t == null) ? ex:t);
+            return null;
+        }
+        catch (Exception ex) {
+            log.error("Error creating FopImage object (" +
+                      href + ") : " + ex.getMessage(), ex);
+            return null;
+        }
+        if (!(imageInstance instanceof org.apache.fop.image.FopImage)) {
+            log.error("Error creating FopImage object (" +
+                      href + ") : " + "class " +
+                      imageClass.getName() + " doesn't implement org.apache.fop.image.FopImage interface");
+            return null;
+        }
+        return (FopImage) imageInstance;
+    }
+
+    /**
+     * create an FopImage objects.
+     * @param href image URL as a String
+     * @return a new FopImage object
+     */
+    protected static InputStream openStream(String href, String baseURL,
+                                        FOUserAgent ua) {
+        Logger log = ua.getLogger();
         // Get the absolute URL
         URL absoluteURL = null;
-        InputStream imgIS = null;
+        InputStream imgIS = ua.getStream(href);
+        if(imgIS != null) {
+            return imgIS;
+        }
         try {
             // try url as complete first, this can cause
             // a problem with relative uri's if there is an
@@ -138,31 +221,23 @@ public class ImageFactory {
             }
         }
 
+        BufferedInputStream bis = null;
         // If not, check image type
         FopImage.ImageInfo imgInfo = null;
         try {
             if (imgIS == null) {
                 imgIS = absoluteURL.openStream();
             }
-            imgInfo = ImageReaderFactory.make(
-                          absoluteURL.toExternalForm(), imgIS, ua);
+            bis = new BufferedInputStream(imgIS);
         } catch (Exception e) {
-            log.error("Error while recovering Image Informations (" +
-                      absoluteURL.toString() + ") : " + e.getMessage(), e);
+            log.error("Error while opening stream for (" +
+                      href + ") : " + e.getMessage(), e);
             return null;
         }
-        finally { if (imgIS != null) {
-                  try {
-                          imgIS.close();
-                  } catch (IOException e) {}
-                  }
-            } if (imgInfo == null) {
-            log.error("No ImageReader for this type of image (" +
-                      absoluteURL.toString() + ")");
-            return null;
-        }
-        // Associate mime-type to FopImage class
-        String imgMimeType = imgInfo.mimeType;
+        return bis;
+    }
+
+    private static String getImageClassName(String imgMimeType) {
         String imgClassName = null;
         if ("image/gif".equals(imgMimeType)) {
             imgClassName = "org.apache.fop.image.GifImage";
@@ -189,54 +264,8 @@ public class ImageFactory {
         } else if ("text/xml".equals(imgMimeType)) {
             imgClassName = "org.apache.fop.image.XMLImage";
         }
-        if (imgClassName == null) {
-            log.error("Unsupported image type (" +
-                      absoluteURL.toString() + ") : " + imgMimeType);
-            return null;
-        }
-
-        // load the right image class
-        // return new <FopImage implementing class>
-        Object imageInstance = null;
-        Class imageClass = null;
-        try {
-            imageClass = Class.forName(imgClassName);
-            Class[] imageConstructorParameters = new Class[2];
-            imageConstructorParameters[0] = java.net.URL.class;
-            imageConstructorParameters[1] = org.apache.fop.image.FopImage.ImageInfo.class;
-            Constructor imageConstructor =
-              imageClass.getDeclaredConstructor(
-                imageConstructorParameters);
-            Object[] initArgs = new Object[2];
-            initArgs[0] = absoluteURL;
-            initArgs[1] = imgInfo;
-            imageInstance = imageConstructor.newInstance(initArgs);
-        } catch (java.lang.reflect.InvocationTargetException ex) {
-            Throwable t = ex.getTargetException();
-            String msg;
-            if (t != null) {
-                msg = t.getMessage();
-            } else {
-                msg = ex.getMessage();
-            }
-            log.error("Error creating FopImage object (" +
-                      absoluteURL.toString() + ") : " + msg, (t == null) ? ex:t);
-            return null;
-        }
-        catch (Exception ex) {
-            log.error("Error creating FopImage object (" +
-                      absoluteURL.toString() + ") : " + ex.getMessage(), ex);
-            return null;
-        }
-        if (!(imageInstance instanceof org.apache.fop.image.FopImage)) {
-            log.error("Error creating FopImage object (" +
-                      absoluteURL.toString() + ") : " + "class " +
-                      imageClass.getName() + " doesn't implement org.apache.fop.image.FopImage interface");
-            return null;
-        }
-        return (FopImage) imageInstance;
+        return imgClassName;
     }
-
 }
 
 class BasicImageCache implements ImageCache {
index 1a1a42e43dec3008a7553da18748509842dcb810..c4da068e6fb4d455cf88a1019c7d76ba7ebafa13 100644 (file)
@@ -10,7 +10,7 @@ package org.apache.fop.image;
 // Java
 import java.net.URL;
 import java.io.InputStream;
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 
 // AWT
 import java.awt.image.ColorModel;
@@ -36,20 +36,17 @@ import org.apache.fop.image.analyser.ImageReader;
  */
 public class JAIImage extends AbstractFopImage {
 
-    public JAIImage(URL href, FopImage.ImageInfo imgReader) {
-        super(href, imgReader);
+    public JAIImage(FopImage.ImageInfo imgReader) {
+        super(imgReader);
     }
 
     protected void loadImage() {
         try {
-            InputStream inputStream = this.m_href.openStream();
-            /*
-             * BufferedInputStream inputStream = this.m_imageReader.getInputStream();
-             * inputStream.reset();
-             */
             com.sun.media.jai.codec.FileCacheSeekableStream seekableInput =
               new FileCacheSeekableStream(inputStream);
             RenderedOp imageOp = JAI.create("stream", seekableInput);
+            inputStream.close();
+            inputStream = null;
 
             this.m_height = imageOp.getHeight();
             this.m_width = imageOp.getWidth();
@@ -138,7 +135,7 @@ public class JAIImage extends AbstractFopImage {
         }
         catch (Exception ex) {
             /*throw new FopImageException("Error while loading image "
-                                         + this.m_href.toString() + " : "
+                                         + "" + " : "
                                          + ex.getClass() + " - "
                                          + ex.getMessage());
              */}
index 4cc780a6fce264a03fe496988709ee36a0717848..8369ab66e62fecccf9123a5822b50978f32920c4 100644 (file)
@@ -13,6 +13,7 @@ import java.awt.image.ImageProducer;
 import java.awt.image.ColorModel;
 import java.awt.image.IndexColorModel;
 import java.awt.color.ColorSpace;
+import java.io.InputStream;
 
 // Jimi
 import com.sun.jimi.core.*;
@@ -32,8 +33,8 @@ import org.apache.avalon.framework.logger.Logger;
  * @see FopImage
  */
 public class JimiImage extends AbstractFopImage {
-    public JimiImage(URL href, FopImage.ImageInfo imgReader) {
-        super(href, imgReader);
+    public JimiImage(FopImage.ImageInfo imgReader) {
+        super(imgReader);
         try {
             Class c = Class.forName("com.sun.jimi.core.Jimi");
         } catch (ClassNotFoundException e) {
@@ -61,7 +62,7 @@ public class JimiImage extends AbstractFopImage {
         int[] tmpMap = null;
         try {
             ImageProducer ip =
-              Jimi.getImageProducer(this.m_href.openStream(),
+              Jimi.getImageProducer(inputStream,
                                     Jimi.SYNCHRONOUS | Jimi.IN_MEMORY);
             FopImageConsumer consumer = new FopImageConsumer(ip);
             ip.startProduction(consumer);
@@ -72,6 +73,9 @@ public class JimiImage extends AbstractFopImage {
             this.m_height = consumer.getHeight();
             this.m_width = consumer.getWidth();
 
+            inputStream.close();
+            inputStream = null;
+
             try {
                 tmpMap = consumer.getImage();
             } catch (Exception ex) {
@@ -139,7 +143,7 @@ public class JimiImage extends AbstractFopImage {
             }
         } catch (Throwable ex) {
             log.error("Error while loading image "
-                               + this.m_href.toString(), ex);
+                               + "", ex);
             return;
         }
 
index 2fa105b523657f7c64244ca50ca49c299499ff42..62b64bac1798c08579dbfbe096133a3ac9c66bf7 100644 (file)
@@ -33,8 +33,8 @@ public class JpegImage extends AbstractFopImage {
     boolean found_icc_profile = false;
     boolean found_dimensions = false;
 
-    public JpegImage(URL href, FopImage.ImageInfo imgReader) {
-        super(href, imgReader);
+    public JpegImage(FopImage.ImageInfo imgReader) {
+        super(imgReader);
     }
 
     protected boolean loadOriginalData(FOUserAgent ua) {
@@ -47,14 +47,16 @@ public class JpegImage extends AbstractFopImage {
         boolean cont = true;
 
         try {
-            inStream = this.m_href.openStream();
+            inStream = inputStream;
 
             while ((bytes_read = inStream.read(readBuf)) != -1) {
                 baos.write(readBuf, 0, bytes_read);
             }
+            inputStream.close();
+            inputStream = null;
         } catch (java.io.IOException ex) {
             ua.getLogger().error("Error while loading image " +
-                                         this.m_href.toString() + " : " + ex.getClass() +
+                                         "" + " : " + ex.getClass() +
                                          " - " + ex.getMessage(), ex);
             return false;
         }
@@ -94,7 +96,7 @@ public class JpegImage extends AbstractFopImage {
                               ColorSpace.CS_CIEXYZ);
                         } else {
                             ua.getLogger().error("Unknown ColorSpace for image: "
-                                                   + this.m_href.toString());
+                                                   + "");
                             return false;
                         }
 
@@ -140,7 +142,7 @@ public class JpegImage extends AbstractFopImage {
             }
         } else {
             ua.getLogger().error( "1 Error while loading image " +
-                                          this.m_href.toString() +
+                                          "" +
                                           " : JpegImage - Invalid JPEG Header.");
             return false;
         }
@@ -150,14 +152,14 @@ public class JpegImage extends AbstractFopImage {
                 iccStream.write(align);
             } catch (Exception e) {
                 ua.getLogger().error( "1 Error while loading image " +
-                                              this.m_href.toString() + " : " +
+                                              "" + " : " +
                                               e.getMessage(), e);
                 return false;
             }
             iccProfile = ICC_Profile.getInstance(iccStream.toByteArray());
         } else if(this.m_colorSpace == null) {
             ua.getLogger().error("ColorSpace not specified for image: "
-                                     + this.m_href.toString());
+                                     + "");
             return false;
         }
         return true;
index aa74eb0c9a30fc3a9a9402d23910ec2247cbc203..d544efbed906d1e229e316e10ec7d858cfd10ddf 100644 (file)
@@ -10,6 +10,7 @@ package org.apache.fop.image;
 // Java
 import java.net.URL;
 import org.w3c.dom.Document;
+import java.io.InputStream;
 
 // FOP
 import org.apache.fop.apps.Driver;
@@ -25,8 +26,8 @@ public class XMLImage extends AbstractFopImage {
     Document doc;
     String ns = "";
 
-    public XMLImage(URL href, FopImage.ImageInfo imgInfo) {
-        super(href, imgInfo);
+    public XMLImage(FopImage.ImageInfo imgInfo) {
+        super(imgInfo);
         if(imgInfo.data instanceof Document) {
             doc = (Document)imgInfo.data;
             loaded = loaded | ORIGINAL_DATA;
index b15fd731cf38d521e506ab9cbe966543ed5f00a2..7a1ea9afed2ce7a744cf7bcd472566da911f4a85 100644 (file)
@@ -7,7 +7,7 @@
 package org.apache.fop.image.analyser;
 
 // Java
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.IOException;
 
 // FOP
@@ -26,13 +26,15 @@ public class BMPReader implements ImageReader {
     protected static final int BMP_SIG_LENGTH = 26;
 
     /** @see org.apache.fop.image.analyser.ImageReader */
-    public FopImage.ImageInfo verifySignature(String uri, BufferedInputStream bis,
+    public FopImage.ImageInfo verifySignature(String uri, InputStream bis,
                 FOUserAgent ua) throws IOException {
         byte[] header = getDefaultHeader(bis);
         boolean supported = ((header[0] == (byte) 0x42)
                 && (header[1] == (byte) 0x4d));
         if (supported) {
-            return getDimension(header);
+            FopImage.ImageInfo info = getDimension(header);
+            info.inputStream = bis;
+            return info;
         } else {
             return null;
         }
@@ -69,7 +71,7 @@ public class BMPReader implements ImageReader {
         return info;
     }
 
-    private byte[] getDefaultHeader(BufferedInputStream imageStream)
+    private byte[] getDefaultHeader(InputStream imageStream)
                 throws IOException {
         byte[] header = new byte[BMP_SIG_LENGTH];
         try {
@@ -87,4 +89,4 @@ public class BMPReader implements ImageReader {
         return header;
     }
 
-}
\ No newline at end of file
+}
index 4a0621a76ca5dd3e248675e82a6acf3f34430f1f..4cb7f0a5b5afb7782a62bcda9eb68e23d0e38a18 100644 (file)
@@ -7,7 +7,7 @@
 package org.apache.fop.image.analyser;
 
 // Java
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
@@ -27,7 +27,7 @@ public class EPSReader implements ImageReader {
     private static final byte[] BOUNDINGBOX = "%%BoundingBox: ".getBytes();
 
     /** @see org.apache.fop.image.analyser.ImageReader */
-    public FopImage.ImageInfo verifySignature(String uri, BufferedInputStream bis,
+    public FopImage.ImageInfo verifySignature(String uri, InputStream bis,
                 FOUserAgent ua) throws IOException {
 
         boolean isEPS = false;
@@ -73,6 +73,11 @@ public class EPSReader implements ImageReader {
             if (data.bbox != null) {
                 info.width = (int) (data.bbox[2] - data.bbox[0]);
                 info.height = (int) (data.bbox[3] - data.bbox[1]);
+
+                // image data read
+                bis.close();
+                info.inputStream = null;
+
                 return info;
             } else {
                 // Ain't eps if no BoundingBox
@@ -108,7 +113,7 @@ public class EPSReader implements ImageReader {
      * @param data             EPSData object to write the results to
      * @exception IOException  If an I/O error occurs
      */
-    private void readEPSImage(BufferedInputStream bis, EPSImage.EPSData data)
+    private void readEPSImage(InputStream bis, EPSImage.EPSData data)
                 throws IOException {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         byte[] file;
index 4b4a0cf57a13e2356fedd07feadaae507216b351..ac7cadc544a5b6790f399d34d316a6791a3317a3 100644 (file)
@@ -7,7 +7,7 @@
 package org.apache.fop.image.analyser;
 
 // Java
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.IOException;
 
 // FOP
@@ -25,7 +25,7 @@ public class GIFReader implements ImageReader {
     private static final int GIF_SIG_LENGTH = 10;
 
     /** @see org.apache.fop.image.analyser.ImageReader */
-    public FopImage.ImageInfo verifySignature(String uri, BufferedInputStream bis,
+    public FopImage.ImageInfo verifySignature(String uri, InputStream bis,
                 FOUserAgent ua) throws IOException {
         byte[] header = getDefaultHeader(bis);
         boolean supported = ((header[0] == 'G')
@@ -37,6 +37,7 @@ public class GIFReader implements ImageReader {
         if (supported) {
             FopImage.ImageInfo info = getDimension(header);
             info.mimeType = getMimeType();
+            info.inputStream = bis;
             return info;
         } else {
             return null;
@@ -65,7 +66,7 @@ public class GIFReader implements ImageReader {
         return info;
     }
 
-    private byte[] getDefaultHeader(BufferedInputStream imageStream)
+    private byte[] getDefaultHeader(InputStream imageStream)
                 throws IOException {
         byte[] header = new byte[GIF_SIG_LENGTH];
         try {
@@ -83,4 +84,5 @@ public class GIFReader implements ImageReader {
         return header;
     }
 
-}
\ No newline at end of file
+}
+
index 8137cc239a911cf8767537c009cfc69dcab495ca..576874aa9eaff5372f056a853bf1c37495b0e267 100644 (file)
@@ -7,7 +7,7 @@
 package org.apache.fop.image.analyser;
 
 // Java
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.IOException;
 
 // FOP
@@ -35,7 +35,7 @@ public interface ImageReader {
      * @return                 <code>true</code> if image type is the handled one
      * @exception IOException  if an I/O error occurs
      */
-    FopImage.ImageInfo verifySignature(String uri, BufferedInputStream bis,
+    FopImage.ImageInfo verifySignature(String uri, InputStream bis,
             FOUserAgent ua)
         throws IOException;
 
index 124182a0b82929487c6f58a542bd1e82f1ccb569..894ce40e973940ab1e3ea86b87060304618b4b2c 100644 (file)
@@ -8,7 +8,6 @@ package org.apache.fop.image.analyser;
 
 // Java
 import java.io.InputStream;
-import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 
@@ -60,11 +59,10 @@ public class ImageReaderFactory {
             FOUserAgent ua) {
 
         ImageReader reader;
-        BufferedInputStream bis = new BufferedInputStream(in);
         try {
             for (int count = 0; count < formats.size(); count++) {
                 reader = (ImageReader) formats.get(count);
-                FopImage.ImageInfo info = reader.verifySignature(uri, bis, ua);
+                FopImage.ImageInfo info = reader.verifySignature(uri, in, ua);
                 if (info != null) {
                     return info;
                 }
index bddbc2040b2e8ff49757997c9e82fcb110e0a506..90652b14eb3caee029329969403dc4c1b9347e27 100644 (file)
@@ -7,7 +7,7 @@
 package org.apache.fop.image.analyser;
 
 // Java
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.IOException;
 
 // FOP
@@ -42,7 +42,7 @@ public class JPEGReader implements ImageReader {
     private static final int JPG_SIG_LENGTH = 2;
 
     /** @see org.apache.fop.image.analyser.ImageReader */
-    public FopImage.ImageInfo verifySignature(String uri, BufferedInputStream fis,
+    public FopImage.ImageInfo verifySignature(String uri, InputStream fis,
                                    FOUserAgent ua) throws IOException {
         byte[] header = getDefaultHeader(fis);
         boolean supported = ((header[0] == (byte) 0xff)
@@ -50,6 +50,7 @@ public class JPEGReader implements ImageReader {
         if (supported) {
             FopImage.ImageInfo info = getDimension(fis);
             info.mimeType = getMimeType();
+            info.inputStream = fis;
             return info;
         } else {
             return null;
@@ -65,7 +66,7 @@ public class JPEGReader implements ImageReader {
         return "image/jpeg";
     }
 
-    private byte[] getDefaultHeader(BufferedInputStream imageStream) throws IOException {
+    private byte[] getDefaultHeader(InputStream imageStream) throws IOException {
         byte[] header = new byte[JPG_SIG_LENGTH];
         try {
             imageStream.mark(JPG_SIG_LENGTH + 1);
@@ -82,12 +83,13 @@ public class JPEGReader implements ImageReader {
         return header;
     }
 
-    private FopImage.ImageInfo getDimension(BufferedInputStream imageStream) throws IOException {
+    private FopImage.ImageInfo getDimension(InputStream imageStream) throws IOException {
         FopImage.ImageInfo info = new FopImage.ImageInfo();
         try {
+            imageStream.mark(imageStream.available());
             int marker = NULL;
             long length, skipped;
-            outer:
+outer:
             while (imageStream.available() > 0) {
                 while ((marker = imageStream.read()) != MARK) {
                     //nop, simply skip
@@ -118,6 +120,7 @@ public class JPEGReader implements ImageReader {
                         }
                 }
             }
+            imageStream.reset();
         } catch (IOException ioe) {
             try {
                 imageStream.reset();
@@ -129,13 +132,13 @@ public class JPEGReader implements ImageReader {
         return info;
     }
 
-    private int read2bytes(BufferedInputStream imageStream) throws IOException {
+    private int read2bytes(InputStream imageStream) throws IOException {
         int byte1 = imageStream.read();
         int byte2 = imageStream.read();
         return (int) ((byte1 << 8) | byte2);
     }
 
-    private long skip(BufferedInputStream imageStream, long n) throws IOException {
+    private long skip(InputStream imageStream, long n) throws IOException {
         long discarded = 0;
         while (discarded != n) {
             imageStream.read();
@@ -144,4 +147,5 @@ public class JPEGReader implements ImageReader {
         return discarded; // scope for exception
     }
 
-}
\ No newline at end of file
+}
+
index 277ed2d5e42eadf50f443d3e7c44fa68b5641dc1..e1ef0d7e6abd318af2979b6379106c878f191cd9 100644 (file)
@@ -7,7 +7,7 @@
 package org.apache.fop.image.analyser;
 
 // Java
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.IOException;
 
 // FOP
@@ -25,7 +25,7 @@ public class PNGReader implements ImageReader {
     private static final int PNG_SIG_LENGTH = 24;
 
     /** @see org.apache.fop.image.analyser.ImageReader */
-    public FopImage.ImageInfo verifySignature(String uri, BufferedInputStream bis,
+    public FopImage.ImageInfo verifySignature(String uri, InputStream bis,
                 FOUserAgent ua) throws IOException {
         byte[] header = getDefaultHeader(bis);
         boolean supported = ((header[0] == (byte) 0x89)
@@ -40,6 +40,7 @@ public class PNGReader implements ImageReader {
         if (supported) {
             FopImage.ImageInfo info = getDimension(header);
             info.mimeType = getMimeType();
+            info.inputStream = bis;
             return info;
         } else {
             return null;
@@ -78,7 +79,7 @@ public class PNGReader implements ImageReader {
         return info;
     }
 
-    private byte[] getDefaultHeader(BufferedInputStream imageStream)
+    private byte[] getDefaultHeader(InputStream imageStream)
                 throws IOException {
         byte[] header = new byte[PNG_SIG_LENGTH];
         try {
@@ -96,4 +97,4 @@ public class PNGReader implements ImageReader {
         return header;
     }
 
-}
\ No newline at end of file
+}
index 8f4c7d9796ba827f2605b33169915fa5fcf2b338..13fab2b85901fa1bfe37807fd9236a86914a84b7 100644 (file)
@@ -7,7 +7,7 @@
 package org.apache.fop.image.analyser;
 
 // Java
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.awt.geom.AffineTransform;
@@ -37,10 +37,17 @@ public class SVGReader implements ImageReader {
     private boolean batik = true;
 
     /** @see org.apache.fop.image.analyser.ImageReader */
-    public FopImage.ImageInfo verifySignature(String uri, BufferedInputStream fis,
+    public FopImage.ImageInfo verifySignature(String uri, InputStream fis,
             FOUserAgent ua)
         throws IOException {
-        return loadImage(uri, fis, ua);
+        FopImage.ImageInfo info = loadImage(uri, fis, ua);
+        if (info != null) {
+            try {
+                fis.close();
+            } catch (Exception e) {
+            }
+        }
+        return info;
     }
 
     /**
@@ -61,7 +68,7 @@ public class SVGReader implements ImageReader {
      * @param ua   @todo Description of the Parameter
      * @return     @todo Description of the Return Value
      */
-    private FopImage.ImageInfo loadImage(String uri, BufferedInputStream bis,
+    private FopImage.ImageInfo loadImage(String uri, InputStream bis,
             FOUserAgent ua) {
         if (batik) {
             try {
index 0be2c33c49ebf0f2e565c875d008c335970e56e3..c2e0f9877b5fe3b0f6bdbe298ce72d894bbb9411 100644 (file)
@@ -7,7 +7,7 @@
 package org.apache.fop.image.analyser;
 
 // Java
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.IOException;
 
 // FOP
@@ -25,7 +25,7 @@ public class TIFFReader implements ImageReader {
     private static final int TIFF_SIG_LENGTH = 8;
 
     /** @see org.apache.fop.image.analyser.ImageReader */
-    public FopImage.ImageInfo verifySignature(String uri, BufferedInputStream bis,
+    public FopImage.ImageInfo verifySignature(String uri, InputStream bis,
                 FOUserAgent ua) throws IOException {
         byte[] header = getDefaultHeader(bis);
         boolean supported = false;
@@ -51,6 +51,7 @@ public class TIFFReader implements ImageReader {
         if (supported) {
             FopImage.ImageInfo info = getDimension(header);
             info.mimeType = getMimeType();
+            info.inputStream = bis;
             return info;
         } else {
             return null;
@@ -95,7 +96,7 @@ public class TIFFReader implements ImageReader {
         return info;
     }
 
-    private byte[] getDefaultHeader(BufferedInputStream imageStream)
+    private byte[] getDefaultHeader(InputStream imageStream)
         throws IOException {
         byte[] header = new byte[TIFF_SIG_LENGTH];
         try {
index 7399075e3c3b74c2facb300a4857e14b200208a7..6e2365e3c433ac031aab6bb5181120e2a7614dcc 100644 (file)
@@ -7,7 +7,7 @@
 package org.apache.fop.image.analyser;
 
 // Java
-import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.IOException;
 import java.util.Map;
 
@@ -36,10 +36,17 @@ public class XMLReader implements ImageReader {
     }
 
     /** @see org.apache.fop.image.analyser.ImageReader */
-    public FopImage.ImageInfo verifySignature(String uri, BufferedInputStream fis,
+    public FopImage.ImageInfo verifySignature(String uri, InputStream fis,
             FOUserAgent ua)
         throws IOException {
-        return loadImage(uri, fis, ua);
+        FopImage.ImageInfo info = loadImage(uri, fis, ua);
+        if (info != null) {
+            try {
+                fis.close();
+            } catch (Exception e) {
+            }
+        }
+        return info;
     }
 
     /**
@@ -62,7 +69,7 @@ public class XMLReader implements ImageReader {
      * @param ua   The user agent
      * @return     An ImageInfo object describing the image
      */
-    protected FopImage.ImageInfo loadImage(String uri, BufferedInputStream bis,
+    protected FopImage.ImageInfo loadImage(String uri, InputStream bis,
             FOUserAgent ua) {
         return createDocument(bis, ua);
     }
@@ -74,7 +81,7 @@ public class XMLReader implements ImageReader {
      * @param ua  The user agent
      * @return    An ImageInfo object describing the image
      */
-    public FopImage.ImageInfo createDocument(BufferedInputStream is, FOUserAgent ua) {
+    public FopImage.ImageInfo createDocument(InputStream is, FOUserAgent ua) {
         Document doc = null;
         FopImage.ImageInfo info = new FopImage.ImageInfo();
         info.mimeType = getMimeType();
index 194868f5a807fd41b91e977311735c719af155dc..d4b51156f064daf46c2f8fb7451f4798f126f997 100644 (file)
@@ -294,7 +294,7 @@ public class PDFGraphics2D extends AbstractGraphics2D {
      * @param height the height to draw the image
      */
     public void addJpegImage(JpegImage jpeg, float x, float y, float width, float height) {
-        FopPDFImage fopimage = new FopPDFImage(jpeg, jpeg.getURL());
+        FopPDFImage fopimage = new FopPDFImage(jpeg, "");
         int xObjectNum = this.pdfDoc.addImage(resourceContext, fopimage).getXNumber();
 
         AffineTransform at = getTransform();