Example usage for org.w3c.dom Node getNextSibling

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

Introduction

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

Prototype

public Node getNextSibling();

Source Link

Document

The node immediately following this node.

Usage

From source file:org.squale.squalix.tools.clearcase.configuration.ClearCaseConfiguration.java

/**
 * Dans un premier temps, cette mthode rcupre l'attribut et la valeur d'un noeud donn. Puis elle appelle la
 * mthode dont le nom est pass en paramtre par rflexion. <br />
 * Elle ne fonctionne que si la mthode dont le nom est pass en paramtre prend elle-mme pour paramtres 2
 * <code>java.lang.String</code>.
 * //from   www. j  ava 2 s .  c o  m
 * @param pNode le noeud XML  parser.
 * @param pRootAnchor le nom de la balise racine  trouver
 * @param pChildAnchor le nom de la / des balise(s) fille(s)  trouver.
 * @param pMethodName le nom de la mthode  appeler par rflexion. ATTENTION : on ne peut passer en paramtre que
 *            des mthodes prenant elles-mme 2 <code>java.lang.String</code> en paramtres.
 * @throws Exception gnre une exception si le nom du noeud ne correspond pas  une des valeurs dfinies dans le
 *             fichier de configuration <code>
 * org.squale.squalix.tools.clearcase.clearcase.properties</code>.
 * @see ConfigUtility
 */
private void processFromXML(final Node pNode, final String pRootAnchor, final String pChildAnchor,
        final String pMethodName) throws Exception {
    /* on rcupre le 1er noeud contenant une commande */
    Node myNode = ConfigUtility.getNodeByTagName(pNode, pRootAnchor);

    /*
     * instanciation des variables qui vont servir dans la boucle qui va suivre
     */
    String nodeName = null;
    String pattern = null;
    String attrName = null;
    String nodeValue = null;
    NamedNodeMap attrMap = null;

    /* tant que le noeud n'est pas nul */
    while (null != myNode) {
        /* noeud de type ELEMENT */
        if (Node.ELEMENT_NODE == myNode.getNodeType()) {
            /* on rcupre le nom du noeud. */
            nodeName = myNode.getFirstChild().getNodeName();

            /* on rcupre tous les attributs du noeud. */
            attrMap = (myNode.getAttributes());

            /* on rcupre le nom de l'attribut qui nous intresse. */
            attrName = (String) (attrMap.getNamedItem(pChildAnchor)).getNodeValue().trim();

            if (null != attrName && !"".equals(attrName)) {
                // On recupere la valeur de la balise
                // le texte peut etre parsem de commentaires
                // utilsis dans le migConfig
                // d'o la ncessit de parcourir tous les fils de type
                // texte
                nodeValue = null;
                NodeList nodes = myNode.getChildNodes();
                for (int i = 0; (i < nodes.getLength()) && (nodeValue == null); i++) {
                    Node currentNode = nodes.item(i);
                    if (currentNode.getNodeType() == Node.TEXT_NODE) {
                        /* valeur du noeud en question. */
                        String value = currentNode.getNodeValue().trim();
                        if (value.length() > 0) {
                            nodeValue = ConfigUtility.filterStringWithSystemProps(value);
                        }
                    }
                }
                // Affichage d'un warning lorsque qu'aucune valeur n'a t trouve
                if (nodeValue == null) {
                    nodeValue = "";
                    LOGGER.warn(ClearCaseMessages.getString("logs.cfg.empty") + attrName);
                }
                /*
                 * on cre la tableau de type de paramtres ici, un tableau de 2 String
                 */
                Class[] param = { String.class, String.class };

                /* on cre le tableau des 2 paramtres en rapport */
                Object[] args = { attrName, nodeValue };

                /* on invoque la mthode fournie en paramtre */
                ((Method) (this.getClass().getDeclaredMethod(pMethodName, param))).invoke(this, args);
            } else {
                /* on lance une exception */
                throw new Exception(ClearCaseMessages.getString("exception.xml.null_or_void_attribute"));
            }
        }
        /* on itre */
        myNode = myNode.getNextSibling();
    }

    /* mnage */
    myNode = null;
    nodeName = null;
    nodeValue = null;
    pattern = null;
    attrName = null;
    attrMap = null;
}

