/******************************************************************************* * Copyright (c) 2006 Oracle 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: * Oracle Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.validator.helpers; import org.xml.sax.SAXException; import org.apache.xerces.parsers.DOMParser; import org.apache.xerces.xni.*; /** * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date Jun 20, 2007 * * This is per // * http://src.opensolaris.org/source/xref/sfw/usr/src/cmd/tomcat/xerces-2_8_0/samples/dom/DOMAddLines.java * */ public class LocationCapturingDOMParser extends DOMParser { protected XMLLocator mLocator; protected int fLineNo = 0; protected int fColumnNo = 0; protected int fOffset = 0; /** * */ @SuppressWarnings({ "nls", "boxing" }) public LocationCapturingDOMParser() { try { // setProperty("http://xml.org/sax/features/namespaces",true); setFeature( "http://apache.org/xml/features/dom/defer-node-expansion", false); setFeature("http://apache.org/xml/features/xinclude", false); } catch (SAXException sax) { // } } void lastSource() { fLineNo = mLocator.getLineNumber(); fColumnNo = mLocator.getColumnNumber(); fOffset = mLocator.getCharacterOffset(); // p(" - lastSource.mark : r={0},c={1},o={2}",fLineNo, // fColumnNo,fOffset ); } /** * @see org.apache.xerces.parsers.AbstractDOMParser#startDocument(org.apache.xerces.xni.XMLLocator, * java.lang.String, org.apache.xerces.xni.NamespaceContext, * org.apache.xerces.xni.Augmentations) */ @Override public void startDocument(XMLLocator arg0, String arg1, NamespaceContext arg2, Augmentations arg3) throws XNIException { mLocator = arg0; super.startDocument(arg0, arg1, arg2, arg3); lastSource(); } /** * @see org.apache.xerces.parsers.AbstractDOMParser#characters(org.apache.xerces.xni.XMLString, * org.apache.xerces.xni.Augmentations) */ @Override public void characters(XMLString arg0, Augmentations arg1) throws XNIException { super.characters(arg0, arg1); lastSource(); } /** * @see org.apache.xerces.parsers.AbstractDOMParser#comment(org.apache.xerces.xni.XMLString, * org.apache.xerces.xni.Augmentations) */ @Override public void comment(XMLString arg0, Augmentations arg1) throws XNIException { super.comment(arg0, arg1); lastSource(); } /** * * @see org.apache.xerces.parsers.AbstractDOMParser#textDecl(java.lang.String, * java.lang.String, org.apache.xerces.xni.Augmentations) */ @Override public void textDecl(String arg0, String arg1, Augmentations arg2) throws XNIException { super.textDecl(arg0, arg1, arg2); lastSource(); } /** * @see org.apache.xerces.parsers.AbstractDOMParser#startElement(org.apache.xerces.xni.QName, * org.apache.xerces.xni.XMLAttributes, * org.apache.xerces.xni.Augmentations) */ @SuppressWarnings( { "nls", "boxing" }) @Override public void startElement(QName arg0, XMLAttributes arg1, Augmentations arg2) throws XNIException { super.startElement(arg0, arg1, arg2); // p("startElement: {0} {1}", arg0,arg1); if (fCurrentNode != null) { // p(" - start.mark: // r={0},c={1},o={2}",fLineNo,fColumnNo,fOffset+1); // start of element fCurrentNode.setUserData("location.line", fLineNo, null); fCurrentNode.setUserData("location.column", fColumnNo, null); fCurrentNode.setUserData("location.charStart", fOffset + 1, null); fCurrentNode.setUserData("location.charEnd", fOffset + arg0.rawname.length() + 1, null); // p(" - end.mark: r={0},c={1},o={2}",mLocator.getLineNumber(), // mLocator.getColumnNumber(),mLocator.getCharacterOffset() ); // end of element fCurrentNode.setUserData("location2.line", mLocator.getLineNumber(), null); fCurrentNode.setUserData("location2.column", mLocator .getColumnNumber(), null); fCurrentNode.setUserData("location2.charStart", mLocator .getCharacterOffset(), null); fCurrentNode.setUserData("location2.charEnd", mLocator .getCharacterOffset(), null); } lastSource(); } /** * @see org.apache.xerces.parsers.AbstractDOMParser#startCDATA(org.apache.xerces.xni.Augmentations) */ @Override public void startCDATA(Augmentations aug) { super.startCDATA(aug); lastSource(); } /** * @see org.apache.xerces.parsers.AbstractDOMParser#endCDATA(org.apache.xerces.xni.Augmentations) */ @Override public void endCDATA(Augmentations aug) { super.endCDATA(aug); lastSource(); } /** * @see org.apache.xerces.parsers.AbstractDOMParser#endElement(org.apache.xerces.xni.QName, * org.apache.xerces.xni.Augmentations) */ @Override public void endElement(QName element, Augmentations aug) { super.endElement(element, aug); // p("endElement: {0}", element); lastSource(); } }