public String getNodeValueString(int nodeIndex, boolean free) {  if (nodeIndex == -1) { return null; }  int chunk = nodeIndex >> CHUNK_SHIFT; int index = nodeIndex & CHUNK_MASK; int valueIndex = free ? clearChunkIndex(fNodeValue, chunk, index) : getChunkIndex(fNodeValue, chunk, index); if (valueIndex == -1) { return null; }  int type  = getChunkIndex(fNodeType, chunk, index); if (type == Node.TEXT_NODE) { int prevSib = getRealPrevSibling(nodeIndex); if (prevSib != -1 && getNodeType(prevSib, false) == Node.TEXT_NODE) { StringBuffer str = new StringBuffer(); str.append(fStringPool.toString(valueIndex)); do { chunk = prevSib >> CHUNK_SHIFT; index = prevSib & CHUNK_MASK; valueIndex = getChunkIndex(fNodeValue, chunk, index);   str.insert(0, fStringPool.toString(valueIndex)); prevSib = getChunkIndex(fNodePrevSib, chunk, index); if (prevSib == -1) { break; } } while (getNodeType(prevSib, false) == Node.TEXT_NODE); return str.toString(); } }  return fStringPool.toString(valueIndex);  }
public String getNodeValueString(int nodeIndex) { return getNodeValueString(nodeIndex, true); }
    public String getNodeValueString(int nodeIndex, boolean free) {        if (nodeIndex == -1) {            return null;        }        int chunk = nodeIndex >> CHUNK_SHIFT;        int index = nodeIndex & CHUNK_MASK;        int valueIndex = free                       ? clearChunkIndex(fNodeValue, chunk, index)                       : getChunkIndex(fNodeValue, chunk, index);        if (valueIndex == -1) {            return null;        }        int type  = getChunkIndex(fNodeType, chunk, index);        if (type == Node.TEXT_NODE) {            int prevSib = getRealPrevSibling(nodeIndex);            if (prevSib != -1 && getNodeType(prevSib, false) == Node.TEXT_NODE) {                StringBuffer str = new StringBuffer();                str.append(fStringPool.toString(valueIndex));                do {                    chunk = prevSib >> CHUNK_SHIFT;                    index = prevSib & CHUNK_MASK;                    valueIndex = getChunkIndex(fNodeValue, chunk, index);                    // NOTE: This has to be done backwards because the                    //       children are placed backwards.                    str.insert(0, fStringPool.toString(valueIndex));                    prevSib = getChunkIndex(fNodePrevSib, chunk, index);                    if (prevSib == -1) {                        break;                    }                } while (getNodeType(prevSib, false) == Node.TEXT_NODE);                return str.toString();            }        }        return fStringPool.toString(valueIndex);    } // getNodeValueString(int,boolean):String