Example usage for org.w3c.dom Node getNamespaceURI

List of usage examples for org.w3c.dom Node getNamespaceURI

Introduction

In this page you can find the example usage for org.w3c.dom Node getNamespaceURI.

Prototype

public String getNamespaceURI();

Source Link

Document

The namespace URI of this node, or null if it is unspecified (see ).

Usage

From source file:org.cruxframework.crux.core.declarativeui.ViewParser.java

/**
 * @param cruxPageBodyElement//ww  w  .  jav a 2  s .c om
 * @param cruxArrayMetaData
 * @throws ViewParserException 
 */
private void generateCruxMetaData(Node cruxPageBodyElement, StringBuilder cruxArrayMetaData)
        throws ViewParserException {
    NodeList childNodes = cruxPageBodyElement.getChildNodes();
    if (childNodes != null) {
        boolean needsComma = false;
        for (int i = 0; i < childNodes.getLength(); i++) {
            Node child = childNodes.item(i);
            String namespaceURI = child.getNamespaceURI();
            String nodeName = child.getLocalName();

            if (namespaceURI != null && namespaceURI.equals(CRUX_CORE_NAMESPACE)
                    && !nodeName.equals(CRUX_CORE_SPLASH_SCREEN)) {
                if (needsComma) {
                    cruxArrayMetaData.append(",");
                }
                if (nodeName.equals(CRUX_CORE_SCREEN)) {
                    generateCruxScreenMetaData((Element) child, cruxArrayMetaData);
                }
                needsComma = true;
            } else if (namespaceURI != null && namespaceURI.startsWith(WIDGETS_NAMESPACE_PREFIX)) {
                if (needsComma) {
                    cruxArrayMetaData.append(",");
                }
                String widgetType = getCurrentWidgetTag();
                updateCurrentWidgetTag((Element) child);
                generateCruxInnerMetaData((Element) child, cruxArrayMetaData);
                setCurrentWidgetTag(widgetType);
                needsComma = true;
            } else {
                StringBuilder childrenMetaData = new StringBuilder();
                generateCruxMetaData(child, childrenMetaData);
                if (childrenMetaData.length() > 0) {
                    if (needsComma) {
                        cruxArrayMetaData.append(",");
                    }
                    cruxArrayMetaData.append(childrenMetaData);
                    needsComma = true;
                }
            }
        }
    }
}

From source file:org.cruxframework.crux.core.declarativeui.ViewParser.java

/**
 * @param cruxPageMetaData/*w  w  w.j av a 2 s  .  c  o m*/
 * @param cruxArrayMetaData
 */
private void generateCruxMetaDataAttributes(Element cruxPageMetaData, StringBuilder cruxArrayMetaData) {
    NamedNodeMap attributes = cruxPageMetaData.getAttributes();
    if (attributes != null) {
        for (int i = 0; i < attributes.getLength(); i++) {
            Node attribute = attributes.item(i);
            String attrName = attribute.getLocalName();
            if (attrName == null) {
                attrName = attribute.getNodeName();
            }
            String attrValue = attribute.getNodeValue();

            String namespaceURI = attribute.getNamespaceURI();
            if (!StringUtils.isEmpty(attrValue)
                    && (namespaceURI == null || !namespaceURI.endsWith("/xmlns/"))) {
                cruxArrayMetaData.append(",");
                cruxArrayMetaData.append("\"" + attrName + "\":");
                cruxArrayMetaData.append("\"" + HTMLUtils.escapeJavascriptString(attrValue, escapeXML) + "\"");
            }
        }
    }
}

From source file:org.cruxframework.crux.core.declarativeui.ViewParser.java

/**
 * @param node//from  w w w. java 2 s  . co  m
 * @return
 */
private String getLibraryName(Node node) {
    String namespaceURI = node.getNamespaceURI();

    if (namespaceURI != null && namespaceURI.startsWith(WIDGETS_NAMESPACE_PREFIX)) {
        return namespaceURI.substring(WIDGETS_NAMESPACE_PREFIX.length());
    }
    return null;
}

