LoboEvolution/LoboEvolution

View on GitHub
LoboHTML/src/main/java/org/loboevolution/html/js/xml/XMLDocument.java

Summary

Maintainability
F
5 days
Test Coverage
/*
 * MIT License
 *
 * Copyright (c) 2014 - 2024 LoboEvolution
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 * Contact info: ivan.difrancesco@yahoo.it
 */

package org.loboevolution.html.js.xml;

import lombok.extern.slf4j.Slf4j;
import org.htmlunit.cssparser.dom.DOMException;
import org.loboevolution.html.dom.*;
import org.loboevolution.html.dom.nodeimpl.traversal.TreeWalkerImpl;
import org.loboevolution.html.node.*;
import org.loboevolution.events.Event;
import org.loboevolution.js.Location;
import org.loboevolution.js.Window;
import org.loboevolution.traversal.NodeFilter;
import org.loboevolution.traversal.NodeIterator;
import org.loboevolution.traversal.TreeWalker;
import org.loboevolution.html.parser.InputSourceImpl;
import org.loboevolution.html.xpath.XPathExpression;
import org.loboevolution.html.xpath.XPathNSResolver;
import org.loboevolution.html.xpath.XPathResult;
import org.loboevolution.type.DocumentReadyState;
import org.loboevolution.type.VisibilityState;
import org.mozilla.javascript.Function;
import org.w3c.dom.events.EventException;
import org.xml.sax.SAXException;

import java.io.File;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

/**
 * XMLDocument class.
 */
@Slf4j
public class XMLDocument implements Document {

    private static Document doc;

    /**
     * Load XML file
     *
     * @param fileName name of file in file system
     * @return XMLDocument
     */
    public static XMLDocument load(final String fileName) {
        final XMLDocument ret = new XMLDocument();
        ret.loadFile(fileName);
        return ret;
    }

    /**
     * Load XML file
     *
     * @param fileName name of file in file system
     * @return XML String
     */
    public String loadXML(final String fileName) {
        loadFile(fileName);
        return getXML();
    }

    /**
     * Load XML file
     * 
     * @param fileStr name of in file system
     */
    private synchronized void loadFile(final String fileStr) {
        try {
            final File f = new File(fileStr);
            final XMLDocumentBuilder builder = new XMLDocumentBuilder();
            if (f.isFile()) {
                doc = builder.parse(new InputSourceImpl(Files.newInputStream(f.toPath()), "", StandardCharsets.UTF_8));
            } else {
                final InputStream in = new ByteArrayInputStream(fileStr.getBytes());
                doc = builder.parse(new InputSourceImpl(in, "", StandardCharsets.UTF_8));
            }
        } catch (final SAXException e) {
            log.warn("A DOCTYPE was passed into the XML document");
        } catch (final IOException e) {
            log.error("IOException occurred, XXE may still possible: ", e);
        } catch (final Exception e) {
            log.error(e.getMessage(), e);
        }
    }