From source file:org.squale.squalix.tools.compiling.java.configuration.JCompilingConfiguration.java

/**
 * Rcupre les classpaths vers les APIs Java
 * //from   www . j a v  a 2 s.  co m
 * @param pNode le noeud
 * @throws Exception si erreur
 */
private void getBootclasspathsFromXML(final Node pNode) throws Exception {

    /* noeud racine contenant les classpaths */
    Node myNode = ConfigUtility.getNodeByTagName(pNode,
            CompilingMessages.getString("configuration.java.general.bootclasspaths"));

    boolean throwException = false;

    // not null and element type
    if (null != myNode && Node.ELEMENT_NODE == myNode.getNodeType()) {
        // We get the first child node
        myNode = ConfigUtility.getNodeByTagName(myNode,
                CompilingMessages.getString("configuration.java.general.bootclasspaths.bootclasspath"));

        // If node exists
        if (null != myNode) {
            NamedNodeMap attrMap = null;
            String javaVersion = null;

            /* tant qu'il y a des noeuds */
            while (null != myNode) {
                if (Node.ELEMENT_NODE == myNode.getNodeType()) {
                    /* on rcupre les attributs du noeud */
                    attrMap = myNode.getAttributes();

                    /* attribut "version" */
                    javaVersion = (attrMap.getNamedItem(CompilingMessages
                            .getString("configuration.java.general.bootclasspaths.bootclasspath.version")))
                                    .getNodeValue().trim();

                    // We will get all children nodes
                    getBootClasspathLibsFromXML(myNode, javaVersion);
                }
                /* on itre */
                myNode = myNode.getNextSibling();
            }

            attrMap = null;
            javaVersion = null;

            /* erreur rencontre --> exception  lancer */
        } else {
            throwException = true;
        }
        /* erreur rencontre --> exception  lancer */
    } else {
        throwException = true;
    }

    myNode = null;

    /* erreur rencontre */
    if (throwException) {
        /* exception lance */
        throw new Exception(CompilingMessages.getString("exception.xml.node_not_found"));
    }
}

From source file:org.squale.squalix.tools.compiling.java.configuration.JCompilingConfiguration.java

/**
 * Add bootclasspath lib to the bootclasspath map with javaVersion key
 * //from w w  w.  j  ava2s . c  o m
 * @param pNode root node containing all lib tag definitions
 * @param javaVersion java dialect
 * @throws Exception if error
 */
private void getBootClasspathLibsFromXML(Node pNode, String javaVersion) throws Exception {

    boolean throwException = false;
    Node node = pNode;

    // not null and element type
    if (null != node && Node.ELEMENT_NODE == node.getNodeType()) {
        // We get the first child node
        node = ConfigUtility.getNodeByTagName(node,
                CompilingMessages.getString("configuration.java.general.bootclasspaths.bootclasspath.lib"));

        // If node exists
        if (null != node) {

            NamedNodeMap attrMap = null;
            String attrPath = null;

            /* While there are nodes */
            while (null != node) {
                if (Node.ELEMENT_NODE == node.getNodeType()) {
                    /* on rcupre les attributs du noeud */
                    attrMap = node.getAttributes();

                    /* "path" attribute */
                    attrPath = (attrMap.getNamedItem(CompilingMessages
                            .getString("configuration.java.general.bootclasspaths.bootclasspath.lib.path")))
                                    .getNodeValue().trim();

                    // We invoke add method
                    ((Method) (mMap.get(CompilingMessages
                            .getString("configuration.java.general.bootclasspaths.bootclasspath"))))
                                    .invoke(this, new String[] { javaVersion, attrPath });
                }
                /* on itre */
                node = node.getNextSibling();
            }

            attrMap = null;
            attrPath = null;

            /* have error --> launch exception */
        } else {
            throwException = true;
        }
        /* have erreor --> launch exception */
    } else {
        throwException = true;
    }

    node = null;

    /* have error */
    if (throwException) {
        /* launched exception */
        throw new Exception(CompilingMessages.getString("exception.xml.node_not_found"));
    }
}

