Package org.allcolor.xml.parser

Source Code of org.allcolor.xml.parser.CDomHandler$contentHandler

/*
* Copyright (C) 2005 by Quentin Anciaux
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
* for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; if not, write to the Free Software Foundation,
* Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*  @author Quentin Anciaux
*/
package org.allcolor.xml.parser;

import org.allcolor.dtd.parser.CDTDParser;
import org.allcolor.dtd.parser.CDocType;

import org.allcolor.xml.parser.dom.CAttr;
import org.allcolor.xml.parser.dom.CCDATASection;
import org.allcolor.xml.parser.dom.CComment;
import org.allcolor.xml.parser.dom.ADocument;
import org.allcolor.xml.parser.dom.CElement;
import org.allcolor.xml.parser.dom.CEntityCoDec;
import org.allcolor.xml.parser.dom.CEntityReference;
import org.allcolor.xml.parser.dom.CNamedNodeMap;
import org.allcolor.xml.parser.dom.CNodeList;
import org.allcolor.xml.parser.dom.CProcessingInstruction;
import org.allcolor.xml.parser.dom.CText;
import org.allcolor.xml.parser.dom.ANode.CNamespace;
import org.jaxen.XPath;
import org.jaxen.dom.DOMXPath;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.ext.DefaultHandler2;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

import java.net.URL;
import java.net.URLConnection;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
* DOCUMENT ME!
*
* @author Quentin Anciaux
* @author Jarle H. Næss- Patch quoted in code
*/
public class CDomHandler implements IParseHandler {
    /** DOCUMENT ME! */
    public final static String CASE_INSENSITIVE = "http://www.allcolor.org/xml/caseinsensitive/";

    /** DOCUMENT ME! */
    public final static String STRICT_MODE = "http://www.allcolor.org/xml/strictmode/";

    /** DOCUMENT ME! */
    public final static String VALIDATE = "http://www.allcolor.org/xml/validate/";

    /** DOCUMENT ME! */
    ADocument document = null;

    /** DOCUMENT ME! */
    private CXmlParser parser = null;

    /** DOCUMENT ME! */
    private final DOMImplementation impl;

    /** DOCUMENT ME! */
    private CElement currentElement = null;

    /** DOCUMENT ME! */
    private String documentURI = null;

    /** DOCUMENT ME! */
    private ThreadLocal localParser = new ThreadLocal();

    /** DOCUMENT ME! */
    private boolean XIncludeAware = false;

    /** DOCUMENT ME! */
    private boolean coalescing = false;

    /** DOCUMENT ME! */
    private boolean expandEntity = true;

    /** DOCUMENT ME! */
    private boolean firstTag = true;

    /** DOCUMENT ME! */
    private boolean ignoringComments = false;

    /** DOCUMENT ME! */
    private boolean ignoringElementContentWhitespace = false;

    /** DOCUMENT ME! */
    private int inXInclude = 0;

    /** DOCUMENT ME! */
    private int xiFallbackFlag = 0;

    /** DOCUMENT ME! */
    private boolean autodoctype = false;
   
    private boolean ignoreDTD = false;

    /**
         * Creates a new CDomHandler object.
         *
         * @param features
         *                DOCUMENT ME!
         */
    public CDomHandler(final Map features) {
  Map implFeatures = new HashMap(0);
  if (features.containsKey(CDomImplementation.PARSER_HTML))
      implFeatures.put(CDomImplementation.PARSER_HTML, "" + true);
  this.impl = new CDomImplementation(implFeatures);
  boolean caseInsensitive = (features != null) ? (features
    .get(CASE_INSENSITIVE) != null) : false;
  parser = new CXmlParser(caseInsensitive, this);
    } // end CDomHandler()

