@Override public final Document getDocument() { final Element root = getRootElement(); if (root != null) { return (Document) root.getParent(); } else { return (Document) getParent(); } }
@Override public String toString() { return getType().name(); }
/** * Removes the child located at a given index. * <p> * If index is invalid, returns {@code false}. * * @param index The index (0-based). * @return The removed child. * @throws IndexOutOfBoundsException When index is out of range ({@code index < 0 || index >= getChildrenCount()}). */ public default Child removeChildAt(int index) { final AbstractChild child = (AbstractChild) getChildren().get(index); getModifiableChildren().remove(child); child.resetParent(); return child; }
@Override public final Element getRootElement() { final Node root = getRootChild(); if (root.getType() == NodeType.DOCUMENT) { // Root is a document return ((Document) root).getRootElement(); } else if (root.getType() == NodeType.ELEMENT) { // Root is an element return (Element) root; } else { // Root is either a comment or a text. return null; } }
@Override public final void setParent(Parent parent) { if (parent == this.parent) { // Ignore } else if (parent == null || parent.canAddChild(this)) { // We always allow setting a null parent // Detach current parent if (this.parent != null) { this.parent.getModifiableChildren().remove(this); this.parent = null; } // Attach new parent if (parent != null) { parent.getModifiableChildren().add(this); this.parent = parent; } } else { throw new IllegalStateException("Can not set parent. child: " + getType() + " parent: " + parent.getType()); } }