From source file:org.squale.squalix.tools.compiling.java.configuration.JCompilingConfiguration.java

/**
 * Cette mthode rcupre le valeur des cls ncessaires pour parser le fichier de classpath.
 * //from  w  w  w. j a  va2  s  .com
 * @param pNode noeud XML  parser.
 * @throws Exception exception en cas d'erreur lors du parsing.
 * @see #mapKeyValue(String, String)
 */
private void getSeparatorsFromXML(final Node pNode) throws Exception {
    LOGGER.trace(CompilingMessages.getString("logs.task.entering_method"));

    /* noeud racine contenant les sparateurs */
    Node myNode = ConfigUtility.getNodeByTagName(pNode,
            CompilingMessages.getString("configuration.java.general.separators"));

    boolean throwException = false;

    /* noeud non nul et de type ELEMENT */
    if (null != myNode && Node.ELEMENT_NODE == myNode.getNodeType()) {
        /* on rcupre le 1er noeud fils */
        myNode = ConfigUtility.getNodeByTagName(myNode,
                CompilingMessages.getString("configuration.java.general.separators.separator"));

        /* si ce noeud existe */
        if (null != myNode) {
            NamedNodeMap attrMap = null;
            String attrValue = null, attrName = null;

            /* tant qu'il y a des noeuds */
            while (null != myNode) {
                if (Node.ELEMENT_NODE == myNode.getNodeType()) {
                    /* on rcupre les attributs du noeud */
                    attrMap = myNode.getAttributes();

                    /* attribut "cl" */
                    attrName = (attrMap.getNamedItem(CompilingMessages
                            .getString("configuration.java.general.separators.separator.name"))).getNodeValue()
                                    .trim();

                    /* attribut "valeur" */
                    attrValue = (attrMap.getNamedItem(CompilingMessages
                            .getString("configuration.java.general.separators.separator.value"))).getNodeValue()
                                    .trim();

                    /* on mappe les cls / valeurs -> rflexion. */
                    mapKeyValue(attrName, attrValue);
                }
                /* on itre */
                myNode = myNode.getNextSibling();
            }

            attrMap = null;
            attrName = null;
            attrValue = null;

            /* erreur rencontre --> exception  lancer */
        } else {
            throwException = true;
        }
        /* erreur rencontre --> exception  lancer */
    } else {
        throwException = true;
    }

    myNode = null;

    /* erreur rencontre */
    if (throwException) {
        /* exception lance */
        throw new Exception(CompilingMessages.getString("exception.xml.node_not_found"));
    }
}

From source file:org.squale.squalix.tools.compiling.java.parser.wsad.JWSADParser.java

/**
 * Lance le parsing.//from w  w w . ja v  a  2s .  c  om
 * 
 * @param pProject projet WSAD
 * @return <code>true</code> en cas de succs, <code>false</code> sinon.
 * @throws Exception lorque le fichier est mal format
 */