From source file:org.cruxframework.crux.core.declarativeui.ViewParser.java

/**
 * Check if the target node is child from a rootDocument element or from a native XHTML element.
 * /*from w  w w .  j  av  a2 s  .  co  m*/
 * @param node
 * @return
 */
private boolean isHTMLChild(Node node) {
    Node parentNode = node.getParentNode();
    String namespaceURI = parentNode.getNamespaceURI();
    if (namespaceURI == null) {
        log.warn("The view [" + this.viewId
                + "] contains elements that is not bound to any namespace. It can cause errors while translating to an HTML page.");
    }
    if (node.getOwnerDocument().getDocumentElement().equals(parentNode)) {
        return true;
    }
    if (namespaceURI != null && namespaceURI.equals(XHTML_NAMESPACE) || isHtmlContainerWidget(parentNode)) {
        return true;
    }
    if (parentNode instanceof Element && namespaceURI != null && namespaceURI.equals(CRUX_CORE_NAMESPACE)
            && parentNode.getLocalName().equals(CRUX_CORE_SCREEN)) {
        return isHTMLChild(parentNode);
    }

    return false;
}

From source file:org.cruxframework.crux.core.declarativeui.ViewParser.java

/**
 * @param cruxPageElement/* w  ww .j  a  v a 2  s. c o m*/
 * @param htmlElement
 */
private void translateDocument(Node cruxPageElement, Node htmlElement, boolean copyHtmlNodes) {
    NodeList childNodes = cruxPageElement.getChildNodes();
    if (childNodes != null) {
        for (int i = 0; i < childNodes.getLength(); i++) {
            Node child = childNodes.item(i);
            String namespaceURI = child.getNamespaceURI();

            if (namespaceURI != null && namespaceURI.equals(CRUX_CORE_NAMESPACE)) {
                translateCruxCoreElements((Element) child, (Element) htmlElement, htmlDocument);
            } else if (namespaceURI != null && namespaceURI.startsWith(WIDGETS_NAMESPACE_PREFIX)) {
                String widgetType = getCurrentWidgetTag();
                updateCurrentWidgetTag((Element) child);
                translateCruxInnerTags((Element) child, (Element) htmlElement, htmlDocument);
                setCurrentWidgetTag(widgetType);
            } else {
                Node htmlChild;
                if (copyHtmlNodes) {
                    htmlChild = htmlDocument.importNode(child, false);
                    htmlElement.appendChild(htmlChild);
                } else {
                    htmlChild = htmlElement;
                }
                translateDocument(child, htmlChild, copyHtmlNodes);
            }
        }
    }
}

From source file:org.docx4j.XmlUtils.java

/**
 * Copy a node from one DOM document to another.  Used
 * to avoid relying on an underlying implementation which might 
 * not support importNode //from www. j  av a 2 s .  c  o m
 * (eg Xalan's org.apache.xml.dtm.ref.DTMNodeProxy).
 * 
 * WARNING: doesn't fully support namespaces!
 * 
 * @param sourceNode
 * @param destParent
 */
