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();

Reply via email to