private boolean parse(JWSADProject pProject) throws Exception {
    /* on part du principe que le parsing fonctionnera */
    boolean isParsed = true;
    /*
     * on rcupre le noeud "<classpath>" du fichier ".classpath" du projet WSAD
     */
    Node myNode = JParserUtility.getRootNode(pProject.getPath() + mConfiguration.getFilename(),
            mConfiguration.getClasspathAnchor());

    /*
     * si le noeud n'est pas nul, et qu'il s'agit d'un noeud de type ELEMENT_NODE
     */
    if (null != myNode && Node.ELEMENT_NODE == myNode.getNodeType()) {
        /* on rcupre le noeud "<classpathentry>" */
        myNode = JParserUtility.getNodeByTagName(myNode, mConfiguration.getClasspathentry());

        /* on initialise les variables pour la bouche  suivre */
        NamedNodeMap attrMap = null;
        Node exported = null;
        String attrValue = null, attrName = null, exportedAttr = "false";

        /* si le noeud n'est pas nul */
        while (null != myNode) {
            /* si le noeud est de type ELEMENT_NODE */
            if (Node.ELEMENT_NODE == myNode.getNodeType()) {
                /* on rcupre les attributs du noeud */
                attrMap = myNode.getAttributes();

                /* on rcupre la valeur de l'attribut KIND */
                attrName = (attrMap.getNamedItem(mConfiguration.getKind())).getNodeValue().trim();

                /* on rcupre la valeur de l'attribut PATH */
                attrValue = (attrMap.getNamedItem(mConfiguration.getPath())).getNodeValue().trim();

                /* on rcupre la valeur de l'attribut EXPORTED */
                // Par dfaut exported = false;
                exportedAttr = "false";
                exported = attrMap.getNamedItem(mConfiguration.getExported());
                if (null != exported) {
                    exportedAttr = exported.getNodeValue().trim();
                }

                /*
                 * on mappe les couples cl / valeur car il faut traiter les lib en premier
                 */
                mapKeyValues(pProject, attrName, attrValue, Boolean.valueOf(exportedAttr).booleanValue());
            }
            /* on itre sur les noeuds */
            myNode = myNode.getNextSibling();
        }
        /* on fait le mnage */
        attrMap = null;
        attrName = null;
        attrValue = null;

        /* si le noeud est nul ou du mauvais type */
    } else {
        /* alors on lance une exception */
        throw new Exception(CompilingMessages.getString("exception.xml.node_not_found"));
    }

    myNode = null;

    /*
     * on cre un buffer pour dfinir le chemin du dossier contenant les ressources ncessaires  la compilation
     */
    StringBuffer path = new StringBuffer(CompilingMessages.getString("dir.root.java"));
    path.append(JCompilingConfiguration.UNIX_SEPARATOR);
    path.append(pProject.getJavaVersion());
    path.append(JCompilingConfiguration.UNIX_SEPARATOR);

    /*
     * on cre le descripteur de fichier et on appelle la mthode addCompilingRessourcesToClasspath(File)
     */
    File f = new File(path.toString().replace('.', '_'));
    addCompilingRessourcesToClasspath(pProject, f);
    f = null;

    return isParsed;
}

From source file:org.squale.squalix.tools.compiling.java.parser.wsad.JWSADParserConfiguration.java

/**
 * Cette mthode rcupre le nom des cls ncessaires pour parser le fichier de classpath.
 * /* ww  w . j  a v  a2 s. c om*/
 * @param pNode noeud XML  parser.
 * @param pRootAnchor noeud racine.
 * @param pChildAnchor noeud fils.
 * @param pChildName attribut "name" du noeud fils.
 * @param pChildValue attribut "value" du noeud fils.
 * @throws Exception exception en cas d'erreur lors du parsing.
 * @see #mapKeyValues(String, String)
 */