    private boolean isValidChild(final String elemName, final CElement elem) {
  try {
      IHtmlValidChild parent = (IHtmlValidChild) elem;
      return parent.isValidChild(elemName);
  } // end try
  catch (final Throwable ignore) {
      final Throwable t = ignore;
      if (t.getClass() == ThreadDeath.class) {
    throw (ThreadDeath) t;
      }
      Throwable cause = ignore.getCause();
      while (cause != null) {
    if (cause.getClass() == ThreadDeath.class) {
        throw (ThreadDeath) cause;
    }
    cause = cause.getCause();
      }
  }

  return true;
    } // end isValidChild()

    /**
         * DOCUMENT ME!
         *
         * @param coalescing
         *                DOCUMENT ME!
         */
    public final void setCoalescing(final boolean coalescing) {
  this.coalescing = coalescing;
    } // end setCoalescing()

    /**
         * DOCUMENT ME!
         *
         * @return DOCUMENT ME!
         */
    public DOMImplementation getDOMImplementation() {
  return impl;
    } // end getDOMImplementation()

    /**
         * DOCUMENT ME!
         *
         * @param in
         *                DOCUMENT ME!
         * @param documentURI
         *                DOCUMENT ME!
         *
         * @return DOCUMENT ME!
         */
    public Document getDocument(final Reader in, String documentURI) {
  try {
      if (documentURI != null) {
    if (documentURI.lastIndexOf("/") != -1) {
        documentURI = documentURI.substring(0, documentURI
          .lastIndexOf("/") + 1);
    }

    this.documentURI = documentURI;
      } // end if
      else {
    this.documentURI = null;
      } // end else

      parser.parse(in);

      if (isIgnoringElementContentWhitespace())
    document.normalize();
      document.setBuildStageDone();

      return document;
  } // end try
  finally {
      try {
    in.close();
      } // end try
      catch (final Exception ignore) {
      }
      localParser.set(null);
      currentElement = null;
  } // end finally
    } // end getDocument()

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#documentEnd(org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param handler
         *                DOCUMENT ME!
         */
    public void documentEnd() {
  currentElement = document;
  // document.addXSDDefault();
    } // end documentEnd()

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#documentStart(org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param handler
         *                DOCUMENT ME!
         */
    public void documentStart() {
  document = (ADocument) impl.createDocument(null, null, null);
  document.setBuildStage();
  document.setDocumentURI(this.documentURI);
  document.setInputEncoding(encoding);
  currentElement = document;
  firstTag = true;
    } // end documentStart()

    /**
         * DOCUMENT ME!
         *
         * @return DOCUMENT ME!
         */
    public final boolean isCoalescing() {
  return coalescing;
    } // end isCoalescing()

    /**
         * DOCUMENT ME!
         *
         * @param expandEntity
         *                DOCUMENT ME!
         */
    public final void setExpandEntity(final boolean expandEntity) {
  this.expandEntity = expandEntity;
    } // end setExpandEntity()

    /**
         * DOCUMENT ME!
         *
         * @return DOCUMENT ME!
         */
    public final boolean isExpandEntity() {
  return expandEntity;
    } // end isExpandEntity()

    /**
         * DOCUMENT ME!
         *
         * @param ignoringComments
         *                DOCUMENT ME!
         */
    public final void setIgnoringComments(final boolean ignoringComments) {
  this.ignoringComments = ignoringComments;
    } // end setIgnoringComments()

    /**
         * DOCUMENT ME!
         *
         * @return DOCUMENT ME!
         */
    public final boolean isIgnoringComments() {
  return ignoringComments;
    } // end isIgnoringComments()

    /**
         * DOCUMENT ME!
         *
         * @param ignoringElementContentWhitespace
         *                DOCUMENT ME!
         */
    public final void setIgnoringElementContentWhitespace(
      final boolean ignoringElementContentWhitespace) {
  this.ignoringElementContentWhitespace = ignoringElementContentWhitespace;
    } // end setIgnoringElementContentWhitespace()

    /**
         * DOCUMENT ME!
         *
         * @return DOCUMENT ME!
         */
    public final boolean isIgnoringElementContentWhitespace() {
  return ignoringElementContentWhitespace;
    } // end isIgnoringElementContentWhitespace()

