diff --git a/README-CHANGES.xml b/README-CHANGES.xml index fa73da4..a613072 100644 --- a/README-CHANGES.xml +++ b/README-CHANGES.xml @@ -1,9 +1,18 @@ - + + + + + + + + + + diff --git a/com.io7m.blackthorne.api/pom.xml b/com.io7m.blackthorne.api/pom.xml index 83ee74f..87a87c0 100644 --- a/com.io7m.blackthorne.api/pom.xml +++ b/com.io7m.blackthorne.api/pom.xml @@ -8,7 +8,7 @@ com.io7m.blackthorne com.io7m.blackthorne - 1.0.0 + 1.1.0 com.io7m.blackthorne.api 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/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.api/src/main/java/com/io7m/blackthorne/api/package-info.java b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/package-info.java index f894c3c..81fbddc 100644 --- a/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/package-info.java +++ b/com.io7m.blackthorne.api/src/main/java/com/io7m/blackthorne/api/package-info.java @@ -19,7 +19,7 @@ */ @Export -@Version("1.0.0") +@Version("1.1.0") package com.io7m.blackthorne.api; import org.osgi.annotation.bundle.Export; diff --git a/com.io7m.blackthorne.jxe/pom.xml b/com.io7m.blackthorne.jxe/pom.xml index 9a9c1d0..8de1de3 100644 --- a/com.io7m.blackthorne.jxe/pom.xml +++ b/com.io7m.blackthorne.jxe/pom.xml @@ -8,7 +8,7 @@ com.io7m.blackthorne com.io7m.blackthorne - 1.0.0 + 1.1.0 com.io7m.blackthorne.jxe diff --git a/com.io7m.blackthorne.tests/pom.xml b/com.io7m.blackthorne.tests/pom.xml index a1760ae..fb694a6 100644 --- a/com.io7m.blackthorne.tests/pom.xml +++ b/com.io7m.blackthorne.tests/pom.xml @@ -8,7 +8,7 @@ com.io7m.blackthorne com.io7m.blackthorne - 1.0.0 + 1.1.0 com.io7m.blackthorne.tests 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 89f7b10..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 @@ -24,6 +24,7 @@ import com.io7m.blackthorne.api.BTIgnoreUnrecognizedElements; 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; @@ -1246,4 +1247,35 @@ public void testConvenience1() Assertions.assertEquals(SAXParseException.class, ex.getCause().getClass()); Assertions.assertEquals(2, ex.errors().size()); } + + /** + * Leaf element handlers work. + * + * @throws Exception On errors + */ + + @Test + public void testLeafIntegerAttr0() + throws Exception + { + final var intAttr = + new BTScalarAttributeHandler<>( + BTQualifiedName.of("urn:tests", "intA"), + BlackthorneTest::parseIntAttribute + ); + + final var handler = + BTContentHandler.builder() + .addHandler("urn:tests", "intA", context -> intAttr) + .build(URI.create("urn:text"), this::logError); + + final var reader = createReader(); + reader.setContentHandler(handler); + reader.setErrorHandler(handler); + reader.parse(resource("intA.xml")); + + Assertions.assertFalse(handler.failed()); + Assertions.assertEquals(0, this.errors.size()); + Assertions.assertEquals(BigInteger.valueOf(23L), handler.result().get()); + } } diff --git a/pom.xml b/pom.xml index a9d8e3d..8162b27 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ com.io7m.blackthorne com.io7m.blackthorne - 1.0.0 + 1.1.0 pom com.io7m.blackthorne @@ -33,7 +33,7 @@ 2.7.5 5.7.0 1.0.0 - 0.0.1-SNAPSHOT + 1.0.0