private void getTagsFromXML(final Node pNode, final String pRootAnchor, final String pChildAnchor,
        final String pChildName, final String pChildValue) throws Exception {
    LOGGER.trace(CompilingMessages.getString("logs.task.entering_method"));

    /* on rcupre le noeud racine contenant les cls */
    Node myNode = ConfigUtility.getNodeByTagName(pNode, pRootAnchor);

    boolean throwException = false;

    /* si le noeud est bien trouv */
    if (null != myNode && Node.ELEMENT_NODE == myNode.getNodeType()) {

        /* on rcupre le premier noeud fils */
        myNode = ConfigUtility.getNodeByTagName(myNode, pChildAnchor);

        if (null != myNode) {
            /*
             * on initialise des variables pour la boucle qui va suivre
             */
            NamedNodeMap attrMap = null;
            String attrValue = null, attrName = null;

            /* tant qu'il y a des noeuds */
            while (null != myNode) {
                /* s'il est de type ELEMENT */
                if (Node.ELEMENT_NODE == myNode.getNodeType()) {
                    /* rcupration des attributs du noeud */
                    attrMap = myNode.getAttributes();

                    /* attribut "cl" */
                    attrName = (attrMap.getNamedItem(pChildName)).getNodeValue().trim();

                    /* attribut "valeur" */
                    attrValue = (attrMap.getNamedItem(pChildValue)).getNodeValue().trim();

                    /* on mappe les cls et les valeurs */
                    mapKeyValues(attrName, attrValue);
                }
                /* on itre sur les noeuds */
                myNode = myNode.getNextSibling();
            }
            /* mnage */
            attrMap = null;
            attrName = null;
            attrValue = null;
        } else {
            /* noeud vide */
            throwException = true;
        }
    } else {
        /* noeud vide */
        throwException = true;
    }

    myNode = null;

    /* une erreur s'est produite : le noeud tait vide */
    if (throwException) {
        /* on lance l'exception en rapport */
        throw new Exception(CompilingMessages.getString("exception.xml.node_not_found"));
    }
}

From source file:org.squale.squalix.tools.mccabe.McCabeConfiguration.java

/**
 * Parse le fichier de configuration afin d'en extraire la configuration au format objet.
 * /*from w ww  .java 2 s .c o  m*/
 * @param pProject projet  analyser.
 * @param pFile nom du fichier de configuration.
 * @param pDatas la liste des paramtres temporaires du projet
 * @return la configuration demande
 * @throws Exception si un problme de parsing apparait.
 * @roseuid 42B97169031D
 */
public static McCabeConfiguration build(final ProjectBO pProject, final String pFile, TaskData pDatas)
        throws Exception {
    McCabeConfiguration config = new McCabeConfiguration();
    config.mProject = pProject;
    // Recuperation de la configuration
    Node root = ConfigUtility.getRootNode(pFile, McCabeMessages.getString("configuration.root"));
    if (null != root) {
        // Rcupration du noeud contenant la configuration gnrale
        Node generalNode = ConfigUtility.getNodeByTagName(root,
                McCabeMessages.getString("configuration.general"));
        setGeneral(generalNode, config);
        // Rcupration du noeud contenant la configuration des profils
        Node profilesNode = ConfigUtility.getNodeByTagName(root,
                McCabeMessages.getString("configuration.profiles"));
        Node profileNode = profilesNode.getFirstChild();
        boolean found = false;
        // Recherche du profil associ au projet
        String valueProject = pProject.getProfile().getName();
        // Rcupration du dialecte associ au langage
        StringParameterBO dialect = (StringParameterBO) pProject.getParameters().getParameters()
                .get(ParametersConstants.DIALECT);
        if (null != dialect) {
            valueProject += dialect.getValue();
        }
        while (null != profileNode && !found) {
            String valueConfig = ConfigUtility.getAttributeValueByName(profileNode,
                    McCabeMessages.getString("configuration.profile.name"));
            if (profileNode.getNodeType() == Node.ELEMENT_NODE && valueConfig.equals(valueProject)) {
                found = true;
                // On parse la configuration associe au profil
                setProfile(profileNode, config);
            } else {
                profileNode = profileNode.getNextSibling();
            }
        }
        if (!found) {
            throw new McCabeException(McCabeMessages.getString("exception.no_profile") + valueProject);
        }
    }
    // On met en place les valeurs des paramtres du projet
    setParameters(config, pDatas);
    // Et enfin on cre un espace propre au projet, totalement alatoire,
    // avec une composante dpendant du temps, pour s'assurer que deux audits ne seront
    // pas gnrs dans le mme dossier.
    config.mSubWorkspace = new File(config.mWorkspace.getAbsolutePath() + File.separator
            + System.currentTimeMillis() + (int) Math.random() * RANDOM_RANGE);
    // On cre le dossier destin  accueillir les fichiers McCabe
    if (!config.mSubWorkspace.mkdirs()) {
        throw new McCabeException(
                McCabeMessages.getString("exception.no_subworkspace") + config.mSubWorkspace.getAbsolutePath());
    }
    LOGGER.debug(McCabeMessages.getString("logs.debug.subworkspace_created")
            + config.mSubWorkspace.getAbsolutePath());
    return config;
}