    /**
         * DOCUMENT ME!
         *
         * @param includeAware
         *                DOCUMENT ME!
         */
    public final void setXIncludeAware(final boolean includeAware) {
  XIncludeAware = includeAware;
    } // end setXIncludeAware()

    /**
         * DOCUMENT ME!
         *
         * @return DOCUMENT ME!
         */
    public final boolean isXIncludeAware() {
  return XIncludeAware;
    } // end isXIncludeAware()

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#parseCDATA(java.lang.String,
         *      org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param content
         *                DOCUMENT ME!
         * @param handler
         *                DOCUMENT ME!
         */
    public void parseCDATA(String content) {
  if (XIncludeAware) {
      if (((inXInclude != xiFallbackFlag) || (xiFallbackFlag == 0))
        && (inXInclude > 0)) {
    return;
      }
  } // end if

  if (coalescing) {
      Node n = currentElement.getLastChild();

      if (n.getNodeType() == Node.TEXT_NODE) {
    content = n.getNodeValue() + content;
    currentElement.removeChild(n);
      } // end if

      content = CEntityCoDec.encode(content);
      parseText(content, false);
  } // end if
  else {
      CCDATASection cdata = new CCDATASection(content, document);
      if (currentElement == document) {
    document.appendChildInternal(cdata);
      } else {
    cdata.parentNode = currentElement;
    currentElement.listChild.addItem(cdata);
      }
  } // end else

    } // end parseCDATA()

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#parseComment(java.lang.String,
         *      org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param content
         *                DOCUMENT ME!
         * @param handler
         *                DOCUMENT ME!
         */
    public void parseComment(final String content) {
  if (isIgnoringComments()) {
      return;
  }

  if (XIncludeAware) {
      if (((inXInclude != xiFallbackFlag) || (xiFallbackFlag == 0))
        && (inXInclude > 0)) {
    return;
      }
  } // end if

  CComment c = new CComment(content, document);
  if (currentElement == document) {
      document.appendChildInternal(c);
  } else {
      c.parentNode = currentElement;
      if (currentElement.listChild == null) {
    currentElement.listChild = new CNodeList(false);
      } // end if
      currentElement.listChild.addItem(c);
  }
    } // end parseComment()

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#parseDoctype(java.lang.String,
         *      org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param content
         *                DOCUMENT ME!
         * @param handler
         *                DOCUMENT ME!
         */
    public void parseDoctype(final String content) {
  try {
    if (isIgnoreDTD()) return;
      CDocType docType = CDTDParser.parseDoctype(content, documentURI,
        document);
      docType.setOwnerDocument(document);
      docType.setNodeValue(content);
      document.appendChildInternal(docType);
      document.setDocumentType(docType);

      document
        .setEntityCodec(new CEntityCoDec(docType.getKnownEntities()));
      if ((docType.getPublicId() != null)
        && (docType.getPublicId().indexOf("HTML") != -1)
        && (docType.getPublicId().indexOf("//W3C//DTD ") != -1)) {
    document.setHTMLDocument(true);
      } // end if
      return;
  } // end try
  catch (final Exception ignore) {
  }

    } // end parseDoctype()

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#parseEmptyTag(java.lang.String,
         *      java.util.Collection,
         *      org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param name
         *                DOCUMENT ME!
         * @param attributes
         *                DOCUMENT ME!
         * @param handler
         *                DOCUMENT ME!
         */
    public void parseEmptyTag(final String name, final CAttr[] attributes,
      final int count, final int indexSep) {
  if (XIncludeAware) {
      if (name.endsWith("include")) {
    if (inXInclude == xiFallbackFlag) {
        xiFallbackFlag++;
    }

    inXInclude++;
      } // end if

      if (((inXInclude != xiFallbackFlag) || (xiFallbackFlag == 0))
        && (inXInclude > 0)) {
    if (name.endsWith("include")) {
        inXInclude--;
    } // end if

    return;
      } // end if

      if (name.endsWith("include")) {
    if (inXInclude == xiFallbackFlag) {
        xiFallbackFlag--;
    }

    inXInclude--;
      } // end if
  } // end if

  CElement elem = null;
  if (parser.htmlDocument) {
      elem = document.createElementInternal(name, indexSep);
      if (currentElement != document && elem instanceof IHtmlValidChild) {
    while (!isValidChild(name, currentElement)) {
        parseEndTag(currentElement.name, -1);
        if (currentElement == document)
      break;
    }
      }
  } else {
      elem = new CElement(name, document, indexSep);
  }

  if (firstTag) {
      if (parser.htmlDocument) {
    document.setHTMLDocument(true);
      } // end if
      firstTag = false;
      document.loadXSD(elem);
      if (isAutodoctype() && document.getDoctype() == null) {
    CDocType dt = (CDocType) CXmlParser.dtTr.cloneNode(true);
    document.appendChildInternal(dt);
    document.setDocumentType(dt);
      }
  } // end if

  if (count > 0) {
      if (elem.listAttributes == null) {
    elem.listAttributes = new CNamedNodeMap(elem);
    elem.listAttributes.list = attributes;
    elem.listAttributes.count = count;
    for (int i = 0; i < count; i++) {
        CAttr attr = attributes[i];
        attr.parentNode = elem;
        attr.ownerDocument = document;
        if (attr.name == "xmlns" || attr.prefix == "xmlns") {
      elem.notifyNSChange(attr.localName);
        }
    }
      } else {
    for (int i = 0; i < count; i++) {
        CAttr attr = attributes[i];
        attr.parentNode = elem;
        attr.ownerDocument = document;
        if (attr.name == "xmlns" || attr.prefix == "xmlns") {
      elem.notifyNSChange(attr.localName);
        }
        if (elem.listAttributes == null) {
      elem.listAttributes = new CNamedNodeMap(elem);
        }
        elem.listAttributes.setNamedItemForce(attr);
    } // end for
      }
  }

  if (currentElement == document) {
      document.appendChildInternal(elem);
  } else {
      elem.parentNode = currentElement;
      currentElement.listChild.addItem(elem);
  }

  if (XIncludeAware
    && "http://www.w3.org/2001/XInclude".equals(elem
      .getNamespaceURI())) {
      handleXInclude(elem);

      if (inXInclude > 0) {
    if (name.endsWith("include")) {
        inXInclude--;
    } // end if

    if (name.endsWith("fallback") && (xiFallbackFlag == inXInclude)) {
        xiFallbackFlag--;
    } // end if
      } // end if
  } // end if

    } // end parseEmptyTag()

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#parseEndTag(java.lang.String,
         *      org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param name
         *                DOCUMENT ME!
         * @param handler
         *                DOCUMENT ME!
         */
    public void parseEndTag(final String name, final int indexSep) {
  if (XIncludeAware && (inXInclude > 0)) {
      if (name.endsWith("include")) {
    inXInclude--;
      } // end if

      if (name.endsWith("fallback") && (xiFallbackFlag == inXInclude)) {
    xiFallbackFlag--;
      } // end if
  } // end if

  // if (currentElement.getParentNode() != null)
  if (name.equals(currentElement.name))
      currentElement = (CElement) currentElement.parentNode;
    } // end parseEndTag()

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#parsePI(java.lang.String,
         *      java.lang.String, org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param name
         *                DOCUMENT ME!
         * @param content
         *                DOCUMENT ME!
         * @param handler
         *                DOCUMENT ME!
         */
    public void parsePI(final String name, final String content) {
  if (XIncludeAware) {
      if (((inXInclude != xiFallbackFlag) || (xiFallbackFlag == 0))
        && (inXInclude > 0)) {
    return;
      }
  } // end if

  // Patch by Jarle H. Næss, xml PI must not be in the DOM tree.
  if (!"xml".equals(name)) {
      CProcessingInstruction pi = new CProcessingInstruction(name,
        content, document);
      if (currentElement == document) {
    document.appendChildInternal(pi);
      } else {
    pi.parentNode = currentElement;
    currentElement.listChild.addItem(pi);
      }

  } else if (firstTag && "xml".equals(name)) {
      CStringTokenizer tokenizer = new CStringTokenizer(content,
        "=\"' \t\r\n", false);
      while (tokenizer.hasMoreTokens()) {
    String token = tokenizer.nextToken();
    if ("version".equalsIgnoreCase(token)
      && tokenizer.hasMoreTokens()) {
        document.setXmlVersion(tokenizer.nextToken());
    } else if ("standalone".equalsIgnoreCase(token)
      && tokenizer.hasMoreTokens()) {
        String standalone = tokenizer.nextToken();
        if ("yes".equalsIgnoreCase(standalone)
          || "true".equalsIgnoreCase(standalone))
      document.setXmlStandalone(true);
    } else if ("encoding".equalsIgnoreCase(token)
      && tokenizer.hasMoreTokens()) {
        String encoding = tokenizer.nextToken();
        document.setXmlEncoding(encoding);
    }
      }
  }
    } // end parsePI()

