/** * Copyright (C) 2010 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.xml; import org.orbeon.oxf.common.OXFException; import org.orbeon.oxf.common.OrbeonLocationException; import org.orbeon.oxf.xml.dom4j.ExtendedLocationData; import org.orbeon.oxf.xml.dom4j.LocationData; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; /** * XMLReceiver which wraps exceptions with location information if possible. */ public class ExceptionWrapperXMLReceiver extends SimpleForwardingXMLReceiver { private Locator locator; private String message; public ExceptionWrapperXMLReceiver(XMLReceiver xmlReceiver, String message) { super(xmlReceiver); this.message = message; } public ExceptionWrapperXMLReceiver(ContentHandler contentHandler, String message) { super(contentHandler); this.message = message; } @Override public void setDocumentLocator(Locator locator) { super.setDocumentLocator(locator); this.locator = locator; } @Override public void startElement(String uri, String localname, String qName, Attributes attributes) throws SAXException { try { super.startElement(uri, localname, qName, attributes); } catch (RuntimeException e) { wrapException(e, uri, qName, attributes); } } @Override public void endElement(String uri, String localname, String qName) throws SAXException { try { super.endElement(uri, localname, qName); } catch (RuntimeException e) { wrapException(e); } } @Override public void characters(char[] chars, int start, int length) throws SAXException { try { super.characters(chars, start, length); } catch (RuntimeException e) { wrapException(e); } } @Override public void startPrefixMapping(String s, String s1) throws SAXException { try { super.startPrefixMapping(s, s1); } catch (RuntimeException e) { wrapException(e); } } @Override public void endPrefixMapping(String s) throws SAXException { try { super.endPrefixMapping(s); } catch (RuntimeException e) { wrapException(e); } } @Override public void ignorableWhitespace(char[] chars, int start, int length) throws SAXException { try { super.ignorableWhitespace(chars, start, length); } catch (RuntimeException e) { wrapException(e); } } @Override public void skippedEntity(String s) throws SAXException { try { super.skippedEntity(s); } catch (RuntimeException e) { wrapException(e); } } @Override public void processingInstruction(String s, String s1) throws SAXException { try { super.processingInstruction(s, s1); } catch (RuntimeException e) { wrapException(e); } } @Override public void endDocument() throws SAXException { try { super.endDocument(); } catch (RuntimeException e) { wrapException(e); } } @Override public void startDocument() throws SAXException { try { super.startDocument(); } catch (RuntimeException e) { wrapException(e); } } @Override public void startDTD(String name, String publicId, String systemId) throws SAXException { try { super.startDTD(name, publicId, systemId); } catch (RuntimeException e) { wrapException(e); } } @Override public void endDTD() throws SAXException { try { super.endDTD(); } catch (RuntimeException e) { wrapException(e); } } @Override public void startEntity(String name) throws SAXException { try { super.startEntity(name); } catch (RuntimeException e) { wrapException(e); } } @Override public void endEntity(String name) throws SAXException { try { super.endEntity(name); } catch (RuntimeException e) { wrapException(e); } } @Override public void startCDATA() throws SAXException { try { super.startCDATA(); } catch (RuntimeException e) { wrapException(e); } } @Override public void endCDATA() throws SAXException { try { super.endCDATA(); } catch (RuntimeException e) { wrapException(e); } } @Override public void comment(char[] ch, int start, int length) throws SAXException { try { super.comment(ch, start, length); } catch (RuntimeException e) { wrapException(e); } } private void wrapException(Exception e) throws SAXException { if (locator != null) throw OrbeonLocationException.wrapException(e, new ExtendedLocationData(new LocationData(locator), message)); else if (e instanceof SAXException) throw (SAXException) e; else if (e instanceof RuntimeException) throw (RuntimeException) e; else throw new OXFException(e);// this should not happen } private void wrapException(Exception e, String uri, String qName, Attributes attributes) throws SAXException { if (locator != null) throw OrbeonLocationException.wrapException(e, new ExtendedLocationData(new LocationData(locator), message, new String[]{"element", SAXUtils.saxElementToDebugString(uri, qName, attributes)})); else if (e instanceof SAXException) throw (SAXException) e; else if (e instanceof RuntimeException) throw (RuntimeException) e; else throw new OXFException(e);// this should not happen } }