aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/org/apache/fop/image/ImageCache.java9
-rw-r--r--src/java/org/apache/fop/image/ImageFactory.java30
-rw-r--r--test/java/org/apache/fop/URIResolutionTestCase.java41
3 files changed, 73 insertions, 7 deletions
diff --git a/src/java/org/apache/fop/image/ImageCache.java b/src/java/org/apache/fop/image/ImageCache.java
index 02c3a8c13..837462df6 100644
--- a/src/java/org/apache/fop/image/ImageCache.java
+++ b/src/java/org/apache/fop/image/ImageCache.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@ import org.apache.fop.apps.FOUserAgent;
* This interface is used for caching images.
*/
public interface ImageCache {
+
/**
* Get an image from the cache.
*
@@ -60,5 +61,11 @@ public interface ImageCache {
* @param context the user agent context
*/
void removeContext(FOUserAgent context);
+
+ /**
+ * Forces the cache to fully cleared.
+ */
+ void clearAll();
+
}
diff --git a/src/java/org/apache/fop/image/ImageFactory.java b/src/java/org/apache/fop/image/ImageFactory.java
index bf399aa18..f7323a1a1 100644
--- a/src/java/org/apache/fop/image/ImageFactory.java
+++ b/src/java/org/apache/fop/image/ImageFactory.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-/* $Id: ImageFactory.java,v 1.7 2004/05/12 23:19:52 gmazza Exp $ */
+/* $Id$ */
package org.apache.fop.image;
@@ -300,6 +300,17 @@ public final class ImageFactory {
}
return imt.getFirstImplementingClass();
}
+
+ /**
+ * Forces all the image caches to be cleared. This should normally only be used in
+ * testing environments. If you happen to think that you need to call this yourself
+ * in a production environment, please notify the development team so we can look
+ * into the issue. A call like this shouldn't be necessary anymore like it may have
+ * been with FOP 0.20.5.
+ */
+ public void clearCaches() {
+ cache.clearAll();
+ }
}
/**
@@ -315,6 +326,7 @@ class BasicImageCache implements ImageCache {
if (invalid.contains(url)) {
return null;
}
+ //TODO Doesn't seem to be fully implemented. Do we need it at all? Not referenced.
return null;
}
@@ -333,6 +345,12 @@ class BasicImageCache implements ImageCache {
public void removeContext(FOUserAgent context) {
// do nothing
}
+
+ /** @see org.apache.fop.image.ImageCache#clearAll() */
+ public void clearAll() {
+ invalid.clear();
+ }
+
}
/**
@@ -498,6 +516,16 @@ class ContextImageCache implements ImageCache {
}
+ /** @see org.apache.fop.image.ImageCache#clearAll() */
+ public void clearAll() {
+ this.weakStore.clear();
+ this.invalid.clear();
+ //The context-sensitive caches are not cleared so there are no negative side-effects
+ //in a multi-threaded environment. Not that it's a good idea to use this method at
+ //all except in testing environments. If such a calls is necessary in normal environments
+ //we need to check on memory leaks!
+ }
+
}
/**
diff --git a/test/java/org/apache/fop/URIResolutionTestCase.java b/test/java/org/apache/fop/URIResolutionTestCase.java
index b19595aed..e6f45bcef 100644
--- a/test/java/org/apache/fop/URIResolutionTestCase.java
+++ b/test/java/org/apache/fop/URIResolutionTestCase.java
@@ -19,6 +19,7 @@
package org.apache.fop;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.OutputStream;
import javax.xml.transform.Result;
@@ -39,6 +40,7 @@ import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
+import org.apache.fop.image.ImageFactory;
import org.apache.fop.render.xml.XMLRenderer;
import org.apache.xpath.XPathAPI;
import org.apache.xpath.objects.XObject;
@@ -63,11 +65,26 @@ public class URIResolutionTestCase extends AbstractFOPTestCase {
* Test custom URI resolution with a hand-written URIResolver.
* @throws Exception if anything fails
*/
- public void testFO1() throws Exception {
+ public void testFO1a() throws Exception {
+ innerTestFO1(false);
+ }
+
+ /**
+ * Test custom URI resolution with a hand-written URIResolver.
+ * @throws Exception if anything fails
+ */
+ public void testFO1b() throws Exception {
+ innerTestFO1(true);
+ }
+
+ private void innerTestFO1(boolean withStream) throws Exception {
+ //Reset the image caches to force URI resolution!
+ ImageFactory.getInstance().clearCaches();
+
File foFile = new File(getBaseDir(), "test/xml/uri-resolution1.fo");
FOUserAgent ua = new FOUserAgent();
- MyURIResolver resolver = new MyURIResolver();
+ MyURIResolver resolver = new MyURIResolver(withStream);
ua.setURIResolver(resolver);
ua.setBaseURL(foFile.getParentFile().toURL().toString());
@@ -89,12 +106,12 @@ public class URIResolutionTestCase extends AbstractFOPTestCase {
* Test custom URI resolution with a hand-written URIResolver.
* @throws Exception if anything fails
*/
- public void testFO2() throws Exception {
+ public void DISABLEDtestFO2() throws Exception {
//TODO This will only work when we can do URI resolution inside Batik!
File foFile = new File(getBaseDir(), "test/xml/uri-resolution2.fo");
FOUserAgent ua = new FOUserAgent();
- MyURIResolver resolver = new MyURIResolver();
+ MyURIResolver resolver = new MyURIResolver(false);
ua.setURIResolver(resolver);
ua.setBaseURL(foFile.getParentFile().toURL().toString());
@@ -177,9 +194,14 @@ public class URIResolutionTestCase extends AbstractFOPTestCase {
private static final String PREFIX = "funky:";
+ private boolean withStream;
private int successCount = 0;
private int failureCount = 0;
+ public MyURIResolver(boolean withStream) {
+ this.withStream = withStream;
+ }
+
/**
* @see javax.xml.transform.URIResolver#resolve(java.lang.String, java.lang.String)
*/
@@ -188,7 +210,16 @@ public class URIResolutionTestCase extends AbstractFOPTestCase {
String name = href.substring(PREFIX.length());
if ("myimage123".equals(name)) {
File image = new File(getBaseDir(), "test/resources/images/bgimg300dpi.jpg");
- StreamSource src = new StreamSource(image);
+ Source src;
+ if (withStream) {
+ try {
+ src = new StreamSource(new java.io.FileInputStream(image));
+ } catch (FileNotFoundException e) {
+ throw new TransformerException(e.getMessage(), e);
+ }
+ } else {
+ src = new StreamSource(image);
+ }
successCount++;
return src;
} else {