FOP-2693: PDF plugin document cache may return closed document

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1784729 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/ImagePDF.java b/src/java/org/apache/fop/render/pdf/pdfbox/ImagePDF.java
index 9aba33a..0686b72 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/ImagePDF.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/ImagePDF.java
@@ -66,18 +66,15 @@
 
     /** {@inheritDoc} */
     public boolean isCacheable() {
-        return true;
+        return false;
     }
 
-    /** {@inheritDoc} */
-    @Override
-    protected void finalize() throws Throwable {
+    public void close() {
         try {
-            this.pddoc.close();
-        } catch (IOException ioe) {
-            //ignore
+            pddoc.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
         }
-        super.finalize();
     }
 
 }
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxImageHandler.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxImageHandler.java
index aa16a73..3e20aa7 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxImageHandler.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxImageHandler.java
@@ -79,6 +79,7 @@
                 pageAdjust.translate(x * (1 / pageAdjust.getScaleX()), -y * (1 / -pageAdjust.getScaleY()));
             }
             generator.placeImage(pageAdjust, stream);
+            pdfImage.close();
         } catch (Throwable t) {
             throw new RuntimeException(
                     "Error on PDF page: " + pdfImage.getInfo().getOriginalURI() + " " + t.getMessage(), t);
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PreloaderPDF.java b/src/java/org/apache/fop/render/pdf/pdfbox/PreloaderPDF.java
index 4724098..fc1b99d 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PreloaderPDF.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PreloaderPDF.java
@@ -23,10 +23,6 @@
 import java.io.InputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.util.Collections;
-import java.util.Locale;
-import java.util.Map;
-import java.util.WeakHashMap;
 
 import javax.imageio.stream.ImageInputStream;
 import javax.xml.transform.Source;
@@ -54,15 +50,6 @@
     /** PDF header text */
     private static final String PDF_HEADER = "%PDF-";
 
-    /** static PDDocument cache for faster multi-page processing */
-    private static final Cache.Type CACHE_TYPE = Cache.Type.valueOf(
-            System.getProperty("fop.pdfbox.preloader-cache", Cache.Type.WEAK.name()).toUpperCase(Locale.ENGLISH));
-
-    private static Map<Object, Cache<URI, PDDocument>> documentCacheMap
-            = Collections.synchronizedMap(new WeakHashMap<Object, Cache<URI, PDDocument>>());
-    //the cache here can cause problems because PDDocument that have been closed might still
-    //be accessed. Example: java.io.IOException: The handle is invalid
-
     /** {@inheritDoc} */
     public ImageInfo preloadImage(String uri, Source src, ImageContext context)
                 throws IOException, ImageException {
@@ -162,7 +149,7 @@
     private PDDocument getDocument(Object context, URI uri, Source src)
             throws IOException {
         try {
-            return getDocumentCache(context).getValue(uri, createDocumentMaker(src, uri));
+            return createDocumentMaker(src, uri).make();
         } catch (IOException ioe) {
             throw ioe;
         } catch (Exception e) {
@@ -171,16 +158,6 @@
         }
     }
 
-    private Cache<URI, PDDocument> getDocumentCache(Object context) {
-        Cache<URI, PDDocument> documentCache = documentCacheMap.get(context);
-
-        if (documentCache == null) {
-            documentCache = Cache.createCache(CACHE_TYPE);
-            documentCacheMap.put(context, documentCache);
-        }
-        return documentCache;
-    }
-
     private ValueMaker<PDDocument> createDocumentMaker(final Source src, final URI docURI) {
         return new DocumentMaker(src, docURI);
     }
diff --git a/test/java/org/apache/fop/render/pdf/PreloaderPDFTestCase.java b/test/java/org/apache/fop/render/pdf/PreloaderPDFTestCase.java
index 636c869..2a1e34d 100644
--- a/test/java/org/apache/fop/render/pdf/PreloaderPDFTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PreloaderPDFTestCase.java
@@ -29,12 +29,15 @@
 
 import org.junit.Test;
 
+import org.apache.pdfbox.pdmodel.PDDocument;
+
 import org.apache.xmlgraphics.image.loader.ImageException;
 import org.apache.xmlgraphics.image.loader.ImageInfo;
 import org.apache.xmlgraphics.image.loader.ImageSource;
 import org.apache.xmlgraphics.image.loader.impl.DefaultImageContext;
 import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
 
+import org.apache.fop.render.pdf.pdfbox.ImagePDF;
 import org.apache.fop.render.pdf.pdfbox.PreloaderImageRawData;
 import org.apache.fop.render.pdf.pdfbox.PreloaderPDF;
 
@@ -63,4 +66,21 @@
         ImageInfo imageInfo = new PreloaderPDF().preloadImage("", imageSource, new DefaultImageContext());
         Assert.assertEquals(imageInfo.getMimeType(), "application/pdf");
     }
+
+    @Test
+    public void testPreloaderPDFCache() throws IOException, ImageException {
+        DefaultImageContext context = new DefaultImageContext();
+        readPDF(context);
+        readPDF(context);
+    }
+
+    private void readPDF(DefaultImageContext context) throws IOException, ImageException {
+        ImageSource imageSource = new ImageSource(
+                ImageIO.createImageInputStream(new File(PDFBoxAdapterTestCase.ROTATE)), "", true);
+        ImageInfo imageInfo = new PreloaderPDF().preloadImage("", imageSource, context);
+        ImagePDF img = (ImagePDF) imageInfo.getOriginalImage();
+        PDDocument doc = img.getPDDocument();
+        doc.save(new ByteArrayOutputStream());
+        img.close();
+    }
 }