public static void treeCopy(Node sourceNode, Node destParent) {

    // http://osdir.com/ml/text.xml.xerces-j.devel/2004-04/msg00066.html
    // suggests the problem has been fixed?

    // source node maybe org.apache.xml.dtm.ref.DTMNodeProxy
    // (if its xslt output we are copying)
    // or com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl
    // (if its marshalled JAXB)

    log.debug("node type" + sourceNode.getNodeType());

    switch (sourceNode.getNodeType()) {

    case Node.DOCUMENT_NODE: // type 9
    case Node.DOCUMENT_FRAGMENT_NODE: // type 11

        //              log.debug("DOCUMENT:" + w3CDomNodeToString(sourceNode) );
        //              if (sourceNode.getChildNodes().getLength()==0) {
        //                 log.debug("..no children!");
        //              }

        // recurse on each child
        NodeList nodes = sourceNode.getChildNodes();
        if (nodes != null) {
            for (int i = 0; i < nodes.getLength(); i++) {
                log.debug("child " + i + "of DOCUMENT_NODE");
                //treeCopy((DTMNodeProxy)nodes.item(i), destParent);
                treeCopy((Node) nodes.item(i), destParent);
            }
        }
        break;
    case Node.ELEMENT_NODE:

        // Copy of the node itself
        log.debug("copying: " + sourceNode.getNodeName());
        Node newChild;
        if (destParent instanceof Document) {
            newChild = ((Document) destParent).createElementNS(sourceNode.getNamespaceURI(),
                    sourceNode.getLocalName());
        } else if (sourceNode.getNamespaceURI() != null) {
            newChild = destParent.getOwnerDocument().createElementNS(sourceNode.getNamespaceURI(),
                    sourceNode.getLocalName());
        } else {
            newChild = destParent.getOwnerDocument().createElement(sourceNode.getNodeName());
        }
        destParent.appendChild(newChild);

        // .. its attributes
        NamedNodeMap atts = sourceNode.getAttributes();
        for (int i = 0; i < atts.getLength(); i++) {

            Attr attr = (Attr) atts.item(i);

            //                  log.debug("attr.getNodeName(): " + attr.getNodeName());
            //                  log.debug("attr.getNamespaceURI(): " + attr.getNamespaceURI());
            //                  log.debug("attr.getLocalName(): " + attr.getLocalName());
            //                  log.debug("attr.getPrefix(): " + attr.getPrefix());

            if (attr.getNodeName().startsWith("xmlns:")) {
                /* A document created from a dom4j document using dom4j 1.6.1's io.domWriter
                 does this ?!
                 attr.getNodeName(): xmlns:w 
                 attr.getNamespaceURI(): null
                 attr.getLocalName(): null
                 attr.getPrefix(): null
                         
                 unless i'm doing something wrong, this is another reason to
                 remove use of dom4j from docx4j
                */
                ;
                // this is a namespace declaration. not our problem
            } else if (attr.getNamespaceURI() == null) {
                //log.debug("attr.getLocalName(): " + attr.getLocalName() + "=" + attr.getValue());
                ((org.w3c.dom.Element) newChild).setAttribute(attr.getName(), attr.getValue());
            } else if (attr.getNamespaceURI().equals("http://www.w3.org/2000/xmlns/")) {
                ; // this is a namespace declaration. not our problem
            } else if (attr.getNodeName() != null) {
                // && attr.getNodeName().equals("xml:space")) {
                // restrict this fix to xml:space only, if necessary

                // Necessary when invoked from BindingTraverserXSLT,
                // com.sun.org.apache.xerces.internal.dom.AttrNSImpl
                // otherwise it was becoming w:space="preserve"!

                /* eg xml:space
                 * 
                   attr.getNodeName(): xml:space
                   attr.getNamespaceURI(): http://www.w3.org/XML/1998/namespace
                   attr.getLocalName(): space
                   attr.getPrefix(): xml
                 */

                ((org.w3c.dom.Element) newChild).setAttributeNS(attr.getNamespaceURI(), attr.getNodeName(),
                        attr.getValue());
            } else {
                ((org.w3c.dom.Element) newChild).setAttributeNS(attr.getNamespaceURI(), attr.getLocalName(),
                        attr.getValue());
            }
        }

        // recurse on each child
        NodeList children = sourceNode.getChildNodes();
        if (children != null) {
            for (int i = 0; i < children.getLength(); i++) {
                //treeCopy( (DTMNodeProxy)children.item(i), newChild);
                treeCopy((Node) children.item(i), newChild);
            }
        }

        break;

    case Node.TEXT_NODE:

        // Where destParent is com.sun.org.apache.xerces.internal.dom.DocumentImpl,
        // destParent.getOwnerDocument() returns null.
        // #document ; com.sun.org.apache.xerces.internal.dom.DocumentImpl

        //               System.out.println(sourceNode.getNodeValue());

        //System.out.println(destParent.getNodeName() + " ; " + destParent.getClass().getName() );
        if (destParent.getOwnerDocument() == null && destParent.getNodeName().equals("#document")) {
            Node textNode = ((Document) destParent).createTextNode(sourceNode.getNodeValue());
            destParent.appendChild(textNode);
        } else {
            Node textNode = destParent.getOwnerDocument().createTextNode(sourceNode.getNodeValue());
            // Warning: If you attempt to write a single "&" character, it will be converted to &amp; 
            // even if it doesn't look like that with getNodeValue() or getTextContent()!
            // So avoid any tricks with entities! See notes in docx2xhtmlNG2.xslt
            Node appended = destParent.appendChild(textNode);

        }
        break;

    //                case Node.CDATA_SECTION_NODE:
    //                    writer.write("<![CDATA[" +
    //                                 node.getNodeValue() + "]]>");
    //                    break;
    //
    //                case Node.COMMENT_NODE:
    //                    writer.write(indentLevel + "<!-- " +
    //                                 node.getNodeValue() + " -->");
    //                    writer.write(lineSeparator);
    //                    break;
    //
    //                case Node.PROCESSING_INSTRUCTION_NODE:
    //                    writer.write("<?" + node.getNodeName() +
    //                                 " " + node.getNodeValue() +
    //                                 "?>");
    //                    writer.write(lineSeparator);
    //                    break;
    //
    //                case Node.ENTITY_REFERENCE_NODE:
    //                    writer.write("&" + node.getNodeName() + ";");
    //                    break;
    //
    //                case Node.DOCUMENT_TYPE_NODE:
    //                    DocumentType docType = (DocumentType)node;
    //                    writer.write("<!DOCTYPE " + docType.getName());
    //                    if (docType.getPublicId() != null)  {
    //                        System.out.print(" PUBLIC \"" +
    //                            docType.getPublicId() + "\" ");
    //                    } else {
    //                        writer.write(" SYSTEM ");
    //                    }
    //                    writer.write("\"" + docType.getSystemId() + "\">");
    //                    writer.write(lineSeparator);
    //                    break;
    }
}

