deweese 01/11/12 07:37:22
Modified: sources/org/apache/batik/dom/traversal DOMTreeWalker.java
sources/org/apache/batik/transcoder/image
JPEGTranscoder.java
Log:
1) Rewrote nextSibling/prevSibling in tree walker to use a loop
rather than recursion, otherwise on large documents the stack
get's blown out when looking for stylesheet processing instructions
(Does this really require a full search of the DOM tree????)
2) Implemented an improved version of the Patch in PR 3912. Thanks to
Michael Hartle <[EMAIL PROTECTED]> for the bug report and
proposed patch.
PR: 3912
Obtained from: Michael Hartle <[EMAIL PROTECTED]>
Submitted by: Michael Hartle <[EMAIL PROTECTED]>
Reviewed by: Thomas DeWeese <[EMAIL PROTECTED]>
Revision Changes Path
1.3 +52 -43
xml-batik/sources/org/apache/batik/dom/traversal/DOMTreeWalker.java
Index: DOMTreeWalker.java
===================================================================
RCS file:
/home/cvs/xml-batik/sources/org/apache/batik/dom/traversal/DOMTreeWalker.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DOMTreeWalker.java 2001/10/15 11:32:56 1.2
+++ DOMTreeWalker.java 2001/11/12 15:37:22 1.3
@@ -20,7 +20,7 @@
* interface.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
- * @version $Id: DOMTreeWalker.java,v 1.2 2001/10/15 11:32:56 hillion Exp $
+ * @version $Id: DOMTreeWalker.java,v 1.3 2001/11/12 15:37:22 deweese Exp $
*/
public class DOMTreeWalker implements TreeWalker {
@@ -291,31 +291,35 @@
* Returns the previous sibling of the given node.
*/
protected Node previousSibling(Node n, Node root) {
- if (n == root) {
- return null;
- }
- Node result = n.getPreviousSibling();
- if (result == null) {
- result = n.getParentNode();
- if (result == null || result == root) {
+ while (true) {
+ if (n == root) {
return null;
}
- if (acceptNode(result) == NodeFilter.FILTER_SKIP) {
- return previousSibling(result, root);
+ Node result = n.getPreviousSibling();
+ if (result == null) {
+ result = n.getParentNode();
+ if (result == null || result == root) {
+ return null;
+ }
+ if (acceptNode(result) == NodeFilter.FILTER_SKIP) {
+ n = result;
+ continue;
+ }
+ return null;
}
- return null;
- }
- switch (acceptNode(result)) {
- case NodeFilter.FILTER_ACCEPT:
- return result;
- case NodeFilter.FILTER_SKIP:
- Node t = lastChild(result);
- if (t != null) {
- return t;
+ switch (acceptNode(result)) {
+ case NodeFilter.FILTER_ACCEPT:
+ return result;
+ case NodeFilter.FILTER_SKIP:
+ Node t = lastChild(result);
+ if (t != null) {
+ return t;
+ }
+ // Fall through
+ default: // NodeFilter.FILTER_REJECT
+ n = result;
+ continue;
}
- // Fall through
- default: // NodeFilter.FILTER_REJECT
- return previousSibling(result, root);
}
}
@@ -323,31 +327,36 @@
* Returns the next sibling of the given node.
*/
protected Node nextSibling(Node n, Node root) {
- if (n == root) {
- return null;
- }
- Node result = n.getNextSibling();
- if (result == null) {
- result = n.getParentNode();
- if (result == null || result == root) {
+ while (true) {
+ if (n == root) {
return null;
}
- if (acceptNode(result) == NodeFilter.FILTER_SKIP) {
- return nextSibling(result, root);
+ Node result = n.getNextSibling();
+ if (result == null) {
+ result = n.getParentNode();
+ if (result == null || result == root) {
+ return null;
+ }
+ if (acceptNode(result) == NodeFilter.FILTER_SKIP) {
+ n = result;
+ continue;
+ }
+ return null;
}
- return null;
- }
- switch (acceptNode(result)) {
- case NodeFilter.FILTER_ACCEPT:
- return result;
- case NodeFilter.FILTER_SKIP:
- Node t = firstChild(result);
- if (t != null) {
- return t;
+
+ switch (acceptNode(result)) {
+ case NodeFilter.FILTER_ACCEPT:
+ return result;
+ case NodeFilter.FILTER_SKIP:
+ Node t = firstChild(result);
+ if (t != null) {
+ return t;
+ }
+ // Fall through
+ default: // NodeFilter.FILTER_REJECT
+ n = result;
+ continue;
}
- // Fall through
- default: // NodeFilter.FILTER_REJECT
- return nextSibling(result, root);
}
}
1.5 +69 -1
xml-batik/sources/org/apache/batik/transcoder/image/JPEGTranscoder.java
Index: JPEGTranscoder.java
===================================================================
RCS file:
/home/cvs/xml-batik/sources/org/apache/batik/transcoder/image/JPEGTranscoder.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- JPEGTranscoder.java 2001/03/28 06:51:24 1.4
+++ JPEGTranscoder.java 2001/11/12 15:37:22 1.5
@@ -11,10 +11,12 @@
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
+
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
+
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.TranscodingHints;
@@ -24,7 +26,7 @@
* This class is an <tt>ImageTranscoder</tt> that produces a JPEG image.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a>
- * @version $Id: JPEGTranscoder.java,v 1.4 2001/03/28 06:51:24 tkormann Exp $
+ * @version $Id: JPEGTranscoder.java,v 1.5 2001/11/12 15:37:22 deweese Exp $
*/
public class JPEGTranscoder extends ImageTranscoder {
@@ -53,6 +55,11 @@
public void writeImage(BufferedImage img, TranscoderOutput output)
throws TranscoderException {
OutputStream ostream = output.getOutputStream();
+ // The outputstream wrapper protects the JPEG encoder from
+ // exceptions due to stream closings. If it gets an exception
+ // it nulls out the stream and just ignores any future calls.
+ ostream = new OutputStreamWrapper(ostream);
+
if (ostream == null) {
throw new TranscoderException(
Messages.formatMessage("jpeg.badoutput", null));
@@ -112,6 +119,67 @@
return (q > 0 && q <= 1f);
} else {
return false;
+ }
+ }
+ }
+
+ /**
+ * This class will never throw an IOException, instead it eats
+ * them and then ignores any future calls to it's interface.
+ */
+ private static class OutputStreamWrapper extends OutputStream {
+ OutputStream os;
+ /**
+ * Constructs a wrapper around <tt>os</tt> that will not throw
+ * IOExceptions.
+ * <@param os>The Stream to wrap.
+ */
+ OutputStreamWrapper(OutputStream os) {
+ this.os = os;
+ }
+
+ public void close() throws IOException {
+ if (os == null) return;
+ try {
+ os.close();
+ } catch (IOException ioe) {
+ os = null;
+ }
+ }
+
+ public void flush() throws IOException {
+ if (os == null) return;
+ try {
+ os.flush();
+ } catch (IOException ioe) {
+ os = null;
+ }
+ }
+
+ public void write(byte[] b) throws IOException {
+ if (os == null) return;
+ try {
+ os.write(b);
+ } catch (IOException ioe) {
+ os = null;
+ }
+ }
+
+ public void write(byte[] b, int off, int len) throws IOException {
+ if (os == null) return;
+ try {
+ os.write(b, off, len);
+ } catch (IOException ioe) {
+ os = null;
+ }
+ }
+
+ public void write(int b) throws IOException {
+ if (os == null) return;
+ try {
+ os.write(b);
+ } catch (IOException ioe) {
+ os = null;
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]