If there are no objections, I will check in the attached patch that lets
us use a Reader on the parse.
Reader reader = ...
Document doc = Parser.INSTANCE.parse(reader, uri, options);
Passing in a Writer on the writeTo methods is harder because Axiom
doesn't support it. Will look at that on Monday.
- James
Stephen Duncan wrote:
> And I'd think there should be methods taking a Reader in on the Parser
> interface to match the InputStream methods.
>
> -Stephen
>
> On 6/17/06, Stephen Duncan <[EMAIL PROTECTED]> wrote:
>> I'd like to have a writeTo(Writer) in addition to the current
>> writeTo(OutputStream) on the Base class.
>>
>> --
>> Stephen Duncan Jr
>> www.stephenduncanjr.com
>>
>
>
Index: core/src/main/java/org/apache/abdera/parser/Parser.java
===================================================================
--- core/src/main/java/org/apache/abdera/parser/Parser.java (revision
415090)
+++ core/src/main/java/org/apache/abdera/parser/Parser.java (working copy)
@@ -18,6 +18,7 @@
package org.apache.abdera.parser;
import java.io.InputStream;
+import java.io.Reader;
import java.net.URI;
import java.net.URISyntaxException;
@@ -66,5 +67,31 @@
ParserOptions options)
throws ParseException, URISyntaxException;
+ <T extends Element>Document<T> parse(
+ Reader in)
+ throws ParseException;
+
+ <T extends Element>Document<T> parse(
+ Reader in,
+ URI base)
+ throws ParseException;
+
+ <T extends Element>Document<T> parse(
+ Reader in,
+ URI base,
+ ParserOptions options)
+ throws ParseException;
+
+ <T extends Element>Document<T> parse(
+ Reader in,
+ String base)
+ throws ParseException, URISyntaxException;
+
+ <T extends Element>Document<T> parse(
+ Reader in,
+ String base,
+ ParserOptions options)
+ throws ParseException, URISyntaxException;
+
ParserOptions getDefaultParserOptions();
}
Index: core/src/main/java/org/apache/abdera/util/AbstractParser.java
===================================================================
--- core/src/main/java/org/apache/abdera/util/AbstractParser.java
(revision 415090)
+++ core/src/main/java/org/apache/abdera/util/AbstractParser.java
(working copy)
@@ -18,6 +18,7 @@
package org.apache.abdera.util;
import java.io.InputStream;
+import java.io.Reader;
import java.net.URI;
import java.net.URISyntaxException;
@@ -64,6 +65,36 @@
return parse(in, new URI(base), options);
}
+ public <T extends Element>Document<T> parse(
+ Reader in)
+ throws ParseException {
+ return parse(in, (URI)null, getDefaultParserOptions());
+ }
+
+ public <T extends Element>Document<T> parse(
+ Reader in,
+ URI base)
+ throws ParseException {
+ return parse(in, base, getDefaultParserOptions());
+ }
+
+ public <T extends Element>Document<T> parse(
+ Reader in,
+ String base)
+ throws ParseException,
+ URISyntaxException {
+ return parse(in, new URI(base), getDefaultParserOptions());
+ }
+
+ public <T extends Element>Document<T> parse(
+ Reader in,
+ String base,
+ ParserOptions options)
+ throws ParseException,
+ URISyntaxException {
+ return parse(in, new URI(base), options);
+ }
+
public abstract ParserOptions getDefaultParserOptions();
}
Index: parser/src/main/java/org/apache/abdera/parser/stax/FOMParser.java
===================================================================
--- parser/src/main/java/org/apache/abdera/parser/stax/FOMParser.java
(revision 415090)
+++ parser/src/main/java/org/apache/abdera/parser/stax/FOMParser.java
(working copy)
@@ -18,8 +18,12 @@
package org.apache.abdera.parser.stax;
import java.io.InputStream;
+import java.io.Reader;
import java.net.URI;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+
import org.apache.abdera.factory.Factory;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Element;
@@ -29,7 +33,6 @@
import org.apache.abdera.util.AbstractParser;
import org.apache.axiom.om.OMDocument;
-
public class FOMParser
extends AbstractParser
implements Parser {
@@ -34,6 +37,28 @@
extends AbstractParser
implements Parser {
+ private FOMFactory getFomFactory(ParserOptions options) {
+ FOMFactory factory =
+ (options != null && options.getFactory() != null) ?
+ (FOMFactory)options.getFactory() : null;
+ if (factory == null)
+ factory = (Factory.INSTANCE instanceof FOMFactory) ?
+ (FOMFactory)Factory.INSTANCE : new FOMFactory();
+ return factory;
+ }
+
+ private <T extends Element>Document<T> getDocument(
+ FOMBuilder builder,
+ URI base,
+ ParserOptions options) {
+ Document<T> document = builder.getFomDocument();
+ document.setBaseUri(base);
+ if (options.getCharset() != null) {
+ ((OMDocument)document).setCharsetEncoding(options.getCharset());
+ }
+ return document;
+ }
+
public <T extends Element>Document<T> parse(
InputStream in,
URI base,
@@ -41,16 +66,9 @@
throws ParseException {
Document<T> document = null;
try {
- FOMFactory factory = (options != null && options.getFactory() != null) ?
(FOMFactory)options.getFactory() : null;
- if (factory == null)
- factory = (Factory.INSTANCE instanceof FOMFactory) ?
(FOMFactory)Factory.INSTANCE : new FOMFactory();
-
+ FOMFactory factory = getFomFactory(options);
FOMBuilder builder = new FOMBuilder(factory, in, options);
- document = builder.getFomDocument();
- document.setBaseUri(base);
- if (options.getCharset() != null) {
- ((OMDocument)document).setCharsetEncoding(options.getCharset());
- }
+ document = getDocument(builder, base, options);
} catch (Exception e) {
if (!(e instanceof ParseException))
e = new ParseException(e);
@@ -59,6 +77,26 @@
return document;
}
+ public <T extends Element> Document<T> parse(
+ Reader in,
+ URI base,
+ ParserOptions options)
+ throws ParseException {
+ Document<T> document = null;
+ try {
+ FOMFactory factory = getFomFactory(options);
+ XMLStreamReader xmlreader =
+ XMLInputFactory.newInstance().createXMLStreamReader(in);
+ FOMBuilder builder = new FOMBuilder(factory, xmlreader, options);
+ document = getDocument(builder, base, options);
+ } catch (Exception e) {
+ if (!(e instanceof ParseException))
+ e = new ParseException(e);
+ throw (ParseException)e;
+ }
+ return document;
+ }
+
@Override
public ParserOptions getDefaultParserOptions() {
return new FOMParserOptions();