From source file:org.squale.squalix.tools.mccabe.McCabeConfiguration.java

/**
 * Met la configuration du profil en place.
 * /*from  w ww  . j a v  a 2s.  com*/
 * @param pNode le noeud XML  parser.
 * @param pConfiguration l'instance de configuration  mettre en place.
 * @roseuid 42D520A303D2
 */
private static void setProfile(final Node pNode, final McCabeConfiguration pConfiguration) {
    // Nom du parser
    pConfiguration.mParser = ConfigUtility
            .getNodeByTagName(pNode, McCabeMessages.getString("configuration.profile.parser")).getFirstChild()
            .getNodeValue().trim();
    // Liste des extensions
    Node extensionsNode = ConfigUtility.getNodeByTagName(pNode,
            McCabeMessages.getString("configuration.profile.extensions"));
    // Les extensions sont spares par des ","
    StringTokenizer token = new StringTokenizer(extensionsNode.getFirstChild().getNodeValue().trim(), ",");
    ArrayList extensions = new ArrayList();
    // On ajoute les extensions  la liste
    while (token.hasMoreTokens()) {
        extensions.add(token.nextToken().trim());
    }
    String[] type = new String[0];
    // On convertit la liste des extensions en tableau de String
    pConfiguration.mExtensions = (String[]) extensions.toArray(type);

    // Rcupration du niveau de mtrique
    Node metricslevelNode = ConfigUtility.getNodeByTagName(pNode,
            McCabeMessages.getString("configuration.profile.metrics_level"));
    if (metricslevelNode != null) {
        pConfiguration.mMetricsLevel = (String) metricslevelNode.getFirstChild().getNodeValue().trim();
    }

    // Liste des extensions des enttes
    Node entetesNode = ConfigUtility.getNodeByTagName(pNode,
            McCabeMessages.getString("configuration.profile.entetes"));
    if (entetesNode != null) {
        // Les en-ttes sont spars par des ","
        token = new StringTokenizer(entetesNode.getFirstChild().getNodeValue().trim(), ",");
        ArrayList entetes = new ArrayList();
        while (token.hasMoreTokens()) {
            entetes.add(token.nextToken().trim());
        }
        type = new String[0];
        // Conversion de la liste crer en tableau de String
        pConfiguration.mEntetes = (String[]) entetes.toArray(type);
    }

    // Liste des paramtres de parsing
    Node parametersNode = ConfigUtility.getNodeByTagName(pNode,
            McCabeMessages.getString("configuration.profile.parameters"));
    ArrayList parameters = new ArrayList();
    // Un tag par paramtre
    Node parameterNode = parametersNode.getFirstChild();
    // On ajoute tous les paramtres
    while (null != parameterNode) {
        if (parameterNode.getNodeType() == Node.ELEMENT_NODE) {
            parameters.add(
                    ConfigUtility.filterStringWithSystemProps(parameterNode.getFirstChild().getNodeValue()));
        }
        parameterNode = parameterNode.getNextSibling();
    }
    // Conversion en tableau de String
    pConfiguration.mParseParameters = (String[]) parameters.toArray(type);
    // Liste des rapports
    pConfiguration.mReports = getStrListFromNode(pNode, "configuration.profiles.reports");
}