    private String encoding = null;

    public void setEncoding(String encoding) {
  this.encoding = encoding;
    }

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#parseStartTag(java.lang.String,
         *      java.util.Collection,
         *      org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param name
         *                DOCUMENT ME!
         * @param attributes
         *                DOCUMENT ME!
         * @param handler
         *                DOCUMENT ME!
         */
    public void parseStartTag(final String name, final CAttr[] attributes,
      final int count, final int indexSep) {
  if (XIncludeAware) {
      if (name.endsWith("include")) {
    if (inXInclude == xiFallbackFlag) {
        xiFallbackFlag++;
    }

    inXInclude++;
      } // end if

      if (((inXInclude != xiFallbackFlag) || (xiFallbackFlag == 0))
        && (inXInclude > 0)) {
    return;
      } // end if

      if (name.endsWith("include")) {
    if (inXInclude == xiFallbackFlag) {
        xiFallbackFlag--;
    }

    inXInclude--;
      } // end if
  } // end if

  CElement elem = null;
  if (parser.htmlDocument) {
      elem = document.createElementInternal(name, indexSep);
      if (currentElement != document && elem instanceof IHtmlValidChild) {
    while (!isValidChild(name, currentElement)) {
        parseEndTag(currentElement.name, -1);
        if (currentElement == document)
      break;
    }
      }
  } else {
      elem = new CElement(name, document, indexSep);
  }
  elem.listChild = new CNodeList(false);

  if (firstTag) {
      if (parser.htmlDocument) {
    document.setHTMLDocument(true);
      } // end if
      firstTag = false;
      document.loadXSD(elem);
      if (isAutodoctype() && document.getDoctype() == null) {
    CDocType dt = (CDocType) CXmlParser.dtTr.cloneNode(true);
    document.appendChildInternal(dt);
    document.setDocumentType(dt);
      }
  } // end if

  if (count > 0) {
      if (elem.listAttributes == null) {
    elem.listAttributes = new CNamedNodeMap(elem);
    elem.listAttributes.list = attributes;
    elem.listAttributes.count = count;
    for (int i = 0; i < count; i++) {
        CAttr attr = attributes[i];
        attr.parentNode = elem;
        attr.ownerDocument = document;
        if (attr.name == "xmlns" || attr.prefix == "xmlns") {
      elem.notifyNSChange(attr.localName);
        }
    }
      } else {
    for (int i = 0; i < count; i++) {
        CAttr attr = attributes[i];
        attr.parentNode = elem;
        attr.ownerDocument = document;
        if (attr.name == "xmlns" || attr.prefix == "xmlns") {
      elem.notifyNSChange(attr.localName);
        }
        if (elem.listAttributes == null) {
      elem.listAttributes = new CNamedNodeMap(elem);
        }
        elem.listAttributes.setNamedItemForce(attr);
    } // end for
      }
  }

  if (currentElement == document) {
      document.appendChildInternal(elem);
  } else {
      elem.parentNode = currentElement;
      currentElement.listChild.addItem(elem);
  }

  if (XIncludeAware
    && "http://www.w3.org/2001/XInclude".equals(elem
      .getNamespaceURI())) {
      handleXInclude(elem);
  } // end if
  else {
      if (parser.htmlDocument && elem instanceof IHtmlValidChild) {
    if (((IHtmlValidChild) elem).canHaveChild()) {
        currentElement = elem;
    }
      } // end if
      else {
    currentElement = elem;
      } // end else
  } // end else

    } // end parseStartTag()

