Author: vgritsenko Date: Thu Mar 15 13:53:00 2007 New Revision: 518751 URL: http://svn.apache.org/viewvc?view=rev&rev=518751 Log: refactor signatures to reduce bit arithmetics
Modified: xml/xindice/trunk/java/src/org/apache/xindice/xml/Signatures.java xml/xindice/trunk/java/src/org/apache/xindice/xml/TextWriter.java xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedInput.java xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedOutput.java xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/DOMCompressor.java xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/EntityReferenceImpl.java xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/dom/NodeTest.java Modified: xml/xindice/trunk/java/src/org/apache/xindice/xml/Signatures.java URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/xml/Signatures.java?view=diff&rev=518751&r1=518750&r2=518751 ============================================================================== --- xml/xindice/trunk/java/src/org/apache/xindice/xml/Signatures.java (original) +++ xml/xindice/trunk/java/src/org/apache/xindice/xml/Signatures.java Thu Mar 15 13:53:00 2007 @@ -26,41 +26,49 @@ * @version $Revision$, $Date$ */ public interface Signatures { - static final int Unknown = -1; - static final int False = 0x0; - static final int True = 0x1; + /* + * Signature byte consists of following fields: + * Node type 0xC0 + * Text node type 0x20 (in text node) + * Element bits 0x30 (in elem node) + * Declaration type 0x3C (in decl node) + */ + + byte NODE_TEXT = 0x00; + byte NODE_ELEM = 0x40; + byte NODE_PROC = (byte) 0x80; + byte NODE_DECL = (byte) 0xC0; + + byte TEXT_TEXT = 0x00; + byte TEXT_ENTITY = 0x20; + + byte ELEM_ATTRS = 0x20; + byte ELEM_CHILDREN = 0x10; + + byte DECL_ELEMENT = 0x04; + byte DECL_ATTLIST = 0x08; + byte DECL_CDATA = 0x10; + byte DECL_REPLACED = 0x14; + byte DECL_ENTITY = 0x18; + byte DECL_COMMENT = 0x20; + byte DECL_DOCTYPE = 0x28; + byte DECL_NOTATION = 0x30; + byte DECL_IGNORE = 0x38; + byte DECL_INCLUDE = 0x3C; + + byte SIZE_NONE = 0x00; + byte SIZE_INT = 0x01; + byte SIZE_SHORT = 0x02; + byte SIZE_BYTE = 0x03; + + int ENT_DEFINED = 0x01; // Symbol_ID attached + int ENT_AMP = 0x02; // & + int ENT_LT = 0x03; // < + int ENT_GT = 0x04; // > + int ENT_QUOT = 0x05; // " + int ENT_APOS = 0x06; // ' + int ENT_UNICODE = 0x1F; // &#x...; - static final int NoContent = 0x0; - static final int IntContent = 0x1; - static final int ShortContent = 0x2; - static final int ByteContent = 0x3; - - static final int Char = 0x0; - static final int Elem = 0x1; - static final int Proc = 0x2; - static final int Decl = 0x3; - - static final int CharText = 0x0; - static final int CharEntity = 0x1; - - static final int EntUnknown = 0x0; // This should not happen - static final int EntDefined = 0x1; // Symbol_ID attached - static final int EntAmp = 0x2; // & - static final int EntLt = 0x3; // < - static final int EntGt = 0x4; // > - static final int EntQuot = 0x5; // " - static final int EntApos = 0x6; // ' - static final int EntUnicode = 0x1F; // &#x...; - - static final int DeclElement = 0x1; - static final int DeclAttList = 0x2; - static final int DeclCData = 0x4; - static final int DeclReplaced = 0x5; - static final int DeclEntity = 0x6; - static final int DeclComment = 0x8; - static final int DeclDocType = 0xA; - static final int DeclNotation = 0xC; - static final int DeclIgnore = 0xE; - static final int DeclInclude = 0xF; + int Unknown = -1; } Modified: xml/xindice/trunk/java/src/org/apache/xindice/xml/TextWriter.java URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/xml/TextWriter.java?view=diff&rev=518751&r1=518750&r2=518751 ============================================================================== --- xml/xindice/trunk/java/src/org/apache/xindice/xml/TextWriter.java (original) +++ xml/xindice/trunk/java/src/org/apache/xindice/xml/TextWriter.java Thu Mar 15 13:53:00 2007 @@ -97,6 +97,7 @@ break; case Node.DOCUMENT_TYPE_NODE: + // TODO Implement if (log.isErrorEnabled()) { log.error("can't serialize doctype yet"); } @@ -143,18 +144,21 @@ break; case Node.ENTITY_REFERENCE_NODE: + // TODO Implement if (log.isErrorEnabled()) { log.error("can't serialize reference ref yet"); } break; case Node.ENTITY_NODE: + // TODO Implement if (log.isErrorEnabled()) { log.error("can't serialize entity yet"); } break; case Node.NOTATION_NODE: + // TODO Implement if (log.isErrorEnabled()) { log.error("can't serialize notation yet"); } Modified: xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedInput.java URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedInput.java?view=diff&rev=518751&r1=518750&r2=518751 ============================================================================== --- xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedInput.java (original) +++ xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedInput.java Thu Mar 15 13:53:00 2007 @@ -73,46 +73,45 @@ * @return The DOM Node type */ public final short getNodeType() { - byte type = (byte) ((signature & 0xC0) >>> 0x6); + byte type = (byte) (signature & 0xC0); switch (type) { - case Signatures.Char: - type = (byte) ((signature & 0x20) >>> 0x5); - if (type == Signatures.CharText) { + case Signatures.NODE_TEXT: + type = (byte) (signature & 0x20); + if (type == Signatures.TEXT_TEXT) { return Node.TEXT_NODE; } else { return Node.ENTITY_REFERENCE_NODE; } - case Signatures.Elem: + case Signatures.NODE_ELEM: return Node.ELEMENT_NODE; - case Signatures.Proc: + case Signatures.NODE_PROC: return Node.PROCESSING_INSTRUCTION_NODE; - case Signatures.Decl: - type = (byte) ((signature & 0x3C) >>> 0x2); - switch (type) { + case Signatures.NODE_DECL: + switch ((byte) (signature & 0x3C)) { - case Signatures.DeclCData: + case Signatures.DECL_CDATA: return Node.CDATA_SECTION_NODE; - case Signatures.DeclEntity: + case Signatures.DECL_ENTITY: return Node.ENTITY_NODE; - case Signatures.DeclComment: + case Signatures.DECL_COMMENT: return Node.COMMENT_NODE; - case Signatures.DeclDocType: + case Signatures.DECL_DOCTYPE: return Node.DOCUMENT_TYPE_NODE; - case Signatures.DeclNotation: + case Signatures.DECL_NOTATION: return Node.NOTATION_NODE; default: return Signatures.Unknown; - } + default: if (log.isWarnEnabled()) { log.warn("invalid signature : " + type); @@ -132,6 +131,7 @@ */ public final int readContentSize() throws IOException { int sizeType = 0; + short nodeType = getNodeType(); switch (nodeType) { @@ -143,12 +143,13 @@ case Node.PROCESSING_INSTRUCTION_NODE: case Node.COMMENT_NODE: case Node.CDATA_SECTION_NODE: - sizeType = Signatures.IntContent; + sizeType = Signatures.SIZE_INT; break; case Node.NOTATION_NODE: sizeType = (byte) (signature & 0x03); break; + default: if (log.isWarnEnabled()) { log.warn("invalid node type : " + nodeType); @@ -157,16 +158,16 @@ switch (sizeType) { - case Signatures.ByteContent: + case Signatures.SIZE_BYTE: return readByte(); - case Signatures.ShortContent: + case Signatures.SIZE_SHORT: return readShort(); - case Signatures.IntContent: + case Signatures.SIZE_INT: return readInt(); - case Signatures.NoContent: + case Signatures.SIZE_NONE: // Do Nothing break; @@ -175,6 +176,7 @@ log.warn("invalid size : " + sizeType); } } + return 0; } @@ -193,16 +195,16 @@ switch (countType) { - case Signatures.ByteContent: + case Signatures.SIZE_BYTE: return readByte(); - case Signatures.ShortContent: + case Signatures.SIZE_SHORT: return readShort(); - case Signatures.IntContent: + case Signatures.SIZE_INT: return readInt(); - case Signatures.NoContent: + case Signatures.SIZE_NONE: // Do Nothing break; @@ -211,6 +213,7 @@ log.warn("invalid signature type : " + countType); } } + return 0; } } Modified: xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedOutput.java URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedOutput.java?view=diff&rev=518751&r1=518750&r2=518751 ============================================================================== --- xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedOutput.java (original) +++ xml/xindice/trunk/java/src/org/apache/xindice/xml/XMLCompressedOutput.java Thu Mar 15 13:53:00 2007 @@ -50,13 +50,13 @@ */ protected final byte getSizeType(long length) { if (length > Short.MAX_VALUE) { - return Signatures.IntContent; + return Signatures.SIZE_INT; } else if (length > Byte.MAX_VALUE) { - return Signatures.ShortContent; + return Signatures.SIZE_SHORT; } else if (length > 0) { - return Signatures.ByteContent; + return Signatures.SIZE_BYTE; } else { - return Signatures.NoContent; + return Signatures.SIZE_NONE; } } @@ -71,11 +71,11 @@ */ protected final int getSizeSize(int sizeType) { switch (sizeType) { - case Signatures.IntContent: + case Signatures.SIZE_INT: return 4; - case Signatures.ShortContent: + case Signatures.SIZE_SHORT: return 2; - case Signatures.ByteContent: + case Signatures.SIZE_BYTE: return 1; default: return 0; @@ -83,6 +83,21 @@ } /** + * Writes the size to the output stream. Size type is determined + * based on the passed size value. + * + * + * @see org.apache.xindice.xml.Signatures + * + * @param size The size + * @return The size in bytes written + * @throws IOException If the write failed + */ + protected final int writeSize(int size) throws IOException { + return writeSize(getSizeType(size), size); + } + + /** * writeSize writes the size to the output stream based on the * specified sizeType. * @@ -96,15 +111,15 @@ protected final int writeSize(int sizeType, int size) throws IOException { switch (sizeType) { - case Signatures.IntContent: + case Signatures.SIZE_INT: writeInt(size); return 4; - case Signatures.ShortContent: + case Signatures.SIZE_SHORT: writeShort((short) size); return 2; - case Signatures.ByteContent: + case Signatures.SIZE_BYTE: writeByte((byte) size); return 1; 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=518751&r1=518750&r2=518751 ============================================================================== --- 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 Thu Mar 15 13:53:00 2007 @@ -89,14 +89,14 @@ symbolID = st.getSymbol(node.getNodeName(), true); } - byte signature = (byte) (Signatures.Elem << 0x6); + byte signature = Signatures.NODE_ELEM; int attrLen = node.getAttributes().getLength(); int attrSize = getSizeType(attrLen); if (attrLen > 0) { - signature |= (byte) (Signatures.True << 0x5); + signature |= Signatures.ELEM_ATTRS; } if (node.hasChildNodes()) { - signature |= (byte) (Signatures.True << 0x4); + signature |= Signatures.ELEM_CHILDREN; } signature |= (byte) (attrSize); byte[] children = buildChildren(node); @@ -134,7 +134,7 @@ byte[] b = node.getNodeValue().getBytes("UTF-8"); int valLen = b.length; int sizeType = getSizeType(valLen + 5); - byte signature = (byte) (Signatures.Char << 0x6); + byte signature = Signatures.NODE_TEXT; signature |= (byte) (sizeType << 0x2); writeByte(signature); valLen += (getSizeSize(sizeType) + 1); @@ -147,9 +147,7 @@ { byte[] b = node.getNodeValue().getBytes("UTF-8"); int valLen = b.length; - byte signature = (byte) (Signatures.Decl << 0x6); - signature |= (byte) (Signatures.DeclCData << 0x2); - writeByte(signature); + writeByte(Signatures.NODE_DECL | Signatures.DECL_CDATA); valLen += 5; writeInt(valLen); write(b); @@ -159,28 +157,28 @@ case Node.ENTITY_REFERENCE_NODE: { String value = node.getNodeName(); - byte signature = (byte) (Signatures.Char << 0x6); - signature |= (byte) (Signatures.CharEntity << 0x4); + byte signature = Signatures.NODE_TEXT | Signatures.TEXT_ENTITY; short symbol = 0; int encoding = 0; if (value.equals("&")) { - signature |= (byte) (Signatures.EntAmp); + signature |= (byte) (Signatures.ENT_AMP); } else if (value.equals("<")) { - signature |= (byte) (Signatures.EntLt); + signature |= (byte) (Signatures.ENT_LT); } else if (value.equals(">")) { - signature |= (byte) (Signatures.EntGt); + signature |= (byte) (Signatures.ENT_GT); } else if (value.equals(""")) { - signature |= (byte) (Signatures.EntQuot); + signature |= (byte) (Signatures.ENT_QUOT); } else if (value.equals("'")) { - signature |= (byte) (Signatures.EntApos); + signature |= (byte) (Signatures.ENT_APOS); } else if (value.startsWith("&#x")) { encoding = 1; - signature |= (byte) (Signatures.EntUnicode); + signature |= (byte) (Signatures.ENT_UNICODE); // Convert the Unicode to a short + // TODO symbol = } else { encoding = 2; symbol = st.getSymbol(value, true); - signature |= (byte) (Signatures.EntDefined); + signature |= (byte) (Signatures.ENT_DEFINED); } writeByte(signature); if (encoding > 0) { @@ -199,8 +197,7 @@ String value = node.getNodeName() + " " + node.getNodeValue(); byte[] b = value.getBytes("UTF-8"); int valLen = b.length; - byte signature = (byte) (Signatures.Proc << 0x6); - writeByte(signature); + writeByte(Signatures.NODE_PROC); valLen += 5; writeInt(valLen); write(b); @@ -211,9 +208,7 @@ { byte[] b = node.getNodeValue().getBytes("UTF-8"); int valLen = b.length; - byte signature = (byte) (Signatures.Decl << 0x6); - signature |= (byte) (Signatures.DeclComment << 0x2); - writeByte(signature); + writeByte(Signatures.NODE_DECL | Signatures.DECL_COMMENT); valLen += 5; writeInt(valLen); write(b); @@ -278,17 +273,18 @@ if (node.getNodeType() == Node.ELEMENT_NODE) { NamedNodeMap attrs = node.getAttributes(); int len = attrs.getLength(); - int sizeType = getSizeType(len); - out.writeSize(sizeType, len); + out.writeSize(len); for (int i = 0; i < len; i++) { out.writeNode(attrs.item(i)); } } + NodeList children = node.getChildNodes(); int len = children.getLength(); for (int i = 0; i < len; i++) { out.writeNode(children.item(i)); } + return bos.toByteArray(); } Modified: xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/EntityReferenceImpl.java URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/EntityReferenceImpl.java?view=diff&rev=518751&r1=518750&r2=518751 ============================================================================== --- xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/EntityReferenceImpl.java (original) +++ xml/xindice/trunk/java/src/org/apache/xindice/xml/dom/EntityReferenceImpl.java Thu Mar 15 13:53:00 2007 @@ -36,7 +36,8 @@ * * @version $Revision$, $Date$ */ -public final class EntityReferenceImpl extends NodeImpl implements EntityReference { +public final class EntityReferenceImpl extends NodeImpl + implements EntityReference { private static final Log log = LogFactory.getLog(EntityReferenceImpl.class); @@ -77,38 +78,34 @@ byte entityType = (byte) (signature & 0x1F); switch (entityType) { - case Signatures.EntUnknown: - nodeName = null; - break; - - case Signatures.EntDefined: + case Signatures.ENT_DEFINED: symbolID = xci.readShort(); nodeName = st.getName(symbolID); break; - case Signatures.EntAmp: + case Signatures.ENT_AMP: nodeName = "&"; break; - case Signatures.EntLt: + case Signatures.ENT_LT: nodeName = "<"; break; - case Signatures.EntGt: + case Signatures.ENT_GT: nodeName = ">"; break; - case Signatures.EntQuot: + case Signatures.ENT_QUOT: nodeName = """; break; - case Signatures.EntApos: + case Signatures.ENT_APOS: nodeName = "'"; break; - case Signatures.EntUnicode: + case Signatures.ENT_UNICODE: + // TODO: Convert symbol to &#...; nodeName = ""; - // TODO: This break; default: Modified: xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/dom/NodeTest.java URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/dom/NodeTest.java?view=diff&rev=518751&r1=518750&r2=518751 ============================================================================== --- xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/dom/NodeTest.java (original) +++ xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/dom/NodeTest.java Thu Mar 15 13:53:00 2007 @@ -47,6 +47,7 @@ "<d attr3='c' attr5='d'/>" + "</name:c>" + "<d>Parent text<e>Child text</e></d>" + + "<!-- comment -->" + "<x/>" + "<cmp>" + "<b/>" + @@ -95,6 +96,12 @@ public void testCDATA() { Node n = root.getFirstChild().getFirstChild().getNextSibling(); assertEquals("&&& CDATA Section! &&&", n.getTextContent()); + } + + public void testComment() { + Node n = ((Element) root).getElementsByTagName("x").item(0).getPreviousSibling(); + assertEquals(Node.COMMENT_NODE, n.getNodeType()); + assertEquals(" comment ", n.getTextContent()); } public void testNodeEquality() throws Exception {