    /**
     * <p>
     * getXML.
     * </p>
     *
     * @return XML String
     */
    public String getXML() {
        return getXmlEncoding();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getElementsByTagName(final String tagname) {
        return doc.getElementsByTagName(tagname);
    }

    /** {@inheritDoc} */
    @Override
    public Element getElementById(final String id) {
        return doc.getElementById(id);
    }

    /** {@inheritDoc} */
    @Override
    public Node appendChild(final Node newChild) {
        return doc.appendChild(newChild);
    }

    /**
     * <p>prependChild.</p>
     *
     * @param newChild a {@link Node} object.
     * @return a {@link Node} object.
     */
    @Override
    public Node prependChild(final Node newChild) {
        return doc.prependChild(newChild);
    }


    /**
     * <p>prepend.</p>
     *
     * @param newChild a {@link Node} object.
     * @return a {@link Node} object.
     */
    @Override
    public Node prepend(final Node newChild) {
        return doc.prepend(newChild);
    }

    /** {@inheritDoc} */
    @Override
    public Node cloneNode(final boolean deep) {
        return doc.cloneNode(deep);
    }

    /** {@inheritDoc} */
    @Override
    public short compareDocumentPosition(final Node other) {
        return doc.compareDocumentPosition(other);
    }

    @Override
    public boolean isSupported(final String xml, final String s) {
        return false;
    }

    @Override
    public boolean hasAttributes() {
        return doc.hasAttributes();
    }

    @Override
    public Node getFeature(final String name, final String version) {
        return doc.getFeature(name, version);
    }

    /** {@inheritDoc} */
    @Override
    public String getBaseURI() {
        return doc.getBaseURI();
    }

    /** {@inheritDoc} */
    @Override
    public NodeList getChildNodes() {
        return doc.getChildNodes();
    }

    /** {@inheritDoc} */
    @Override
    public Node getFirstChild() {
        return doc.getFirstChild();
    }

    /** {@inheritDoc} */
    @Override
    public Node getLastChild() {
        return doc.getLastChild();
    }

    /** {@inheritDoc} */
    @Override
    public String getLocalName() {
        return doc.getLocalName();
    }

    /** {@inheritDoc} */
    @Override
    public String getNamespaceURI() {
        return doc.getNamespaceURI();
    }

    /** {@inheritDoc} */
    @Override
    public Node getNextSibling() {
        return doc.getNextSibling();
    }

    /** {@inheritDoc} */
    @Override
    public String getNodeName() {
        return doc.getNodeName();
    }

    /** {@inheritDoc} */
    @Override
    public int getNodeType() {
        return doc.getNodeType();
    }

    /** {@inheritDoc} */
    @Override
    public String getNodeValue() {
        return doc.getNodeValue();
    }

    /** {@inheritDoc} */
    @Override
    public Document getOwnerDocument() {
        return doc.getOwnerDocument();
    }

    /** {@inheritDoc} */
    @Override
    public Node getParentNode() {
        return doc.getParentNode();
    }

    /** {@inheritDoc} */
    @Override
    public String getPrefix() {
        return doc.getPrefix();
    }

    /** {@inheritDoc} */
    @Override
    public Node getPreviousSibling() {
        return doc.getPreviousSibling();
    }

    /** {@inheritDoc} */
    @Override
    public String getTextContent() {
        return doc.getTextContent();
    }

    /** {@inheritDoc} */
    @Override
    public Object getUserData(final String key) {
        return doc.getUserData(key);
    }

    /** {@inheritDoc} */
    @Override
    public boolean hasChildNodes() {
        return doc.hasChildNodes();
    }

    /** {@inheritDoc} */
    @Override
    public Node insertBefore(final Node newChild, final Node refChild) {
        return doc.insertBefore(newChild, refChild);
    }

    /** {@inheritDoc} */
    @Override
    public boolean isDefaultNamespace(final String namespaceURI) {
        return doc.isDefaultNamespace(namespaceURI);
    }

    /** {@inheritDoc} */
    @Override
    public boolean isEqualNode(final Node arg) {
        return doc.isEqualNode(arg);
    }

    /** {@inheritDoc} */
    @Override
    public boolean isSameNode(final Node other) {
        return doc.isSameNode(other);
    }

    /** {@inheritDoc} */
    @Override
    public String lookupNamespaceURI(final String prefix) {
        return doc.lookupNamespaceURI(prefix);
    }

    /** {@inheritDoc} */
    @Override
    public String lookupPrefix(final String namespaceURI) {
        return doc.lookupPrefix(namespaceURI);
    }

    /** {@inheritDoc} */
    @Override
    public void normalize() {
        doc.normalize();
    }

    /** {@inheritDoc} */
    @Override
    public Node removeChild(final Node oldChild) {
        return doc.removeChild(oldChild);
    }

    /** {@inheritDoc} */
    @Override
    public Node replaceChild(final Node newChild, final Node oldChild) {
        return doc.replaceChild(newChild, oldChild);
    }

    @Override
    public NamedNodeMap getAttributes() {
        return null;
    }

    /** {@inheritDoc} */
    @Override
    public void setNodeValue(final String nodeValue) {
        doc.setNodeValue(nodeValue);
    }

    /** {@inheritDoc} */
    @Override
    public void setPrefix(final String prefix) {
        doc.setPrefix(prefix);
    }

    /** {@inheritDoc} */
    @Override
    public void setTextContent(final String textContent) {
        doc.setTextContent(textContent);
    }

    /** {@inheritDoc} */
    @Override
    public Object setUserData(final String key, final Object data, final UserDataHandler handler) {
        return doc.setUserData(key, data, handler);
    }

    /** {@inheritDoc} */
    @Override
    public Node adoptNode(final Node source) {
        return doc.adoptNode(source);
    }

    @Override
    public EntityReference createEntityReference(final String ent1) {
        return doc.createEntityReference(ent1);
    }

    @Override
    public Node renameNode(final Node node, final String namespaceURI, final String qualifiedName) {
        return doc.renameNode(node, namespaceURI, qualifiedName);
    }

    /** {@inheritDoc} */
    @Override
    public Attr createAttribute(final String name) {
        return doc.createAttribute(name);
    }

    /** {@inheritDoc} */
    @Override
    public Attr createAttributeNS(final String namespaceURI, final String qualifiedName) {
        return doc.createAttributeNS(namespaceURI, qualifiedName);
    }

    /** {@inheritDoc} */
    @Override
    public CDATASection createCDATASection(final String data) {
        return doc.createCDATASection(data);
    }

    /** {@inheritDoc} */
    @Override
    public Comment createComment(final String data) {
        return doc.createComment(data);
    }

    /** {@inheritDoc} */
    @Override
    public DocumentFragment createDocumentFragment() {
        return doc.createDocumentFragment();
    }

    /** {@inheritDoc} */
    @Override
    public Element createElement(final String tagName) {
        return doc.createElement(tagName);
    }

    /** {@inheritDoc} */
    @Override
    public Element createElementNS(final String namespaceURI, final String qualifiedName) {
        return doc.createElementNS(namespaceURI, qualifiedName);
    }

    /** {@inheritDoc} */
    @Override
    public ProcessingInstruction createProcessingInstruction(final String target, final String data) {
        return doc.createProcessingInstruction(target, data);
    }

    /** {@inheritDoc} */
    @Override
    public Text createTextNode(final String data) {
        return doc.createTextNode(data);
    }

    /** {@inheritDoc} */
    @Override
    public DocumentType getDoctype() {
        return doc.getDoctype();
    }

    /** {@inheritDoc} */
    @Override
    public Element getDocumentElement() {
        return doc.getDocumentElement();
    }

    /** {@inheritDoc} */
    @Override
    public String getDocumentURI() {
        return doc.getDocumentURI();
    }

    /** {@inheritDoc} */
    @Override
    public DOMConfiguration getDomConfig() {
        return doc.getDomConfig();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getElementsByTagNameNS(final String namespaceURI, final String localName) {
        return doc.getElementsByTagNameNS(namespaceURI, localName);
    }

    /** {@inheritDoc} */
    @Override
    public DOMImplementation getImplementation() {
        return doc.getImplementation();
    }

    /** {@inheritDoc} */
    @Override
    public String getInputEncoding() {

        return doc.getInputEncoding();
    }

    /** {@inheritDoc} */
    @Override
    public boolean getStrictErrorChecking() {
        return doc.getStrictErrorChecking();
    }

    /** {@inheritDoc} */
    @Override
    public String getXmlEncoding() {

        return doc.getXmlEncoding();
    }

    /** {@inheritDoc} */
    @Override
    public boolean getXmlStandalone() {
        return doc.getXmlStandalone();
    }

    /** {@inheritDoc} */
    @Override
    public String getXmlVersion() {
        return doc.getXmlVersion();
    }

    /** {@inheritDoc} */
    @Override
    public Node importNode(final Node importedNode, final boolean deep) {
        return doc.importNode(importedNode, deep);
    }

    /** {@inheritDoc} */
    @Override
    public void normalizeDocument() {
        doc.normalizeDocument();
    }

    /** {@inheritDoc} */
    @Override
    public void setDocumentURI(final String documentURI) {
        doc.setDocumentURI(documentURI);
    }

    /** {@inheritDoc} */
    @Override
    public void setStrictErrorChecking(final boolean strictErrorChecking) {
        doc.setStrictErrorChecking(strictErrorChecking);
    }

    /** {@inheritDoc} */
    @Override
    public void setXmlStandalone(final boolean xmlStandalone) {
        doc.setXmlStandalone(xmlStandalone);
    }

    /** {@inheritDoc} */
    @Override
    public void setXmlVersion(final String xmlVersion) {
        doc.setXmlVersion(xmlVersion);
    }

    /** {@inheritDoc} */
    @Override
    public boolean isIsConnected() {

        return doc.isIsConnected();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLElement getParentElement() {

        return doc.getParentElement();
    }

    /** {@inheritDoc} */
    @Override
    public Node getRootNode() {

        return doc.getRootNode();
    }

    /** {@inheritDoc} */
    @Override
    public Node cloneNode() {

        return doc.cloneNode();
    }

    @Override
    public void setOwnerDocument(final Document document) {
        doc.setOwnerDocument(document);
    }

    /** {@inheritDoc} */
    @Override
    public boolean contains(final Node other) {

        return doc.contains(other);
    }

    /** {@inheritDoc} */
    @Override
    public void addEventListener(final String type, final Function listener) {
        doc.addEventListener(type, listener);
    }

    /** {@inheritDoc} */
    @Override
    public void addEventListener(final String type, final Function listener, final boolean useCapture) {
        doc.addEventListener(type, listener, useCapture);
    }

    /** {@inheritDoc} */
    @Override
    public void removeEventListener(final String type, final Function listener) {
        doc.removeEventListener(type, listener);
    }

    /** {@inheritDoc} */
    @Override
    public void removeEventListener(final String type, final Function listener, final boolean useCapture) {
        doc.removeEventListener(type, listener, useCapture);
    }

    /** {@inheritDoc} */
    @Override
    public boolean dispatchEvent(final Node element, final Event evt) {

        return doc.dispatchEvent(element, evt);
    }

    @Override
    public boolean dispatchEvent(final Event evt) throws EventException {
        return doc.dispatchEvent(evt);
    }

    /** {@inheritDoc} */
    @Override
    public int getChildElementCount() {

        return doc.getChildElementCount();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getChildren() {

        return doc.getChildren();
    }

    /** {@inheritDoc} */
    @Override
    public Element getFirstElementChild() {

        return doc.getFirstElementChild();
    }

    /** {@inheritDoc} */
    @Override
    public Element getLastElementChild() {

        return doc.getLastElementChild();
    }

    /** {@inheritDoc} */
    @Override
    public Element querySelector(final String selectors) {

        return doc.querySelector(selectors);
    }

    /** {@inheritDoc} */
    @Override
    public NodeList querySelectorAll(final String selectors) {

        return doc.querySelectorAll(selectors);
    }

    /** {@inheritDoc} */
    @Override
    public String getURL() {

        return doc.getURL();
    }

    /** {@inheritDoc} */
    @Override
    public Element getActiveElement() {

        return doc.getActiveElement();
    }

    /** {@inheritDoc} */
    @Override
    public String getAlinkColor() {

        return doc.getAlinkColor();
    }

    /** {@inheritDoc} */
    @Override
    public void setAlinkColor(final String alinkColor) {
        doc.setAlinkColor(alinkColor);
    }

    /** {@inheritDoc} */
    @Override
    public HTMLAllCollection getall() {
        return doc.getall();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getAnchors() {

        return doc.getAnchors();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getApplets() {

        return doc.getApplets();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getCommands() {

        return doc.getCommands();
    }

    /** {@inheritDoc} */
    @Override
    public String getBgColor() {

        return doc.getBgColor();
    }

    /** {@inheritDoc} */
    @Override
    public void setBgColor(final String bgColor) {
        doc.setBgColor(bgColor);
    }

    /** {@inheritDoc} */
    @Override
    public HTMLElement getBody() {

        return doc.getBody();
    }

    /** {@inheritDoc} */
    @Override
    public void setBody(final HTMLElement body) {
        doc.setBody(body);
    }

    /** {@inheritDoc} */
    @Override
    public String getCharacterSet() {

        return doc.getCharacterSet();
    }

    /** {@inheritDoc} */
    @Override
    public String getCharset() {

        return doc.getCharset();
    }

    /** {@inheritDoc} */
    @Override
    public String getCompatMode() {

        return doc.getCompatMode();
    }

    /** {@inheritDoc} */
    @Override
    public String getContentType() {

        return doc.getContentType();
    }

    /** {@inheritDoc} */
    @Override
    public String getCookie() {

        return doc.getCookie();
    }

    /** {@inheritDoc} */
    @Override
    public void setCookie(final String cookie) {
        doc.setCookie(cookie);
    }

    /** {@inheritDoc} */
    @Override
    public HTMLScriptElement getCurrentScript() {

        return doc.getCurrentScript();
    }

    /** {@inheritDoc} */
    @Override
    public Window getDefaultView() {
        return doc.getDefaultView();
    }

    /** {@inheritDoc} */
    @Override
    public String getDesignMode() {

        return doc.getDesignMode();
    }

    /** {@inheritDoc} */
    @Override
    public void setDesignMode(final String designMode) {
        doc.setDesignMode(designMode);
    }

    /** {@inheritDoc} */
    @Override
    public String getDir() {

        return doc.getDesignMode();
    }

    /** {@inheritDoc} */
    @Override
    public void setDir(final String dir) {
        doc.setDir(dir);
    }

    /** {@inheritDoc} */
    @Override
    public String getDomain() {

        return doc.getDomain();
    }

    /** {@inheritDoc} */
    @Override
    public void setDomain(final String domain) {
        doc.setDomain(domain);
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getEmbeds() {

        return doc.getEmbeds();
    }

    /** {@inheritDoc} */
    @Override
    public String getFgColor() {

        return doc.getFgColor();
    }

    /** {@inheritDoc} */
    @Override
    public void setFgColor(final String fgColor) {
        doc.setFgColor(fgColor);
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getForms() {

        return doc.getForms();
    }

    /** {@inheritDoc} */
    @Override
    public boolean isFullscreen() {

        return doc.isFullscreen();
    }

    /** {@inheritDoc} */
    @Override
    public boolean isFullscreenEnabled() {

        return doc.isFullscreenEnabled();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLHeadElement getHead() {

        return doc.getHead();
    }

    /** {@inheritDoc} */
    @Override
    public boolean isHidden() {

        return doc.isHidden();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getImages() {

        return doc.getImages();
    }

    /** {@inheritDoc} */
    @Override
    public String getLastModified() {

        return doc.getLastModified();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getLinks() {

        return doc.getLinks();
    }

    /** {@inheritDoc} */
    @Override
    public Location getLocation() {

        return doc.getLocation();
    }

    /** {@inheritDoc} */
    @Override
    public void setLocation(final Location location) {
        doc.setLocation(location);
    }

    /** {@inheritDoc} */
    @Override
    public String getOrigin() {

        return doc.getOrigin();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getPlugins() {

        return doc.getPlugins();
    }

    /** {@inheritDoc} */
    @Override
    public DocumentReadyState getReadyState() {

        return doc.getReadyState();
    }

    /** {@inheritDoc} */
    @Override
    public String getReferrer() {

        return doc.getReferrer();
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getScripts() {

        return doc.getScripts();
    }

    /** {@inheritDoc} */
    @Override
    public Element getScrollingElement() {

        return doc.getScrollingElement();
    }

    /** {@inheritDoc} */
    @Override
    public String getTitle() {

        return doc.getTitle();
    }

    /** {@inheritDoc} */
    @Override
    public void setTitle(final String title) {
        doc.setTitle(title);
    }

    /** {@inheritDoc} */
    @Override
    public VisibilityState getVisibilityState() {

        return doc.getVisibilityState();
    }

    /** {@inheritDoc} */
    @Override
    public void captureEvents() {
        doc.captureEvents();
    }

    /** {@inheritDoc} */
    @Override
    public Range caretRangeFromPoint(final double x, final double y) {

        return doc.caretRangeFromPoint(x, y);
    }

    /** {@inheritDoc} */
    @Override
    public void clear() {
        doc.clear();

    }

    /** {@inheritDoc} */
    @Override
    public void close() {
        doc.close();

    }

    /** {@inheritDoc} */
    @Override
    public Element createElementNS(final String namespace, final String qualifiedName, final String options) {

        return doc.createElementNS(namespace, qualifiedName, options);
    }

    /** {@inheritDoc} */
    @Override
    public Event createEvent(final String eventInterface) {

        return doc.createEvent(eventInterface);
    }

    /** {@inheritDoc} */
    @Override
    public NodeIterator createNodeIterator(final Node root) throws DOMException {
        return doc.createNodeIterator(root);
    }

    /** {@inheritDoc} */
    @Override
    public NodeIterator createNodeIterator(final Node root, final int whatToShow) throws DOMException {
        return doc.createNodeIterator(root, whatToShow);
    }

    /** {@inheritDoc} */
    @Override
    public NodeIterator createNodeIterator(final Node root, final NodeFilter filter) throws DOMException {
        return doc.createNodeIterator(root, filter);
    }

    /** {@inheritDoc} */
    @Override
    public NodeIterator createNodeIterator(final Node root, final int whatToShow, final NodeFilter filter) throws DOMException {
        return doc.createNodeIterator(root, whatToShow, filter);
    }

    /** {@inheritDoc} */
    @Override
    public Range createRange() {
        return doc.createRange();
    }

    /** {@inheritDoc} */
    @Override
    public TreeWalker createTreeWalker(final Node root) throws DOMException {
        return doc.createTreeWalker(root);
    }

    /** {@inheritDoc} */
    @Override
    public TreeWalker createTreeWalker(final Node root, final int whatToShow) throws DOMException {
        return doc.createTreeWalker(root, whatToShow);
    }

    /** {@inheritDoc} */
    @Override
    public TreeWalker createTreeWalker(final Node root, final NodeFilter filter) throws DOMException {
        return doc.createTreeWalker(root, filter);
    }

    @Override
    public TreeWalker createTreeWalker(final Node root, final int whatToShow, final NodeFilter filter) throws DOMException {
        return new TreeWalkerImpl(root, whatToShow, filter);
    }

    /** {@inheritDoc} */
    @Override
    public Element elementFromPoint(final double x, final double y) {
        return doc.elementFromPoint(x, y);
    }

    /** {@inheritDoc} */
    @Override
    public boolean execCommand(final String commandId, final boolean showUI, final String value) {
        return doc.execCommand(commandId, showUI, value);
    }

    /** {@inheritDoc} */
    @Override
    public boolean execCommand(final String commandId, final boolean showUI) {
        return doc.execCommand(commandId, showUI);
    }

    /** {@inheritDoc} */
    @Override
    public boolean execCommand(final String commandId) {
        return doc.execCommand(commandId);
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getElementsByClassName(final String classNames) {
        return doc.getElementsByClassName(classNames);
    }

    /** {@inheritDoc} */
    @Override
    public HTMLCollection getElementsByName(final String elementName) {
        return doc.getElementsByName(elementName);
    }

    /** {@inheritDoc} */
    @Override
    public Selection getSelection() {
        return doc.getSelection();
    }

    /** {@inheritDoc} */
    @Override
    public boolean hasFocus() {
        return doc.hasFocus();
    }

    /** {@inheritDoc} */
    @Override
    public Document open(final String url, final String name, final String features, final boolean replace) {
        return doc.open(url, name, features, replace);
    }

    /** {@inheritDoc} */
    @Override
    public Document open(final String url, final String name, final String features) {
        return doc.open(url, name, features);
    }

    /** {@inheritDoc} */
    @Override
    public Document open(final String url, final String name) {
        return doc.open(url, name);
    }

    /** {@inheritDoc} */
    @Override
    public Document open(final String url) {
        return doc.open(url);
    }

    /** {@inheritDoc} */
    @Override
    public Document open() {
        return doc.open();
    }

    /** {@inheritDoc} */
    @Override
    public boolean queryCommandEnabled(final String commandId) {
        return doc.queryCommandEnabled(commandId);
    }

    /** {@inheritDoc} */
    @Override
    public boolean queryCommandIndeterm(final String commandId) {
        return doc.queryCommandIndeterm(commandId);
    }

    /** {@inheritDoc} */
    @Override
    public boolean queryCommandState(final String commandId) {
        return doc.queryCommandState(commandId);
    }

    /** {@inheritDoc} */
    @Override
    public boolean queryCommandSupported(final String commandId) {
        return doc.queryCommandSupported(commandId);
    }

    /** {@inheritDoc} */
    @Override
    public String queryCommandValue(final String commandId) {
        return doc.queryCommandValue(commandId);
    }

    /** {@inheritDoc} */
    @Override
    public void releaseEvents() {
        doc.releaseEvents();

    }

    /** {@inheritDoc} */
    @Override
    public void write(final String text) {
        doc.write(text);

    }

    /** {@inheritDoc} */
    @Override
    public void writeln(final String text) {
        doc.writeln(text);

    }

    /** {@inheritDoc} */
    @Override
    public XPathExpression createExpression() {

        return doc.createExpression();
    }

    /** {@inheritDoc} */
    @Override
    public XPathNSResolver createNSResolver(final Node nodeResolver) {
        return doc.createNSResolver(nodeResolver);
    }

    /** {@inheritDoc} */
    @Override
    public XPathResult evaluate(final String expression, final Node contextNode, final XPathNSResolver resolver, final short type,
                                final Object result) {
        return doc.evaluate(expression, contextNode, resolver, type, result);
    }

    @Override
    public boolean isXml() {
        return doc.isXml();
    }

    @Override
    public void setXml(final boolean xml) {
        doc.setXml(xml);
    }

    /** {@inheritDoc} */
    @Override
    public String toString() {
        return "[object XMLDocument]";
    }
}