    /*
         * (non-Javadoc)
         *
         * @see org.allcolor.xml.parser.IParseHandler#parseText(java.lang.String,
         *      org.allcolor.xml.parser.IParseErrorHandler)
         */
    /**
         * DOCUMENT ME!
         *
         * @param content
         *                DOCUMENT ME!
         * @param handler
         *                DOCUMENT ME!
         */
    public void parseText(final String content, final boolean decode) {
  if (XIncludeAware) {
      if (((inXInclude != xiFallbackFlag) || (xiFallbackFlag == 0))
        && (inXInclude > 0)) {
    return;
      }
  } // end if
  if (content.length() == 0)
      return;
  if (!decode) {
      CText text = new CText(content, document);
      if (currentElement == document) {
    document.appendChildInternal(text);
      } else {
    text.parentNode = currentElement;
    currentElement.listChild.addItem(text);
      }
      return;
  }
  contentHandler h = new contentHandler(currentElement, document, this);
  CEntityCoDec codec = document.getEntityCodec();
  codec.decodeInternal(content, h, null, null, true);
    } // end parseText()

    /**
         * DOCUMENT ME!
         *
         * @param elem
         *                DOCUMENT ME!
         */
    private void handleXInclude(final Element elem) {
  currentElement.removeChild(elem);

  if ("include".equals(elem.getLocalName())) {
      inXInclude++;

      String href = elem.getAttribute("href");

      if ((href == null) || "".equals(href.trim())) {
    href = null;
      }

      String parse = elem.getAttribute("parse");

      if ((parse == null) || "".equals(parse.trim())) {
    parse = "xml";
      }

      String xpointer = elem.getAttribute("xpointer");

      if ((xpointer == null) || "".equals(xpointer.trim())) {
    xpointer = null;
      }

      String encoding = elem.getAttribute("encoding");

      if ((encoding == null) || "".equals(encoding.trim())) {
    encoding = null;
      }

      String accept = elem.getAttribute("accept");

      if ((accept == null) || "".equals(accept.trim())) {
    accept = null;
      }

      String accept_language = elem.getAttribute("accept-language");

      if ((accept_language == null) || "".equals(accept_language.trim())) {
    accept_language = null;
      }

      if (href != null) {
    if (href.indexOf(":/") == -1) {
        if (href.startsWith("/")) {
      href = href.substring(1);
        }

        href = documentURI + href;
    } // end if

    if (localParser.get() == null) {
        localParser.set(new CShaniDomParser());
    } // end if

    CShaniDomParser p = (CShaniDomParser) localParser.get();
    InputStream in = null;

    try {
        URL url = new URL(href);
        URLConnection connection = url.openConnection();

        // only 1.5
        // connection.setReadTimeout(5000);
        if (accept != null) {
      connection.addRequestProperty("Accept", accept);
        }

        if (accept_language != null) {
      connection.addRequestProperty("Accept-Language",
        accept_language);
        }

        in = connection.getInputStream();

        ADocument doc = null;

        if (encoding != null) {
      doc = (ADocument)p.parse(new InputStreamReader(in, encoding));
        } // end if
        else {
      doc = (ADocument)p.parse(in);
        } // end else

        if (xpointer == null) {
          currentElement.appendChild(doc.getDocumentElement());
        } // end if
        else {
        // HANDLE XPOINTER (as XPATH with JAXEN)
          XPath xpath = new DOMXPath(xpointer);
          for (Iterator it = doc.getNamespaceList().iterator();it.hasNext();) {
            CNamespace ns = (CNamespace)it.next();
            xpath.addNamespace(ns.getPrefix() == null ? "" : ns.getPrefix(), ns.getNamespaceURI());
          }
          List result = xpath.selectNodes(doc.getDocumentElement());
          for (final Iterator it = result.iterator();it.hasNext();) {
            final Node node = (Node)it.next();
            currentElement.appendChild(node);
          }
        } // end else
    } // end try
    catch (final Exception e) {
        xiFallbackFlag++;
    } // end catch
    finally {
        try {
      in.close();
      in = null;
        } // end try
        catch (final Exception ignore) {
        }
    } // end finally
      } // end if
  } // end if
    } // end handleXInclude()

