예제 #1
0
  public static StoredNode deserialize(
      byte[] data, int start, int len, DocumentImpl doc, boolean pooled) {
    int pos = start;
    byte idSizeType = (byte) (data[pos] & 0x3);
    boolean hasNamespace = (data[pos] & 0x10) == 0x10;
    int attrType = (data[pos] & 0x4) >> 0x2;
    pos += StoredNode.LENGTH_SIGNATURE_LENGTH;
    int dlnLen = ByteConversion.byteToShort(data, pos);
    pos += NodeId.LENGTH_NODE_ID_UNITS;
    NodeId dln = doc.getBroker().getBrokerPool().getNodeFactory().createFromData(dlnLen, data, pos);
    pos += dln.size();
    short id = (short) Signatures.read(idSizeType, data, pos);
    pos += Signatures.getLength(idSizeType);
    String name = doc.getSymbols().getName(id);
    if (name == null) throw new RuntimeException("no symbol for id " + id);
    short nsId = 0;
    String prefix = null;
    if (hasNamespace) {
      nsId = ByteConversion.byteToShort(data, pos);
      pos += LENGTH_NS_ID;
      int prefixLen = ByteConversion.byteToShort(data, pos);
      pos += LENGTH_PREFIX_LENGTH;
      if (prefixLen > 0) prefix = UTF8.decode(data, pos, prefixLen).toString();
      pos += prefixLen;
    }
    String namespace = nsId == 0 ? "" : doc.getSymbols().getNamespace(nsId);
    XMLString value = UTF8.decode(data, pos, len - (pos - start));

    // OK : we have the necessary material to build the attribute
    AttrImpl attr;
    if (pooled) attr = (AttrImpl) NodePool.getInstance().borrowNode(Node.ATTRIBUTE_NODE);
    //            attr = (AttrImpl)NodeObjectPool.getInstance().borrowNode(AttrImpl.class);
    else attr = new AttrImpl();
    attr.setNodeName(doc.getSymbols().getQName(Node.ATTRIBUTE_NODE, namespace, name, prefix));
    attr.value = value;
    attr.setNodeId(dln);
    if (dln == null) throw new RuntimeException("no node id " + id);
    attr.setType(attrType);
    return attr;
  }