From source file:org.eclipse.swordfish.internal.core.integration.nmr.SwordfishExchangeListener.java

@SuppressWarnings("unchecked")
private void processOutgoingResponseHeaders(Exchange exchange) {
    Message inMessage = exchange.getIn(false);
    Message outMessage = exchange.getOut(false);

    if (inMessage == null || outMessage == null) {
        LOG.debug("Skip processing of SOAP headers for outgoing response.");
        return;//from w  w  w  .j  a  va2  s.  com
    }

    Map<QName, DocumentFragment> outHeaders = (Map<QName, DocumentFragment>) outMessage
            .getHeader(JbiConstants.SOAP_HEADERS);
    if (outHeaders == null) {
        outHeaders = new HashMap<QName, DocumentFragment>();
    }

    Map<QName, DocumentFragment> inHeaders = (Map<QName, DocumentFragment>) inMessage
            .getHeader(JbiConstants.SOAP_HEADERS);
    if (inHeaders != null && inHeaders.containsKey(JbiConstants.WSA_REPLY_TO_QNAME)) {
        // include all elements from wsa:ReferenceParameters
        // to SOAP headers of outgoing message
        DocumentFragment replyToFrag = inHeaders.get(JbiConstants.WSA_REPLY_TO_QNAME);
        Node refParams = XPathUtil.getElementByName(replyToFrag, JbiConstants.WSA_REFERENCE_PARAMS_QNAME);
        NodeList params = refParams.getChildNodes();

        for (int i = 0; i < params.getLength(); i++) {
            DocumentFragment fragment = XmlUtil.wrapWithDocumentFragment(params.item(i));
            Node fragmentNode = fragment.getFirstChild();
            QName fragmentName = new QName(fragmentNode.getNamespaceURI(), fragmentNode.getLocalName());
            outHeaders.put(fragmentName, fragment);
        }
    }
    outMessage.setHeader(JbiConstants.SOAP_HEADERS, outHeaders);
}