    /**
         * DOCUMENT ME!
         *
         * @author $author$
         * @version $Revision: 1.47 $
         */
    private static class contentHandler extends DefaultHandler2 {
  /** DOCUMENT ME! */
  ADocument document;

  /** DOCUMENT ME! */
  CDomHandler dh;

  /** DOCUMENT ME! */
  CElement currentElement;

  /**
         * Creates a new contentHandler object.
         *
         * @param currentElement
         *                DOCUMENT ME!
         * @param document
         *                DOCUMENT ME!
         * @param dh
         *                DOCUMENT ME!
         */
  public contentHandler(final CElement currentElement,
    final ADocument document, final CDomHandler dh) {
      this.currentElement = currentElement;
      this.document = document;
      this.dh = dh;
  } // end contentHandler()

  /**
         * DOCUMENT ME!
         *
         * @param locator
         *                DOCUMENT ME!
         */
  public void setDocumentLocator(final Locator locator) {
  }

  /**
         * DOCUMENT ME!
         *
         * @param ch
         *                DOCUMENT ME!
         * @param start
         *                DOCUMENT ME!
         * @param length
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void characters(final char ch[], final int start,
    final int length) throws SAXException {
      if (currentElement.getNodeType() != Node.ENTITY_REFERENCE_NODE) {
    String value = new String(ch, start, length);
    CText text = new CText(value, document);
    if (currentElement == document) {
        document.appendChildInternal(text);
    } else {
        text.parentNode = currentElement;
        if (currentElement.listChild == null) {
      currentElement.listChild = new CNodeList(false);
        } // end if
        currentElement.listChild.addItem(text);
    }
      }
  } // end characters()

  /**
         * DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void endDocument() throws SAXException {
  }

  /**
         * DOCUMENT ME!
         *
         * @param uri
         *                DOCUMENT ME!
         * @param localName
         *                DOCUMENT ME!
         * @param qName
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void endElement(final String uri, final String localName,
    final String qName) throws SAXException {
      if (currentElement.getNodeType() != Node.ENTITY_REFERENCE_NODE) {
    currentElement = (CElement) currentElement.parentNode;
      }
  } // end endElement()

  /**
         * DOCUMENT ME!
         *
         * @param name
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void endEntity(final String name) throws SAXException {
      currentElement = currentElement.parentNode;
  } // end endEntity()

  /**
         * DOCUMENT ME!
         *
         * @param prefix
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void endPrefixMapping(final String prefix) throws SAXException {
  }

  /**
         * DOCUMENT ME!
         *
         * @param ch
         *                DOCUMENT ME!
         * @param start
         *                DOCUMENT ME!
         * @param length
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void ignorableWhitespace(final char ch[], final int start,
    final int length) throws SAXException {
      if (currentElement.getNodeType() != Node.ENTITY_REFERENCE_NODE) {
    if (dh.isIgnoringElementContentWhitespace()) {
        return;
    } // end if

    String value = new String(ch, start, length);
    CText text = new CText(value, document);
    if (currentElement == document) {
        document.appendChildInternal(text);
    } else {
        text.parentNode = currentElement;
        if (currentElement.listChild == null) {
      currentElement.listChild = new CNodeList(false);
        } // end if
        currentElement.listChild.addItem(text);
    }
      }
  } // end ignorableWhitespace()

  /**
         * DOCUMENT ME!
         *
         * @param target
         *                DOCUMENT ME!
         * @param data
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void processingInstruction(final String target, final String data)
    throws SAXException {
      if (currentElement.getNodeType() != Node.ENTITY_REFERENCE_NODE) {
    CProcessingInstruction pi = new CProcessingInstruction(target,
      data, document);
    if (currentElement == document) {
        document.appendChildInternal(pi);
    } else {
        pi.parentNode = currentElement;
        if (currentElement.listChild == null) {
      currentElement.listChild = new CNodeList(false);
        } // end if
        currentElement.listChild.addItem(pi);
    }
      }
  } // end processingInstruction()

  /**
         * DOCUMENT ME!
         *
         * @param name
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void skippedEntity(final String name) throws SAXException {
  }

  /**
         * DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void startDocument() throws SAXException {
  }

  /**
         * DOCUMENT ME!
         *
         * @param uri
         *                DOCUMENT ME!
         * @param localName
         *                DOCUMENT ME!
         * @param qName
         *                DOCUMENT ME!
         * @param atts
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void startElement(final String uri, final String localName,
    final String qName, final Attributes atts) throws SAXException {
      if (currentElement.getNodeType() != Node.ENTITY_REFERENCE_NODE) {
    CElement elem = new CElement(qName, document);

    for (int i = 0; i < atts.getLength(); i++) {
        CAttr attr = new CAttr(atts.getQName(i), atts.getValue(i),
          document, currentElement, true);
        if (currentElement.listAttributes == null) {
      currentElement.listAttributes = new CNamedNodeMap(
        currentElement);
        }
        currentElement.listAttributes.setNamedItemForce(attr);
    } // end for
    if (currentElement == document) {
        document.appendChildInternal(elem);
    } else {
        elem.parentNode = currentElement;
        if (currentElement.listChild == null) {
      currentElement.listChild = new CNodeList(false);
        } // end if
        currentElement.listChild.addItem(elem);
    }
    currentElement = elem;
      }
  } // end startElement()

  /**
         * DOCUMENT ME!
         *
         * @param name
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void startEntity(final String name) throws SAXException {
      CEntityReference ref = new CEntityReference(name, null, document);
      if (currentElement == document) {
    document.appendChildInternal(ref);
      } else {
    ref.parentNode = currentElement;
    if (currentElement.listChild == null) {
        currentElement.listChild = new CNodeList(false);
    } // end if
    currentElement.listChild.addItem(ref);
      }
      currentElement = ref;
  } // end startEntity()

  /**
         * DOCUMENT ME!
         *
         * @param prefix
         *                DOCUMENT ME!
         * @param uri
         *                DOCUMENT ME!
         *
         * @throws SAXException
         *                 DOCUMENT ME!
         */
  public void startPrefixMapping(final String prefix, final String uri)
    throws SAXException {
  }
    } // end contentHandler

    public boolean isAutodoctype() {
  return autodoctype;
    }

    public void setAutodoctype(boolean autodoctype) {
  this.autodoctype = autodoctype;
    }

  public boolean isIgnoreDTD() {
    return ignoreDTD;
  }

  public void setIgnoreDTD(boolean ignoreDTD) {
    this.ignoreDTD = ignoreDTD;
  }
} // end CDomHandler
TOP

Related Classes of org.allcolor.xml.parser.CDomHandler$contentHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.