/** * Copyright (C) 2004 Orbeon, Inc. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU Lesser General Public License as published by the Free Software Foundation; either version * 2.1 of the License, or (at your option) any later version. * * This program 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 Lesser General Public License for more details. * * The full text of the license is available at http://www.gnu.org/copyleft/lesser.html */ package org.orbeon.oxf.transformer.xupdate.dom4j; import org.orbeon.dom4j.Document; import org.orbeon.dom4j.Element; import org.orbeon.dom4j.Node; import org.orbeon.dom4j.io.SAXWriter; import org.orbeon.oxf.xml.dom4j.LocationData; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; public class LocationSAXWriter extends SAXWriter { protected Element curElement; protected boolean locatorSet = false; protected Locator loc = new Locator() { public String getPublicId() { return null; } public String getSystemId() { LocationData locationData = getLocationData(); return locationData == null ? null : locationData.file(); } public int getLineNumber() { LocationData locationData = getLocationData(); return locationData == null ? -1 : locationData.line(); } public int getColumnNumber() { LocationData locationData = getLocationData(); return locationData == null ? -1 : locationData.col(); } private LocationData getLocationData() { if (curElement != null) { Object data = curElement.getData(); return data != null && data instanceof LocationData ? (LocationData) curElement.getData() : null; } else { return null; } } }; protected void documentLocator(Document document) throws SAXException { if (!locatorSet) { locatorSet = true; getContentHandler().setDocumentLocator(loc); } } public void write(Element element) throws SAXException { documentLocator(null); super.write(element); } public void write(Node node) throws SAXException { documentLocator(null); super.write(node); } protected void startElement(Element element, AttributesImpl namespaceAttributes) throws SAXException { curElement = element; super.startElement(element, namespaceAttributes); } }