From source file:org.eclipse.uomo.xml.test.XMLTestCase.java

private String compareAttributes(Element e1, Element e2, String p) {
    NamedNodeMap n1 = e1.getAttributes();
    NamedNodeMap n2 = e2.getAttributes();

    for (int i = 0; i < n1.getLength(); i++) {
        Node a1 = n1.item(0);
        Node a2 = n2.getNamedItemNS(a1.getNamespaceURI(), a1.getLocalName());
        if (a2 == null)
            return "Unable to find attribute " + a1.getNodeName() + " @ " + p;
        if (a1.getNodeValue() != null || a2.getNodeValue() != null) {
            if (a1.getNodeValue() == null || a2.getNodeValue() == null
                    || !a1.getNodeValue().equals(a2.getNodeValue()))
                return "Attribute text differs @ " + p + "/@" + a1.getNodeName() + ": '" + a1.getNodeValue()
                        + "' / '" + a2.getNodeValue() + "'";
        }/*from   w ww.  ja v  a2 s . c o  m*/
    }

    for (int i = 0; i < n2.getLength(); i++) {
        Node a2 = n2.item(0);
        Node a1 = n1.getNamedItemNS(a2.getNamespaceURI(), a2.getLocalName());
        if (a1 == null)
            return "Unable to find attribute " + a2.getNodeName() + " @ " + p;
        if (a1.getNodeValue() != null || a2.getNodeValue() != null) {
            if (a1.getNodeValue() == null || a2.getNodeValue() == null
                    || !a1.getNodeValue().equals(a2.getNodeValue()))
                return "Attribute text differs @ " + p + "/@" + a1.getNodeName() + ": '" + a1.getNodeValue()
                        + "' / '" + a2.getNodeValue() + "'";
        }
    }

    return null;
}

From source file:org.entrystore.repository.impl.converters.OAI_DC2RDFGraphConverter.java

/**
 * Converts an oai_dc xml document tag metadata to a graph.
 * // w  ww.j av  a2 s . c om
 * @param from
 *            An XML NodeList.
 * 
 * @param resourceURI
 *            Root URI of the resource's metadata.
 * 
 * @return the new metadata graph.
 */