From source file:org.structr.web.entity.dom.DOMNode.java

@Override
public Node insertBefore(final Node newChild, final Node refChild) throws DOMException {

    // according to DOM spec, insertBefore with null refChild equals appendChild
    if (refChild == null) {

        return appendChild(newChild);
    }// ww  w .  j a v  a 2  s. c o m

    checkWriteAccess();

    checkSameDocument(newChild);
    checkSameDocument(refChild);

    checkHierarchy(newChild);
    checkHierarchy(refChild);

    if (newChild instanceof DocumentFragment) {

        // When inserting document fragments, we must take
        // care of the special case that the nodes already
        // have a NEXT_LIST_ENTRY relationship coming from
        // the document fragment, so we must first remove
        // the node from the document fragment and then
        // add it to the new parent.
        final DocumentFragment fragment = (DocumentFragment) newChild;
        Node currentChild = fragment.getFirstChild();

        while (currentChild != null) {

            // save next child in fragment list for later use
            Node savedNextChild = currentChild.getNextSibling();

            // remove child from document fragment
            fragment.removeChild(currentChild);

            // insert child into new parent
            insertBefore(currentChild, refChild);

            // next
            currentChild = savedNextChild;
        }

    } else {

        final Node _parent = newChild.getParentNode();
        if (_parent != null) {

            _parent.removeChild(newChild);
        }

        try {

            // do actual tree insertion here
            treeInsertBefore((DOMNode) newChild, (DOMNode) refChild);

        } catch (FrameworkException frex) {

            if (frex.getStatus() == 404) {

                throw new DOMException(DOMException.NOT_FOUND_ERR, frex.getMessage());

            } else {

                throw new DOMException(DOMException.INVALID_STATE_ERR, frex.getMessage());
            }
        }

        // allow parent to set properties in new child
        handleNewChild(newChild);
    }

    return refChild;
}

From source file:org.structr.web.entity.dom.DOMNode.java

@Override
public Node replaceChild(final Node newChild, final Node oldChild) throws DOMException {

    checkWriteAccess();/*from  www . jav  a 2s.  c  om*/

    checkSameDocument(newChild);
    checkSameDocument(oldChild);

    checkHierarchy(newChild);
    checkHierarchy(oldChild);

    if (newChild instanceof DocumentFragment) {

        // When inserting document fragments, we must take
        // care of the special case that the nodes already
        // have a NEXT_LIST_ENTRY relationship coming from
        // the document fragment, so we must first remove
        // the node from the document fragment and then
        // add it to the new parent.
        // replace indirectly using insertBefore and remove
        final DocumentFragment fragment = (DocumentFragment) newChild;
        Node currentChild = fragment.getFirstChild();

        while (currentChild != null) {

            // save next child in fragment list for later use
            final Node savedNextChild = currentChild.getNextSibling();

            // remove child from document fragment
            fragment.removeChild(currentChild);

            // add child to new parent
            insertBefore(currentChild, oldChild);

            // next
            currentChild = savedNextChild;
        }

        // finally, remove reference element
        removeChild(oldChild);

    } else {

        Node _parent = newChild.getParentNode();
        if (_parent != null && _parent instanceof DOMNode) {

            _parent.removeChild(newChild);
        }

        try {
            // replace directly
            treeReplaceChild((DOMNode) newChild, (DOMNode) oldChild);

        } catch (FrameworkException frex) {

            if (frex.getStatus() == 404) {

                throw new DOMException(DOMException.NOT_FOUND_ERR, frex.getMessage());

            } else {

                throw new DOMException(DOMException.INVALID_STATE_ERR, frex.getMessage());
            }
        }

        // allow parent to set properties in new child
        handleNewChild(newChild);
    }

    return oldChild;
}