/*******************************************************************************
 * Copyright (c) 2002-2005 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   IBM - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsi.internal.core.xml.dom;

import org.apache.xerces.dom.ElementImpl;
import org.apache.xerces.xni.Augmentations;
import org.apache.xerces.xni.NamespaceContext;
import org.apache.xerces.xni.QName;
import org.apache.xerces.xni.XMLAttributes;
import org.apache.xerces.xni.XMLLocator;
import org.apache.xerces.xni.XNIException;
import org.w3c.dom.Element;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;

/**
 * This class specializes org.apache.xerces.parsers.DOMParser.
 * 
 * @author Peter  Brittenham (peterbr@us.ibm.com)
 * @version 1.0.1
 */
public class DOMParser extends org.apache.xerces.parsers.DOMParser
{
  /**
   * Locator.
   */
  XMLLocator locator = null;

  /* (non-Javadoc)
   * @see org.apache.xerces.xni.XMLDocumentHandler#startDocument(org.apache.xerces.xni.XMLLocator, java.lang.String, org.apache.xerces.xni.NamespaceContext, org.apache.xerces.xni.Augmentations)
   */
  public void startDocument(
    XMLLocator locator,
    String encoding,
    NamespaceContext context,
    Augmentations augs)
    throws XNIException
  {
    this.locator = locator;
    super.startDocument(locator, encoding, context, augs);
  }

  /* (non-Javadoc)
   * @see org.apache.xerces.xni.XMLDocumentHandler#startElement(org.apache.xerces.xni.QName, org.apache.xerces.xni.XMLAttributes, org.apache.xerces.xni.Augmentations)
   */
  public void startElement(
    QName qname,
    XMLAttributes attributes,
    Augmentations augs)
    throws XNIException
  {
    Element element;
    ElementImpl elementImpl;

    // DEBUG:
    //System.err.println("1-line: " + locator.getLineNumber() + ", column: " + locator.getColumnNumber());

    super.startElement(qname, attributes, augs);

    // DEBUG:
    //System.err.println("2-line: " + locator.getLineNumber() + ", column: " + locator.getColumnNumber());    

    try
    {
      element = (Element) getProperty(CURRENT_ELEMENT_NODE);

      elementImpl = (ElementImpl) element;

      elementImpl.setUserData(
        ElementLocation.KEY_NAME,
        (ElementLocation)new ElementLocation(locator.getLineNumber(), locator.getColumnNumber()),
        null);
    }
    catch (ClassCastException cce)
    {
    }
    catch (SAXNotSupportedException snse)
    {
      // DEBUG:
      //System.err.println(snse.toString());
    }
    catch (SAXNotRecognizedException snre)
    {
    }
  }
}
