diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTAttributesHandlerType.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTAttributesHandlerType.java index 1aa1307..98aaec3 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTAttributesHandlerType.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTAttributesHandlerType.java @@ -18,7 +18,6 @@ package com.io7m.blackthorne.api; import org.xml.sax.Attributes; -import org.xml.sax.SAXException; /** * A function that, given a set of attributes, returns a {@code T}. @@ -36,11 +35,11 @@ public interface BTAttributesHandlerType * * @return A value of {@code T} * - * @throws SAXException On errors + * @throws Exception On errors */ T parse( BTElementParsingContextType context, Attributes attributes) - throws SAXException; + throws Exception; } diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTCharacterHandlerType.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTCharacterHandlerType.java index 059cfc2..81820d3 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTCharacterHandlerType.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTCharacterHandlerType.java @@ -17,8 +17,6 @@ package com.io7m.blackthorne.api; -import org.xml.sax.SAXException; - /** * A function that, given a string, returns a {@code T}. * @@ -37,7 +35,7 @@ public interface BTCharacterHandlerType * * @return A value of {@code T} * - * @throws SAXException On errors + * @throws Exception On errors */ T parse( @@ -45,5 +43,5 @@ T parse( char[] characters, int offset, int length) - throws SAXException; + throws Exception; } diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTContentHandler.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTContentHandler.java index fcb99f5..58b54bb 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTContentHandler.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTContentHandler.java @@ -17,12 +17,6 @@ package com.io7m.blackthorne.api; import com.io7m.jlexing.core.LexicalPosition; -import java.net.URI; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Consumer; import org.xml.sax.Attributes; import org.xml.sax.Locator; import org.xml.sax.SAXException; @@ -30,6 +24,13 @@ import org.xml.sax.ext.DefaultHandler2; import org.xml.sax.ext.Locator2; +import java.net.URI; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Consumer; + /** * A dispatching handler that produces values of type {@code T}. The handler is responsible for * instantiating a content handler based on the received document namespace URI. @@ -95,6 +96,18 @@ public static BTContentHandlerBuilderType builder( return new Builder<>(); } + private static String messageOrException( + final Exception e) + { + final var messageOrNull = e.getMessage(); + if (messageOrNull == null) { + return String.format( + "No error message provided for exception %s", + e.getClass().getName()); + } + return messageOrNull; + } + @Override public void setDocumentLocator( final Locator in_locator) @@ -109,12 +122,13 @@ public void startElement( final String localName, final String qualifiedName, final Attributes attributes) - throws SAXException { try { this.stackHandler.onElementStarted(namespaceURI, localName, attributes); } catch (final SAXParseException e) { this.error(e); + } catch (final Exception e) { + this.error(this.saxParseExceptionOf(e)); } } @@ -123,12 +137,13 @@ public void endElement( final String namespaceURI, final String localName, final String qualifiedName) - throws SAXException { try { this.stackHandler.onElementFinished(namespaceURI, localName); } catch (final SAXParseException e) { this.error(e); + } catch (final Exception e) { + this.error(this.saxParseExceptionOf(e)); } } @@ -137,12 +152,13 @@ public void characters( final char[] ch, final int start, final int length) - throws SAXException { try { this.stackHandler.onCharacters(ch, start, length); } catch (final SAXParseException e) { this.error(e); + } catch (final Exception e) { + this.error(this.saxParseExceptionOf(e)); } } @@ -189,18 +205,6 @@ public void fatalError( throw e; } - private static String messageOrException( - final Exception e) - { - final var messageOrNull = e.getMessage(); - if (messageOrNull == null) { - return String.format( - "No error message provided for exception %s", - e.getClass().getName()); - } - return messageOrNull; - } - private LexicalPosition currentLexical() { final LexicalPosition lexicalPosition; @@ -223,6 +227,12 @@ private LexicalPosition currentLexical() return lexicalPosition; } + private SAXParseException saxParseExceptionOf( + final Exception e) + { + return new SAXParseException(e.getLocalizedMessage(), this.locator, e); + } + /** * @return The parsed value */ diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTContentHandlerBuilderType.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTContentHandlerBuilderType.java index f5e08ee..82d7f2e 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTContentHandlerBuilderType.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTContentHandlerBuilderType.java @@ -55,7 +55,9 @@ default BTContentHandlerBuilderType addHandler( final String localName, final BTElementHandlerConstructorType constructor) { - return this.addHandler(BTQualifiedName.of(namespaceURI, localName), constructor); + return this.addHandler( + BTQualifiedName.of(namespaceURI, localName), + constructor); } /** diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTElementHandlerConstructorType.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTElementHandlerConstructorType.java index fe77823..7ab2e40 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTElementHandlerConstructorType.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTElementHandlerConstructorType.java @@ -16,8 +16,6 @@ package com.io7m.blackthorne.api; -import org.xml.sax.SAXException; - /** * A content handler constructor that produces handlers that produce values of type {@code A} * @@ -34,11 +32,11 @@ public interface BTElementHandlerConstructorType * * @return A new content handler * - * @throws SAXException If required + * @throws Exception If required * @see BTElementParsingContextType#parseException(Exception) */ BTElementHandlerType create( BTElementParsingContextType context) - throws SAXException; + throws Exception; } diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTElementHandlerType.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTElementHandlerType.java index a72f659..7d5c724 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTElementHandlerType.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTElementHandlerType.java @@ -18,7 +18,6 @@ package com.io7m.blackthorne.api; import org.xml.sax.Attributes; -import org.xml.sax.SAXException; import java.util.Map; import java.util.function.Function; @@ -82,13 +81,13 @@ default BTIgnoreUnrecognizedElements onShouldIgnoreUnrecognizedElements( * @param context The parsing context * @param attributes The element's attributes * - * @throws SAXException On parse errors + * @throws Exception On parse errors */ default void onElementStart( final BTElementParsingContextType context, final Attributes attributes) - throws SAXException + throws Exception { } @@ -101,11 +100,11 @@ default void onElementStart( * * @return The value produced by all of the data received up to this point * - * @throws SAXException On parse errors + * @throws Exception On parse errors */ RT onElementFinished(BTElementParsingContextType context) - throws SAXException; + throws Exception; /** * A child element has been parsed successfully and produced a result. @@ -113,13 +112,13 @@ RT onElementFinished(BTElementParsingContextType context) * @param context The parsing context * @param result The value produced by the child element * - * @throws SAXException On parse errors + * @throws Exception On parse errors */ default void onChildValueProduced( final BTElementParsingContextType context, final CT result) - throws SAXException + throws Exception { } @@ -132,7 +131,7 @@ default void onChildValueProduced( * @param offset The start of the data within {@code data} * @param length The length of the data within {@code data} * - * @throws SAXException On parse errors + * @throws Exception On parse errors */ default void onCharacters( @@ -140,7 +139,7 @@ default void onCharacters( final char[] data, final int offset, final int length) - throws SAXException + throws Exception { } diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTException.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTException.java index 413539c..011ad71 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTException.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTException.java @@ -27,15 +27,6 @@ public final class BTException extends Exception { private final List errors; - /** - * @return The parse errors encountered during parsing - */ - - public List errors() - { - return this.errors; - } - /** * Construct an exception. * @@ -84,4 +75,13 @@ public BTException( super(Objects.requireNonNull(inCause, "cause")); this.errors = Objects.requireNonNull(inErrors, "errors"); } + + /** + * @return The parse errors encountered during parsing + */ + + public List errors() + { + return this.errors; + } } diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTFunctorHandler.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTFunctorHandler.java index edeb756..30337cc 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTFunctorHandler.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTFunctorHandler.java @@ -18,7 +18,6 @@ package com.io7m.blackthorne.api; import org.xml.sax.Attributes; -import org.xml.sax.SAXException; import java.util.Map; import java.util.Objects; @@ -76,7 +75,7 @@ public BTIgnoreUnrecognizedElements onShouldIgnoreUnrecognizedElements( public void onElementStart( final BTElementParsingContextType context, final Attributes attributes) - throws SAXException + throws Exception { this.handler.onElementStart(context, attributes); } @@ -85,7 +84,7 @@ public void onElementStart( public void onChildValueProduced( final BTElementParsingContextType context, final A result) - throws SAXException + throws Exception { this.handler.onChildValueProduced(context, result); } @@ -96,14 +95,14 @@ public void onCharacters( final char[] data, final int offset, final int length) - throws SAXException + throws Exception { this.handler.onCharacters(context, data, offset, length); } @Override public C onElementFinished(final BTElementParsingContextType context) - throws SAXException + throws Exception { return this.function.apply(this.handler.onElementFinished(context)); } diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTLeafElementHandler.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTLeafElementHandler.java deleted file mode 100644 index 42265ce..0000000 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTLeafElementHandler.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright © 2019 Mark Raynsford http://io7m.com - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - - -package com.io7m.blackthorne.api; - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; - -import java.util.Objects; - -/** - * A convenient handler dealing with elements that do not have children. - * - * @param The type of returned values - */ - -public final class BTLeafElementHandler - implements BTElementHandlerType -{ - private final BTQualifiedName name; - private final BTLeafElementHandlerType handler; - private S result; - - /** - * Construct a handler. - * - * @param inName The name of elements handled by this handler - * @param inHandler The element handler - */ - - public BTLeafElementHandler( - final BTQualifiedName inName, - final BTLeafElementHandlerType inHandler) - { - this.name = - Objects.requireNonNull(inName, "name"); - this.handler = - Objects.requireNonNull(inHandler, "handler"); - } - - @Override - public String name() - { - return this.name.localName(); - } - - @Override - public void onElementStart( - final BTElementParsingContextType context, - final Attributes attributes) - throws SAXException - { - try { - this.result = this.handler.onElement(context, attributes); - } catch (final Exception e) { - throw context.parseException(e); - } - } - - @Override - public S onElementFinished( - final BTElementParsingContextType context) - { - return this.result; - } -} diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTLeafElementHandlerType.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTLeafElementHandlerType.java deleted file mode 100644 index c15f070..0000000 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTLeafElementHandlerType.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © 2020 Mark Raynsford http://io7m.com - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package com.io7m.blackthorne.api; - -import org.xml.sax.Attributes; - -/** - * An element handler that takes the attributes of a single element and - * produces an output value. - * - * @param The type of returned values - */ - -public interface BTLeafElementHandlerType -{ - /** - * Process the attributes of an element. - * - * @param context The parse context - * @param attributes The element attributes - * - * @return A value of {@code S} - * - * @throws Exception On errors - */ - - S onElement( - BTElementParsingContextType context, - Attributes attributes) - throws Exception; -} diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTScalarAttributeHandler.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTScalarAttributeHandler.java index c10c969..3096ece 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTScalarAttributeHandler.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTScalarAttributeHandler.java @@ -18,7 +18,6 @@ package com.io7m.blackthorne.api; import org.xml.sax.Attributes; -import org.xml.sax.SAXException; import java.util.Objects; @@ -59,7 +58,7 @@ public String name() public void onElementStart( final BTElementParsingContextType context, final Attributes attributes) - throws SAXException + throws Exception { this.result = this.handler.parse(context, attributes); } diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTScalarElementHandler.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTScalarElementHandler.java index dca9a8b..ac98b08 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTScalarElementHandler.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTScalarElementHandler.java @@ -17,8 +17,6 @@ package com.io7m.blackthorne.api; -import org.xml.sax.SAXException; - import java.util.Objects; /** @@ -60,7 +58,7 @@ public void onCharacters( final char[] data, final int offset, final int length) - throws SAXException + throws Exception { this.result = this.handler.parse(context, data, offset, length); } diff --git a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTStackHandler.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTStackHandler.java index 11ed3f0..3cc4577 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTStackHandler.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/BTStackHandler.java @@ -21,7 +21,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.Attributes; -import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.ext.Locator2; @@ -115,14 +114,14 @@ private void trace( * @param localName The local element name * @param attributes The element attributes * - * @throws SAXException On parse errors + * @throws Exception On parse errors */ public void onElementStarted( final String namespaceURI, final String localName, final Attributes attributes) - throws SAXException + throws Exception { try { Objects.requireNonNull(namespaceURI, "namespaceURI"); @@ -150,7 +149,10 @@ public void onElementStarted( final var rootHandlerConstructor = this.rootHandlers.get(qualifiedName); if (rootHandlerConstructor == null) { throw new SAXParseException( - BTMessages.format("errorRootElementNotAllowed", localName, namespaceURI), + BTMessages.format( + "errorRootElementNotAllowed", + localName, + namespaceURI), this.context.documentLocator()); } @@ -215,7 +217,9 @@ public void onElementStarted( */ final var newHandler = - Objects.requireNonNull(childHandlerConstructor, "childHandlerConstructor") + Objects.requireNonNull( + childHandlerConstructor, + "childHandlerConstructor") .create(this.context); Objects.requireNonNull(newHandler, "newHandler"); @@ -235,14 +239,14 @@ public void onElementStarted( * @param offset The starting offset into {@code data} * @param length The length of the data in {@code data} * - * @throws SAXException On parse errors + * @throws Exception On parse errors */ public void onCharacters( final char[] data, final int offset, final int length) - throws SAXException + throws Exception { try { Objects.requireNonNull(data, "data"); @@ -277,13 +281,13 @@ public void onCharacters( * @param namespaceURI The namespace URI * @param localName The local element name * - * @throws SAXException On parse errors + * @throws Exception On parse errors */ public void onElementFinished( final String namespaceURI, final String localName) - throws SAXException + throws Exception { try { Objects.requireNonNull(namespaceURI, "namespaceURI"); diff --git a/com.io7m.blackthorne.tests/src/test/java/com/io7m/blackthorne/tests/BlackthorneTest.java b/com.io7m.blackthorne.tests/src/test/java/com/io7m/blackthorne/tests/BlackthorneTest.java index c86a932..1580929 100644 --- a/com.io7m.blackthorne.tests/src/test/java/com/io7m/blackthorne/tests/BlackthorneTest.java +++ b/com.io7m.blackthorne.tests/src/test/java/com/io7m/blackthorne/tests/BlackthorneTest.java @@ -22,9 +22,9 @@ import com.io7m.blackthorne.api.BTElementParsingContextType; import com.io7m.blackthorne.api.BTException; import com.io7m.blackthorne.api.BTIgnoreUnrecognizedElements; -import com.io7m.blackthorne.api.BTLeafElementHandler; import com.io7m.blackthorne.api.BTParseError; import com.io7m.blackthorne.api.BTQualifiedName; +import com.io7m.blackthorne.api.BTScalarAttributeHandler; import com.io7m.blackthorne.api.Blackthorne; import com.io7m.blackthorne.jxe.BlackthorneJXE; import com.io7m.jxe.core.JXEHardenedSAXParsers; @@ -1259,7 +1259,7 @@ public void testLeafIntegerAttr0() throws Exception { final var intAttr = - new BTLeafElementHandler<>( + new BTScalarAttributeHandler<>( BTQualifiedName.of("urn:tests", "intA"), BlackthorneTest::parseIntAttribute );