public Object convert(Object from, java.net.URI resourceURI, java.net.URI metadataURI) {
    NodeList metadataList = null;

    if (from instanceof NodeList) {
        metadataList = (NodeList) from;
    } else if (from instanceof Node) {
        metadataList = ((Node) from).getChildNodes();
    } else {
        log.warn("Unable to convert object, class type not supported");
        return null;
    }

    Graph graph = new GraphImpl();
    ValueFactory vf = graph.getValueFactory();
    org.openrdf.model.URI root = vf.createURI(resourceURI.toString());

    for (int i = 0; i < metadataList.getLength(); i++) {
        Node n = metadataList.item(i);
        if (n == null || "#text".equals(n.getNodeName())) {
            continue;
        }

        String nodeNS = n.getNamespaceURI();
        String nodeName = n.getNodeName();
        String predicate = null;
        if (nodeName.contains(":") && (nodeNS != null)) {
            nodeName = nodeName.substring(nodeName.indexOf(":") + 1);
            predicate = nodeNS + nodeName;
        } else {
            predicate = nodeName;
        }
        String nodeContent = n.getTextContent();
        if (nodeContent == null) {
            continue;
        }
        nodeContent = nodeContent.trim();

        // fix to create a valid language literal with a 2-letter ISO code
        // this is about the language value as a literal, attributes are treated further down
        if ("language".equalsIgnoreCase(nodeName)) {
            // convert 3-letter to 2-letter ISO code
            if (nodeContent.length() == 3) {
                nodeContent = getISO2Language(nodeContent);
            }
        }
        // <- fix

        // fix to convert ISO 3-letter lang codes to 2-letter codes
        // this is about LangStrings in general
        NamedNodeMap nodeAttributes = n.getAttributes();
        String lang = null;
        if (nodeAttributes != null) {
            Node langNode = nodeAttributes.getNamedItem("xml:lang");
            if (langNode != null) {
                lang = langNode.getNodeValue();
                if (lang != null) {
                    lang = lang.trim();
                    if (lang.length() == 3) {
                        lang = getISO2Language(lang.toLowerCase());
                    }
                }
            }
        }
        // <- fix

        Literal lit;
        if (lang != null) {
            lit = vf.createLiteral(nodeContent, lang);
        } else {
            lit = vf.createLiteral(nodeContent);
        }

        graph.add(root, new org.openrdf.model.impl.URIImpl(predicate), lit);
    }

    return graph;
}

From source file:org.exist.dom.ElementImpl.java

