You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by vg...@apache.org on 2007/03/15 04:16:21 UTC
svn commit: r518453 -
/xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/DOMCompressor.java
Author: vgritsenko
Date: Wed Mar 14 20:16:21 2007
New Revision: 518453
URL: http://svn.apache.org/viewvc?view=rev&rev=518453
Log:
fix bug in writeNode (from bug #41808).
rename Compress to compress.
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/DOMCompressor.java
Modified: xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/DOMCompressor.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/DOMCompressor.java?view=diff&rev=518453&r1=518452&r2=518453
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/DOMCompressor.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/DOMCompressor.java Wed Mar 14 20:16:21 2007
@@ -21,17 +21,16 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.xindice.util.XindiceException;
import org.apache.xindice.xml.Signatures;
import org.apache.xindice.xml.SymbolTable;
import org.apache.xindice.xml.XMLCompressedOutput;
import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
-import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -58,9 +57,19 @@
* @throws IOException If the write failed
*/
public void writeNode(Node node) throws IOException {
+ // Check if it's node of ours
if (node instanceof NodeImpl) {
NodeImpl impl = (NodeImpl) node;
- if (!impl.dirty && impl.data != null) {
+ Document doc = node.getOwnerDocument();
+
+ SymbolTable docSymbols = null;
+ if (doc instanceof DocumentImpl) {
+ docSymbols = ((DocumentImpl) doc).getSymbols();
+ }
+
+ // If document is compressed with exact same symbol table
+ // and is not dirty, use its compressed bytes.
+ if (!impl.dirty && impl.data != null && docSymbols == st) {
write(impl.data, impl.pos, impl.len);
flush();
return;
@@ -79,7 +88,7 @@
} else {
symbolID = st.getSymbol(node.getNodeName(), true);
}
-
+
byte signature = (byte) (Signatures.Elem << 0x6);
int attrLen = node.getAttributes().getLength();
int attrSize = getSizeType(attrLen);
@@ -265,8 +274,7 @@
*/
private byte[] buildChildren(Node node) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
- BufferedOutputStream buf = new BufferedOutputStream(bos, 4096);
- DOMCompressor out = new DOMCompressor(buf, st);
+ DOMCompressor out = new DOMCompressor(bos, st);
if (node.getNodeType() == Node.ELEMENT_NODE) {
NamedNodeMap attrs = node.getAttributes();
int len = attrs.getLength();
@@ -281,7 +289,6 @@
for (int i = 0; i < len; i++) {
out.writeNode(children.item(i));
}
- out.flush();
return bos.toByteArray();
}
@@ -289,24 +296,33 @@
* Compress is a convenience method that compresses a Node into a byte
* array with a single call.
*
+ * @deprecated renamed to {@link #compress(Node, SymbolTable)}.
+ * @param node The Node to compress
+ * @param symbols The Symbol Table to use
+ * @return The resulting byte array
+ */
+ public static byte[] Compress(Node node, SymbolTable symbols) {
+ return compress(node, symbols);
+ }
+
+ /**
+ * Compress is a convenience method that compresses a Node into a byte
+ * array with a single call.
+ *
* @param node The Node to compress
* @param symbols The Symbol Table to use
* @return The resulting byte array
- * @throws XindiceException if an Exception occurs
*/
- public static byte[] Compress(Node node, SymbolTable symbols) throws XindiceException {
- // FIXME ByteArrayOutputStream throws no IOExceptions, so throws clause on method isn't necessary.
+ public static byte[] compress(Node node, SymbolTable symbols) {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DOMCompressor xco = new DOMCompressor(bos, symbols);
+ node.normalize();
try {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- BufferedOutputStream buf = new BufferedOutputStream(bos, 4096);
- DOMCompressor xco = new DOMCompressor(buf, symbols);
- node.normalize();
xco.writeNode(node);
- xco.flush();
- return bos.toByteArray();
- } catch (Exception e) {
- throw new XindiceException("XML Compression Error", e);
+ } catch (IOException e) {
+ // ByteArrayOutputStream does not throw IOException, ignore
}
+ return bos.toByteArray();
}
}