private Node appendChild(Txn transaction, NodeId newNodeId, NodeImplRef last, NodePath lastPath, Node child,
        StreamListener listener) throws DOMException {
    if (last == null || last.getNode() == null)
    //TODO : same test as above ? -pb
    {/*from  w w w  . j  a v  a  2 s.c  om*/
        throw new DOMException(DOMException.INVALID_MODIFICATION_ERR, "invalid node");
    }
    final DocumentImpl owner = (DocumentImpl) getOwnerDocument();
    DBBroker broker = null;
    try {
        broker = ownerDocument.getBrokerPool().get(null);
        switch (child.getNodeType()) {
        case Node.DOCUMENT_FRAGMENT_NODE:
            appendChildren(transaction, newNodeId, null, last, lastPath, child.getChildNodes(), listener);
            return null; // TODO: implement document fragments so
        //we can return all newly appended children
        case Node.ELEMENT_NODE:
            // create new element
            final ElementImpl elem = new ElementImpl(
                    new QName(child.getLocalName() == null ? child.getNodeName() : child.getLocalName(),
                            child.getNamespaceURI(), child.getPrefix()),
                    broker.getBrokerPool().getSymbols());
            elem.setNodeId(newNodeId);
            elem.setOwnerDocument(owner);
            final NodeListImpl ch = new NodeListImpl();
            final NamedNodeMap attribs = child.getAttributes();
            int numActualAttribs = 0;
            for (int i = 0; i < attribs.getLength(); i++) {
                final Attr attr = (Attr) attribs.item(i);
                if (!attr.getNodeName().startsWith("xmlns")) {
                    ch.add(attr);
                    numActualAttribs++;
                } else {
                    final String xmlnsDecl = attr.getNodeName();
                    final String prefix = xmlnsDecl.length() == 5 ? "" : xmlnsDecl.substring(6);
                    elem.addNamespaceMapping(prefix, attr.getNodeValue());
                }
            }
            final NodeList cl = child.getChildNodes();
            for (int i = 0; i < cl.getLength(); i++) {
                final Node n = cl.item(i);
                if (n.getNodeType() != Node.ATTRIBUTE_NODE) {
                    ch.add(n);
                }
            }
            elem.setChildCount(ch.getLength());
            if (numActualAttribs != (short) numActualAttribs) {
                throw new DOMException(DOMException.INVALID_MODIFICATION_ERR, "Too many attributes");
            }
            elem.setAttributes((short) numActualAttribs);
            lastPath.addComponent(elem.getQName());
            // insert the node
            broker.insertNodeAfter(transaction, last.getNode(), elem);
            broker.indexNode(transaction, elem, lastPath);
            broker.getIndexController().indexNode(transaction, elem, lastPath, listener);
            elem.setChildCount(0);
            last.setNode(elem);
            //process child nodes
            elem.appendChildren(transaction, newNodeId.newChild(), null, last, lastPath, ch, listener);
            broker.endElement(elem, lastPath, null);
            broker.getIndexController().endElement(transaction, elem, lastPath, listener);
            lastPath.removeLastComponent();
            return elem;
        case Node.TEXT_NODE:
            final TextImpl text = new TextImpl(newNodeId, ((Text) child).getData());
            text.setOwnerDocument(owner);
            // insert the node
            broker.insertNodeAfter(transaction, last.getNode(), text);
            broker.indexNode(transaction, text, lastPath);
            broker.getIndexController().indexNode(transaction, text, lastPath, listener);
            last.setNode(text);
            return text;
        case Node.CDATA_SECTION_NODE:
            final CDATASectionImpl cdata = new CDATASectionImpl(newNodeId, ((CDATASection) child).getData());
            cdata.setOwnerDocument(owner);
            // insert the node
            broker.insertNodeAfter(transaction, last.getNode(), cdata);
            broker.indexNode(transaction, cdata, lastPath);
            last.setNode(cdata);
            return cdata;
        case Node.ATTRIBUTE_NODE:
            final Attr attr = (Attr) child;
            final String ns = attr.getNamespaceURI();
            final String prefix = (Namespaces.XML_NS.equals(ns) ? "xml" : attr.getPrefix());
            String name = attr.getLocalName();
            if (name == null) {
                name = attr.getName();
            }
            final QName attrName = new QName(name, ns, prefix);
            final AttrImpl attrib = new AttrImpl(attrName, attr.getValue(),
                    broker.getBrokerPool().getSymbols());
            attrib.setNodeId(newNodeId);
            attrib.setOwnerDocument(owner);
            if (ns != null && attrName.compareTo(Namespaces.XML_ID_QNAME) == Constants.EQUAL) {
                // an xml:id attribute. Normalize the attribute and set its type to ID
                attrib.setValue(StringValue.trimWhitespace(StringValue.collapseWhitespace(attrib.getValue())));
                attrib.setType(AttrImpl.ID);
            } else {
                attrName.setNameType(ElementValue.ATTRIBUTE);
            }
            broker.insertNodeAfter(transaction, last.getNode(), attrib);
            broker.indexNode(transaction, attrib, lastPath);
            broker.getIndexController().indexNode(transaction, attrib, lastPath, listener);
            last.setNode(attrib);
            return attrib;
        case Node.COMMENT_NODE:
            final CommentImpl comment = new CommentImpl(((Comment) child).getData());
            comment.setNodeId(newNodeId);
            comment.setOwnerDocument(owner);
            // insert the node
            broker.insertNodeAfter(transaction, last.getNode(), comment);
            broker.indexNode(transaction, comment, lastPath);
            last.setNode(comment);
            return comment;
        case Node.PROCESSING_INSTRUCTION_NODE:
            final ProcessingInstructionImpl pi = new ProcessingInstructionImpl(newNodeId,
                    ((ProcessingInstruction) child).getTarget(), ((ProcessingInstruction) child).getData());
            pi.setOwnerDocument(owner);
            //insert the node
            broker.insertNodeAfter(transaction, last.getNode(), pi);
            broker.indexNode(transaction, pi, lastPath);
            last.setNode(pi);
            return pi;
        default:
            throw new DOMException(DOMException.INVALID_MODIFICATION_ERR,
                    "Unknown node type: " + child.getNodeType() + " " + child.getNodeName());
        }
    } catch (final EXistException e) {
        LOG.warn("Exception while appending node: " + e.getMessage(), e);
    } finally {
        if (broker != null)
            broker.release();
    }
    return null;
}