You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2007/11/03 01:32:48 UTC

svn commit: r591523 - in /incubator/abdera/java/trunk: core/src/main/java/org/apache/abdera/ core/src/main/java/org/apache/abdera/parser/ core/src/main/java/org/apache/abdera/util/ core/src/main/java/org/apache/abdera/writer/ examples/src/main/java/org...

Author: jmsnell
Date: Fri Nov  2 17:32:39 2007
New Revision: 591523

URL: http://svn.apache.org/viewvc?rev=591523&view=rev
Log:
When writing out large Atom documents, going through an creating a bunch of objects is less than 
optimum.  The new StreamWriter interface allows us to write out Atom documents using a streaming 
interface.  This is a work in progress.  There are some features, such as xml:lang and xml:base that need better support.  

Example:

  Abdera abdera = Abdera.getInstance();
  StreamWriter out = abdera.newStreamWriter();
  out.setOutputStream(System.out,"UTF-8");
  
  out.startDocument();
  out.startFeed();
  out.writeId("http://example.org");
  out.writeTitle("Foo");
  ...
  out.endFeed();
  out.endDocument();



Added:
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/NamedItem.java
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/StreamWriter.java
    incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/simple/StreamWriterExample.java
    incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java
Modified:
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/Abdera.java
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/parser/NamedParser.java
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/NamedWriter.java
    incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/WriterFactory.java
    incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMWriterFactory.java

Modified: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/Abdera.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/Abdera.java?rev=591523&r1=591522&r2=591523&view=diff
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/Abdera.java (original)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/Abdera.java Fri Nov  2 17:32:39 2007
@@ -27,6 +27,7 @@
 import org.apache.abdera.util.AbderaConfiguration;
 import org.apache.abdera.util.Messages;
 import org.apache.abdera.util.ServiceUtil;
+import org.apache.abdera.writer.StreamWriter;
 import org.apache.abdera.writer.Writer;
 import org.apache.abdera.writer.WriterFactory;
 import org.apache.abdera.xpath.XPath;
@@ -268,6 +269,19 @@
     }
   }
   
+  /**
+   * Return a new instance of the default org.apache.abdera.writer.Writer
+   * 
+   * @return A new default writer implementation instance
+   */
+  public StreamWriter newStreamWriter() {
+    try {
+      return ServiceUtil.newStreamWriterInstance(this);
+    } catch (NoClassDefFoundError n) {
+      throw new RuntimeException(Messages.format("IMPLEMENTATION.NOT.AVAILABLE","StreamWriter"),n);
+    }
+  }  
+  
   // Static convenience methods //
   
   /**
@@ -322,5 +336,14 @@
    */
   public static Writer getNewWriter() {
     return (new Abdera()).newWriter();
+  }
+  
+  /**
+   * Return a new instance of the default StreamWriter using a non-shared Abdera object
+   * 
+   *  @return A new default stream writer implementation instance
+   */
+  public static StreamWriter getNewStreamWriter() {
+    return (new Abdera()).newStreamWriter();
   }
 }

Added: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/NamedItem.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/NamedItem.java?rev=591523&view=auto
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/NamedItem.java (added)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/NamedItem.java Fri Nov  2 17:32:39 2007
@@ -0,0 +1,24 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera;
+
+public interface NamedItem {
+
+  String getName();
+  
+}

Modified: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/parser/NamedParser.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/parser/NamedParser.java?rev=591523&r1=591522&r2=591523&view=diff
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/parser/NamedParser.java (original)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/parser/NamedParser.java Fri Nov  2 17:32:39 2007
@@ -17,6 +17,8 @@
 */
 package org.apache.abdera.parser;
 
+import org.apache.abdera.NamedItem;
+
 /**
  * Abdera's abstract parsing model allows developers to implement parsers 
  * capable of translating non-Atom formats into Abdera objects.  For instance,
@@ -32,14 +34,8 @@
  *   Document<Feed> doc = parser.parse(...);
  * </pre>
  */
-public interface NamedParser extends Parser {
+public interface NamedParser extends Parser, NamedItem {
 
-  /**
-   * Returns the name used to retrieve this parser (case insensitive)
-   * @return The name of this parser
-   */
-  String getName();
-  
   /**
    * Returns a listing of media type of the format consumed by this parser
    * @return An array of MIME Media Types

Modified: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java?rev=591523&r1=591522&r2=591523&view=diff
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java (original)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbderaConfiguration.java Fri Nov  2 17:32:39 2007
@@ -18,6 +18,8 @@
 package org.apache.abdera.util;
 
 import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -29,6 +31,7 @@
 import org.apache.abdera.factory.ExtensionFactory;
 import org.apache.abdera.parser.NamedParser;
 import org.apache.abdera.writer.NamedWriter;
+import org.apache.abdera.writer.StreamWriter;
 
 /**
  * Provides the basic configuration for the Abdera default implementation.  This
@@ -77,9 +80,11 @@
   private final String parserFactory;
   private final String writerFactory;
   private final String writer;
+  private final String streamwriter;
   private final List<ExtensionFactory> factories;
   private final List<ConverterProvider> providers;
   private final Map<String,NamedWriter> writers;
+  private final Map<String,Class<? extends StreamWriter>> streamwriters;
   private final Map<String,NamedParser> parsers;
   
   public AbderaConfiguration() {
@@ -97,10 +102,12 @@
     parserFactory = getConfigurationOption(CONFIG_PARSERFACTORY, DEFAULT_PARSERFACTORY);
     writerFactory = getConfigurationOption(CONFIG_WRITERFACTORY, DEFAULT_WRITERFACTORY);
     writer = getConfigurationOption(CONFIG_WRITER, DEFAULT_WRITER);
+    streamwriter = getConfigurationOption(CONFIG_STREAMWRITER, DEFAULT_STREAMWRITER);
     factories = ServiceUtil.loadExtensionFactories();
     providers = ServiceUtil.loadConverterProviders();
     writers = initNamedWriters();
     parsers = initNamedParsers();
+    streamwriters = initStreamWriters();
   }  
   
   private ResourceBundle getBundle() {
@@ -175,6 +182,13 @@
   public String getDefaultWriter() {
     return writer;
   }
+
+  /**
+   * Returns the Java classname of the default StreamWriter implementation
+   */
+  public String getDefaultStreamWriter() {
+    return streamwriter;
+  }
   
   /**
    * Registers an ExtensionFactory implementation.
@@ -221,12 +235,41 @@
     }
     return writers;
   }
+
+  /**
+   * Registers StreamWriter implementations using 
+   * the /META-INF/services/org.apache.abdera.writer.StreamWriter file
+   */
+  private Map<String,Class<? extends StreamWriter>> initStreamWriters() {
+    Map<String,Class<? extends StreamWriter>> writers = null;
+    List<Class<? extends StreamWriter>> _writers = 
+      ServiceUtil._loadimpls(STREAM_WRITER,true);
+    writers = Collections.synchronizedMap(new HashMap<String,Class<? extends StreamWriter>>());
+    for (Class<? extends StreamWriter> writer : _writers) {
+      try {
+        Field field = writer.getField("NAME");
+        if (Modifier.isStatic(field.getModifiers())) {
+          String name = (String)field.get(null);
+          if (name != null)
+            writers.put(name.toLowerCase(), writer);
+        }
+      } catch (Exception e) {}
+    }
+    return writers;
+  }
   
   /**
    * Returns the collection of NamedWriters
    */
   public Map<String,NamedWriter> getNamedWriters() {
     return writers;
+  }
+
+  /**
+   * Returns the collection of NamedWriters
+   */
+  public Map<String,Class<? extends StreamWriter>> getStreamWriters() {
+    return streamwriters;
   }
   
   /**

Added: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java?rev=591523&view=auto
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java (added)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/AbstractStreamWriter.java Fri Nov  2 17:32:39 2007
@@ -0,0 +1,895 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.abdera.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.xml.namespace.QName;
+
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.model.AtomDate;
+import org.apache.abdera.model.Content;
+import org.apache.abdera.model.Text;
+import org.apache.abdera.writer.StreamWriter;
+import org.apache.commons.codec.binary.Base64;
+
+public abstract class AbstractStreamWriter 
+  implements StreamWriter {
+  
+  protected final String name;
+  
+  protected AbstractStreamWriter(String name) {
+    this.name = name;
+  }
+  
+  public String getName() {
+    return name;
+  }
+  
+  public void startDocument() {
+    startDocument("1.0");
+  }
+ 
+  public void endDocument() {}
+  
+  public void startFeed() {
+    startFeed(null);
+  }
+  
+  public void startFeed(Map<QName,String> attributes) {
+    startElement(Constants.FEED, attributes);
+  }
+
+  public void endFeed() {
+    endElement();
+  }
+  
+  public void startEntry(Map<QName,String> attributes) {
+    startElement(Constants.ENTRY, attributes);
+  }
+  
+  public void startEntry() {
+    startEntry(null);
+  }
+  
+  public void endEntry() {
+    endElement();
+  }
+  
+  public void endCategory() {
+    endElement();
+  }
+  
+  public void endContent() {
+    endElement();
+  }
+  
+  public void endLink() {
+    endElement();
+  }
+  
+  public void endPerson() {
+    endElement();
+  }
+  
+  public void endSource() {
+    endElement();
+  }
+  
+  public void endText() {
+    endElement();
+  }
+  
+  
+  public void startCategory(
+    String term, 
+    Map<QName, String> attributes) {
+      startCategory(term,null,null,attributes);
+  }
+  
+  public void startCategory(
+    String term, 
+    String scheme,
+    Map<QName, String> attributes) {
+      startCategory(term,scheme,null,attributes);
+  }
+  
+  public void startCategory(
+    String term, 
+    String scheme, 
+    String label,
+    Map<QName, String> attributes) {
+      if (attributes == null) attributes = new HashMap<QName,String>();
+      attributes.put(new QName("term"),term);
+      if (scheme != null) attributes.put(new QName("scheme"),term);
+      if (label != null) attributes.put(new QName("label"),term);
+      startElement(Constants.CATEGORY,attributes);
+  }
+
+  public void startLink(
+    String iri, 
+    String rel, 
+    String type, 
+    String title,
+    String hreflang, 
+    int length, 
+    Map<QName, String> attributes) {
+      if (attributes == null) attributes = new HashMap<QName,String>();
+      attributes.put(new QName("href"),iri);
+      if (rel != null) attributes.put(new QName("rel"),rel);
+      if (type != null) attributes.put(new QName("type"),type);
+      if (title != null) attributes.put(new QName("title"),title);
+      if (hreflang != null) attributes.put(new QName("hreflang"),hreflang);
+      if (length > -1) attributes.put(new QName("length"),String.valueOf(length));
+      startElement(Constants.LINK,attributes);
+    
+  }
+
+  public void startPerson(
+    QName qname, 
+    Map<QName, String> attributes) {
+      startElement(qname, attributes);
+  }
+  
+  public void startSource(
+    Map<QName, String> attributes) {
+      startElement(Constants.SOURCE,attributes);
+  }
+  
+  public void startText(
+    QName qname, 
+    Text.Type type,
+    Map<QName, String> attributes) {
+    if (attributes == null) attributes = new HashMap<QName,String>();
+    attributes.put(new QName("type"),type!=null?type.name().toLowerCase():"text");
+    startElement(qname,attributes);
+  }
+  
+  public void writeDate(
+    QName qname, 
+    String date, 
+    Map<QName, String> attributes) {
+      startElement(qname,attributes);
+      writeElementText(date);
+      endElement();
+  }
+  
+  public void writeIRIElement(
+    QName qname, 
+    String iri,
+    Map<QName, String> attributes) {
+      startElement(qname,attributes);
+      writeElementText(iri);
+      endElement();
+  }
+  
+  public void writePersonEmail(
+    String email, 
+    Map<QName, String> attributes) {
+      startElement(Constants.EMAIL,attributes);
+      writeElementText(email);
+      endElement();
+  }
+  
+  public void writePersonName(
+    String name, 
+    Map<QName, String> attributes) {
+      startElement(Constants.NAME,attributes);
+      writeElementText(name);
+      endElement();    
+  }
+  
+  public void writePersonUri(
+    String uri, 
+    Map<QName, String> attributes) {
+      startElement(Constants.URI,attributes);
+      writeElementText(uri);
+      endElement();
+  }
+
+  public void startContent(
+    Content.Type type, 
+    String src, 
+    Map<QName, String> attributes) {
+      startContent(type.name().toLowerCase(),src,attributes);
+  }
+  
+  public void startContent(
+    String type, 
+    String src,
+    Map<QName, String> attributes) {
+      if (attributes == null) attributes = new HashMap<QName,String>();
+      attributes.put(new QName("type"),type);
+      if (src != null) attributes.put(new QName("src"),src);
+      startElement(Constants.CONTENT,attributes);
+  }
+  
+  public void startContent(
+    Content.Type type, 
+    Map<QName, String> attributes) {
+      startContent(type,null,attributes);
+  }
+  
+  public void startContent(
+    String type, 
+    Map<QName, String> attributes) {
+      startContent(type,null,attributes);
+  }
+  
+  public void startLink(
+    String iri, 
+    Map<QName, String> attributes) {
+      startLink(iri,null,null,null,null,-1,attributes);
+  }
+  
+  public void startLink(
+    String iri, 
+    String rel, 
+    Map<QName, String> attributes) {
+      startLink(iri,rel,null,null,null,-1,attributes);
+  }
+  
+  public void startLink(
+    String iri, 
+    String rel, 
+    String type,
+    Map<QName, String> attributes) {
+      startLink(iri,rel,type,null,null,-1,attributes);
+  }
+  
+  public void writeCategory(
+    String term, Map<QName, 
+    String> attributes) {
+      startCategory(term, attributes);
+      endCategory();
+  }
+  
+  public void writeCategory(
+    String term, 
+    String scheme,
+    Map<QName, String> attributes) {
+      startCategory(term,scheme,attributes);
+      endCategory();
+  }
+  
+  public void writeCategory(
+    String term, 
+    String scheme, 
+    String label,
+    Map<QName, String> attributes) {
+      startCategory(term,scheme,label,attributes);
+      endCategory();
+  }
+  
+  public void writeContent(
+    Content.Type type, 
+    String value,
+    Map<QName, String> attributes) {
+      startContent(type,attributes);
+      writeElementText(value);
+      endContent();
+  }
+  
+  public void writeContent(
+    Content.Type type, 
+    InputStream value,
+    Map<QName, String> attributes) throws IOException {
+      startContent(type,attributes);
+      writeElementText(value);
+      endContent();    
+  }
+  
+  public void writeContent(
+    Content.Type type, 
+    DataHandler value,
+    Map<QName, String> attributes) throws IOException {
+      startContent(type,attributes);
+      writeElementText(value);
+      endContent();
+  }
+  
+  public void writeContent(
+    String type, 
+    String value,
+    Map<QName, String> attributes) {
+      startContent(type,attributes);
+      writeElementText(value);
+      endContent();
+  }
+  
+  public void writeEdited(
+    Date date, 
+    Map<QName, String> attributes) {
+      writeDate(Constants.EDITED, date, attributes);
+  }
+  
+  public void writeId(
+    String iri, 
+    Map<QName, String> attributes) {
+      writeIRIElement(Constants.ID, iri, attributes);
+  }
+  
+  public void writeIcon(
+    String iri, 
+    Map<QName,String> attributes) {
+      writeIRIElement(Constants.ICON, iri, attributes);
+  }
+  
+  public void writeLogo(
+    String iri, 
+    Map<QName,String> attributes) {
+      writeIRIElement(Constants.LOGO, iri, attributes);
+  }
+  
+  
+  public void writeLink(
+    String iri, 
+    Map<QName, String> attributes) {
+      startLink(iri, attributes);
+      endLink();
+  }
+  
+  public void writeLink(
+    String iri, 
+    String rel, 
+    Map<QName, String> attributes) {
+      startLink(iri, rel, attributes);
+      endLink();
+  }
+  
+  public void writeLink(
+    String iri, 
+    String rel, 
+    String type,
+    Map<QName, String> attributes) {
+    startLink(iri, rel, type, attributes);
+    endLink();
+  }
+  
+  public void writeLink(
+    String iri, 
+    String rel, 
+    String type, 
+    String title,
+    String hreflang, 
+    int length, 
+    Map<QName, String> attributes) {
+      startLink(iri, rel, type, title, hreflang, length, attributes);
+      endLink();
+  }
+  
+  public void writePerson(
+    QName qname, 
+    String name, 
+    String email, 
+    String uri,
+    Map<QName, String> attributes) {
+      startPerson(qname,attributes);
+      writePersonName(name,null);
+      if (email != null) writePersonEmail(email,null);
+      if (uri != null) writePersonUri(uri,null);
+      endPerson();
+  }
+  
+  public void writePublished(
+    Date date, 
+    Map<QName, String> attributes) {
+      writeDate(Constants.PUBLISHED,date,attributes);
+  }
+  
+  public void writeText(
+    QName qname, 
+    Text.Type type,
+    String value, 
+    Map<QName, String> attributes) {
+      startText(qname,type,attributes);
+      writeElementText(value);
+      endText();
+  }
+  
+  public void writeUpdated(
+    Date date, 
+    Map<QName, String> attributes) {
+      writeDate(Constants.UPDATED,date,attributes);
+  }
+  
+  public void writeUpdated(String date, Map<QName,String> attributes) {
+    writeDate(Constants.UPDATED, date, attributes);
+  }
+  
+  public void writePublished(String date, Map<QName,String> attributes) {
+    writeDate(Constants.PUBLISHED, date, attributes);
+  }
+  
+  public void writeEdited(String date, Map<QName,String> attributes) {
+    writeDate(Constants.EDITED, date, attributes);
+  }
+  
+  public void writeDate(QName qname, Date date, Map<QName,String> attributes) {
+    writeDate(qname, AtomDate.format(date), attributes);
+  }
+  
+  public void writeId(IRI iri, Map<QName,String> attributes) {
+    writeIRIElement(Constants.ID, iri, attributes);
+  }
+  
+  public void writeIcon(IRI iri, Map<QName,String> attributes) {
+    writeIRIElement(Constants.ICON, iri, attributes);
+  }
+  
+  public void writeLogo(IRI iri, Map<QName,String> attributes) {
+    writeIRIElement(Constants.LOGO, iri, attributes);
+  }
+  
+  public void writeIRIElement(QName qname, IRI iri, Map<QName,String> attributes) {
+    writeIRIElement(qname, iri.toString(), attributes);
+  }
+  
+  public void writeElementText(InputStream value) throws IOException {
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    byte[] buf = new byte[1024];
+    int r = -1;
+    while ((r = value.read(buf)) != -1) out.write(buf,0,r);
+    byte[] data = out.toByteArray();
+    writeElementText(new String(Base64.encodeBase64(data),"UTF-8"));
+  }
+  
+  public void writeElementText(DataHandler value) throws IOException {
+    writeElementText(value.getInputStream());
+  }
+  
+  public void writeTitle(String value) {
+    writeText(Constants.TITLE, Text.Type.TEXT, value, null);
+  }
+  
+  public void writeTitle(Text.Type type, String value) {
+    writeText(Constants.TITLE, type, value, null);
+  }
+
+  public void writeSubtitle(String value) {
+    writeText(Constants.SUBTITLE, Text.Type.TEXT, value, null);
+  }
+  
+  public void writeSubtitle(Text.Type type, String value) {
+    writeText(Constants.SUBTITLE, type, value, null);
+  }
+  
+  public void writeSummary(String value) {
+    writeText(Constants.SUMMARY, Text.Type.TEXT, value, null);
+  }
+  
+  public void writeSummary(Text.Type type, String value) {
+    writeText(Constants.SUMMARY, type, value, null);
+  }
+  
+  public void writeRights(String value) {
+    writeText(Constants.RIGHTS, Text.Type.TEXT, value, null);
+  }
+  
+  public void writeRights(Text.Type type, String value) {
+    writeText(Constants.RIGHTS, type, value, null);
+  }
+
+
+  
+  public void writeTitle(String value, Map<QName,String> attributes) {
+    writeText(Constants.TITLE, Text.Type.TEXT, value, attributes);
+  }
+  
+  public void writeTitle(Text.Type type, String value, Map<QName,String> attributes) {
+    writeText(Constants.TITLE, type, value, attributes);
+  }
+
+  public void writeSubtitle(String value, Map<QName,String> attributes) {
+    writeText(Constants.SUBTITLE, Text.Type.TEXT, value, attributes);
+  }
+  
+  public void writeSubtitle(Text.Type type, String value, Map<QName,String> attributes) {
+    writeText(Constants.SUBTITLE, type, value, attributes);
+  }
+  
+  public void writeSummary(String value, Map<QName,String> attributes) {
+    writeText(Constants.SUMMARY, Text.Type.TEXT, value, attributes);
+  }
+  
+  public void writeSummary(Text.Type type, String value, Map<QName,String> attributes) {
+    writeText(Constants.SUMMARY, type, value, attributes);
+  }
+  
+  public void writeRights(String value, Map<QName,String> attributes) {
+    writeText(Constants.RIGHTS, Text.Type.TEXT, value, attributes);
+  }
+  
+  public void writeRights(Text.Type type, String value, Map<QName,String> attributes) {
+    writeText(Constants.RIGHTS, type, value, attributes);
+  }
+  
+  
+  
+  public void writeId(String iri) {
+    writeIRIElement(Constants.ID, iri, null); 
+  }
+  
+  public void writeIcon(String iri) {
+    writeIRIElement(Constants.ICON, iri, null);
+  }
+  
+  public void writeLogo(String iri) {
+    writeIRIElement(Constants.LOGO, iri, null);
+  }
+  
+  public void writeIRIElement(QName qname, String iri) {
+    writeIRIElement(qname, iri, null);
+  }
+
+  public void writeId(IRI iri) {
+    writeIRIElement(Constants.ID, iri, null);
+  }
+  
+  public void writeIcon(IRI iri) {
+    writeIRIElement(Constants.ICON, iri, null);
+  }
+  
+  public void writeLogo(IRI iri) {
+    writeIRIElement(Constants.LOGO, iri, null);
+  }
+  
+  public void writeIRIElement(QName qname, IRI iri) {
+    writeIRIElement(qname, iri, null);
+  }
+  
+  public void writeId() {
+    writeId((Map<QName,String>)null);
+  }
+   
+  public void writePerson(QName qname, String name, String email, String uri) {
+    writePerson(qname,name,email,uri,null);
+  }
+  
+  public void startPerson(QName qname) {
+    startPerson(qname,null);
+  }
+  
+  public void writePersonName(String name) {
+    writePersonName(name,null);
+  }
+  
+  public void writePersonEmail(String email) {
+    writePersonEmail(email,null);
+  }
+  
+  public void writePersonUri(String uri) {
+    writePersonUri(uri,null);
+  }
+ 
+
+  public void writeAuthor(String name, String email, String uri) {
+    writePerson(Constants.AUTHOR,name,email,uri,null);
+  }
+
+  public void writeAuthor(String name, String email, String uri, Map<QName,String> attributes) {
+    writePerson(Constants.AUTHOR,name,email,uri,attributes);
+  }
+  
+  public void startAuthor() {
+    startElement(Constants.AUTHOR,null);
+  }
+
+  public void startAuthor(Map<QName,String> attributes) {
+    startElement(Constants.AUTHOR,attributes);
+  }
+  
+  public void endAuthor() {
+    endElement();
+  }
+  
+
+  public void writeContributor(String name, String email, String uri) {
+    writePerson(Constants.CONTRIBUTOR,name,email,uri,null);
+  }
+
+  public void writeContributor(String name, String email, String uri, Map<QName,String> attributes) {
+    writePerson(Constants.CONTRIBUTOR,name,email,uri,attributes);
+  }
+  
+  public void startContributor() {
+    startElement(Constants.CONTRIBUTOR,null);
+  }
+
+  public void startContributor(Map<QName,String> attributes) {
+    startElement(Constants.CONTRIBUTOR,attributes);
+  }
+  
+  public void endContributor() {
+    endElement();
+  }
+  
+  public void writeGenerator(String version, String uri, String value) {
+    writeGenerator(version,uri,value,null);
+  }
+  
+  public void writeGenerator(String version, String uri, String value, Map<QName,String> attributes) {
+    if (attributes == null) attributes = new HashMap<QName,String>();
+    if (version != null) attributes.put(new QName("version"),version);
+    if (uri != null) attributes.put(new QName("uri"),uri);
+    startElement(Constants.GENERATOR,attributes);
+    writeElementText(value);
+    endElement();
+  }
+
+  public void startGenerator(String version, String uri) {
+    startGenerator(version,uri,null);
+  }
+  
+  public void startGenerator(String version, String uri, Map<QName,String> attributes) {
+    if (attributes == null) attributes = new HashMap<QName,String>();
+    if (version != null) attributes.put(new QName("version"),version);
+    if (uri != null) attributes.put(new QName("uri"),uri);
+    startElement(Constants.GENERATOR,attributes);    
+  }
+  
+  public void endGenerator() {
+    endElement();
+  }
+  
+  
+  public void writeUpdated(Date date) {
+    writeUpdated(date,null);
+  }
+  
+  public void writePublished(Date date) {
+    writePublished(date,null);
+  }
+  
+  public void writeEdited(Date date) {
+    writeEdited(date,null);
+  }
+  
+  public void writeDate(QName qname, Date date) {
+    writeDate(qname,date,null);
+  }
+
+  public void writeUpdated(String date) {
+    writeUpdated(date,null);
+  }
+  
+  public void writePublished(String date) {
+    writePublished(date,null);
+  }
+  
+  public void writeEdited(String date) {
+    writeEdited(date,null);
+  }
+  
+  public void writeDate(QName qname, String date) {
+    writeDate(qname, date,null);
+  }
+  
+  
+  public void writeLink(String iri) {
+    writeLink(iri,(Map<QName,String>)null);
+  }
+  
+  public void writeLink(String iri, String rel) {
+    writeLink(iri,rel,(Map<QName,String>)null);
+  }
+  
+  public void writeLink(String iri, String rel, String type) {
+    writeLink(iri,rel,type,(Map<QName,String>)null);
+  }
+  
+  public void writeLink(String iri, String rel, String type, String title, String hreflang, int length) {
+    writeLink(iri,rel,type,title,hreflang,length,(Map<QName,String>)null);
+  }
+  
+  public void startLink(String iri) {
+    startLink(iri,(Map<QName,String>)null);
+  }
+
+  public void startLink(String iri, String rel) {
+    startLink(iri,rel,(Map<QName,String>)null);
+  }
+  
+  public void startLink(String iri, String rel, String type) {
+    startLink(iri,rel,type,(Map<QName,String>)null);
+  }
+  
+  public void startLink(String iri, String rel, String type, String title, String hreflang, int length) {
+    startLink(iri,rel,type,title,hreflang,length,(Map<QName,String>)null);
+  }
+  
+  
+  public void writeCategory(String term) {
+   writeCategory(term,(Map<QName,String>)null); 
+  }
+  
+  public void writeCategory(String term, String scheme) {
+   writeCategory(term,scheme,(Map<QName,String>)null); 
+  }
+  
+  public void writeCategory(String term, String scheme, String label) {
+   writeCategory(term,scheme,label,(Map<QName,String>)null); 
+  }
+  
+  public void startCategory(String term) {
+   startCategory(term,(Map<QName,String>)null); 
+  }
+  
+  public void startCategory(String term, String scheme) {
+   startCategory(term,scheme,(Map<QName,String>)null); 
+  }
+  
+  public void startCategory(String term, String scheme, String label) {
+   startCategory(term,scheme,label,(Map<QName,String>)null); 
+  }
+  
+  public void startSource() {
+    startElement(Constants.SOURCE,null);
+  }
+  
+  public void writeText(QName qname, Text.Type type, String value) {
+    writeText(qname,type,value,null);
+  }
+  
+  public void startText(QName qname, Text.Type type) {
+    startText(qname,type,null);
+  }
+  
+  
+  public void writeContent(Content.Type type, String value) {
+    writeContent(type,value,null);
+  }
+  
+  public void writeContent(Content.Type type, InputStream value) throws IOException {
+    writeContent(type,value,null);
+  }
+  
+  public void writeContent(Content.Type type, DataHandler value) throws IOException {
+    writeContent(type,value,null);
+  }
+  
+  public void writeContent(String type, String value) {
+    writeContent(type,value,null);
+  }
+  
+  
+  public void startContent(Content.Type type) {
+    startContent(type,(Map<QName,String>)null);
+  }
+  
+  public void startContent(String type) {
+    startContent(type,(Map<QName,String>)null);
+  }
+  
+  public void startContent(Content.Type type, String src) {
+    startContent(type,(Map<QName,String>)null);
+  }
+  
+  public void startContent(String type, String src) {
+    startContent(type,(Map<QName,String>)null);
+  }
+  
+  public void startElement(QName qname) {
+    startElement(qname,null);
+  }
+  
+  
+  
+  public void startService() {
+    startElement(Constants.SERVICE);
+  }
+  
+  public void startService(Map<QName,String> attributes) {
+    startElement(Constants.SERVICE,attributes);
+  }
+  
+  public void endService() {
+    endElement();
+  }
+  
+  public void startWorkspace() {
+    startElement(Constants.WORKSPACE, null);
+  }
+  
+  public void startWorkspace(Map<QName,String> attributes) {
+    startElement(Constants.WORKSPACE, attributes);
+  }
+  
+  public void endWorkspace() {
+    endElement();
+  }
+  
+  public void startCollection(String href) {
+    startCollection(href, null);
+  }
+  
+  public void startCollection(String href, Map<QName,String> attributes) {
+    if (attributes == null) attributes = new HashMap<QName,String>();
+    attributes.put(new QName("href"),href);
+    startElement(Constants.COLLECTION, attributes);
+  }
+  
+  public void endCollection() {
+    endElement();
+  }
+  
+  public void writeAccepts(String... accepts) {
+    for (String accept : accepts) {
+      startElement(Constants.ACCEPT,null);
+      writeElementText(accept);
+      endElement();
+    }
+  }
+  
+  public void startCategories() {
+    startCategories(false,null,null);
+  }
+  
+  public void startCategories(boolean fixed) {
+    startCategories(fixed,null,null);
+  }
+  
+  public void startCategories(boolean fixed, String scheme) {
+    startCategories(fixed,scheme,null);
+  }
+  
+  public void startCategories(Map<QName,String> attributes) {
+    startCategories(false,null,attributes);
+  }
+  
+  public void startCategories(boolean fixed, Map<QName,String> attributes) {
+    startCategories(fixed,null,attributes);
+  }
+  
+  public void startCategories(boolean fixed, String scheme, Map<QName,String> attributes) {
+    if (attributes == null) attributes = new HashMap<QName,String>();
+    if (fixed) attributes.put(new QName("fixed"),"true");
+    else attributes.remove("fixed");
+    if (scheme != null) attributes.put(new QName("scheme"),scheme);
+    startElement(Constants.CATEGORIES, attributes);
+  }
+  
+  public void endCategories() {
+    endElement();
+  }
+
+  public void startControl() {
+    startElement(Constants.CONTROL,null);
+  }
+  
+  public void startControl(Map<QName,String> attributes) {
+    startElement(Constants.CONTROL, attributes);
+  }
+  
+  public void endControl() {
+    endElement();
+  }
+  
+  public void writeDraft(boolean draft) {
+    startElement(Constants.DRAFT);
+    writeElementText(draft?"yes":"no");
+    endElement();
+  }
+  
+}

Modified: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java?rev=591523&r1=591522&r2=591523&view=diff
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java (original)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/Constants.java Fri Nov  2 17:32:39 2007
@@ -27,14 +27,17 @@
   public static final String CONFIG_PARSERFACTORY = "org.apache.abdera.parser.ParserFactory";
   public static final String CONFIG_WRITERFACTORY = "org.apache.abdera.writer.WriterFactory";
   public static final String CONFIG_WRITER        = "org.apache.abdera.writer.Writer";
+  public static final String CONFIG_STREAMWRITER  = "org.apache.abdera.writer.StreamWriter";
   public static final String DEFAULT_PARSER       = "org.apache.abdera.parser.stax.FOMParser";
   public static final String DEFAULT_FACTORY      = "org.apache.abdera.parser.stax.FOMFactory";
   public static final String DEFAULT_XPATH        = "org.apache.abdera.parser.stax.FOMXPath";
   public static final String DEFAULT_PARSERFACTORY= "org.apache.abdera.parser.stax.FOMParserFactory";
   public static final String DEFAULT_WRITERFACTORY= "org.apache.abdera.parser.stax.FOMWriterFactory";
   public static final String DEFAULT_WRITER       = "org.apache.abdera.parser.stax.FOMWriter";
+  public static final String DEFAULT_STREAMWRITER = "org.apache.abdera.parser.stax.StaxStreamWriter";
   public static final String NAMED_WRITER         = "META-INF/services/org.apache.abdera.writer.NamedWriter";
   public static final String NAMED_PARSER         = "META-INF/services/org.apache.abdera.parser.NamedParser";
+  public static final String STREAM_WRITER        = "META-INF/services/org.apache.abdera.writer.StreamWriter";
   public static final String PREFIX               = "";
   public static final String APP_PREFIX           = "";
   public static final String CONTROL_PREFIX       = "";

Modified: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java?rev=591523&r1=591522&r2=591523&view=diff
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java (original)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/ServiceUtil.java Fri Nov  2 17:32:39 2007
@@ -18,9 +18,9 @@
 package org.apache.abdera.util;
 
 import java.io.BufferedReader;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.net.URL;
 import java.util.ArrayList;
@@ -34,6 +34,7 @@
 import org.apache.abdera.factory.Factory;
 import org.apache.abdera.parser.Parser;
 import org.apache.abdera.parser.ParserFactory;
+import org.apache.abdera.writer.StreamWriter;
 import org.apache.abdera.writer.Writer;
 import org.apache.abdera.writer.WriterFactory;
 import org.apache.abdera.xpath.XPath;
@@ -121,6 +122,13 @@
       abdera);
   }
   
+  public static StreamWriter newStreamWriterInstance(Abdera abdera) {
+    return (StreamWriter) newInstance(
+      CONFIG_STREAMWRITER,
+      abdera.getConfiguration().getDefaultStreamWriter(),
+      abdera);    
+  }
+  
   /**
    * Get the context class loader for this thread
    */
@@ -211,17 +219,21 @@
     return null;
   }
   
-  @SuppressWarnings("unchecked")
   public static Object locateInstance(ClassLoader loader, String id, Abdera abdera) {
+    return locateInstance(loader,id,abdera,false);
+  }
+  
+  @SuppressWarnings("unchecked")
+  public static Object locateInstance(ClassLoader loader, String id, Abdera abdera, boolean classesonly) {
     try {
       Class _class = loader.loadClass(id);
-      return _create(_class, abdera);
+      return classesonly ? _class : _create(_class, abdera);
     } catch (Exception e) {
       // Nothing
     }
     try {
       Class _class = ClassLoader.getSystemClassLoader().loadClass(id);
-      return _create(_class, abdera);
+      return classesonly ? _class : _create(_class, abdera);
     } catch (Exception e) {
       // Nothing
     }
@@ -314,7 +326,7 @@
   }
   
   @SuppressWarnings("unchecked")
-  protected static <T>List<T> _loadimpls(String sid) {
+  protected static <T>List<T> _loadimpls(String sid, boolean classesonly) {
     List<T> impls = Collections.synchronizedList(new ArrayList<T>());
     ClassLoader loader = getClassLoader();
     try {
@@ -353,5 +365,10 @@
     }
     
     return impls;
+  }
+ 
+  @SuppressWarnings("unchecked")
+  protected static <T>List<T> _loadimpls(String sid) {
+    return _loadimpls(sid,false);
   }
 }

Modified: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/NamedWriter.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/NamedWriter.java?rev=591523&r1=591522&r2=591523&view=diff
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/NamedWriter.java (original)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/NamedWriter.java Fri Nov  2 17:32:39 2007
@@ -17,15 +17,12 @@
 */
 package org.apache.abdera.writer;
 
+import org.apache.abdera.NamedItem;
+
 /**
  * Named Writers provide a means of extending Abdera's built in serialization.
  */
-public interface NamedWriter extends Writer {
-
-  /**
-   * Return the name used to acquire an instance of this Writer (case insensitive)
-   */
-  String getName();
+public interface NamedWriter extends Writer, NamedItem {
 
   /**
    * Return a listing of MIME Media formats this NamedWriter is capable 

Added: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/StreamWriter.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/StreamWriter.java?rev=591523&view=auto
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/StreamWriter.java (added)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/StreamWriter.java Fri Nov  2 17:32:39 2007
@@ -0,0 +1,1213 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.abdera.writer;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.xml.namespace.QName;
+
+import org.apache.abdera.NamedItem;
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.model.Content;
+import org.apache.abdera.model.Text;
+
+/**
+ * The StreamWriter interface provides a for producing Atom documents 
+ * based on a streaming api.  This approach provides a lightweight
+ * alternative to building up an object model 
+ */
+public interface StreamWriter 
+  extends NamedItem {
+
+  /**
+   * Set the target java.io.Writer
+   */
+  void setWriter(java.io.Writer writer);
+  
+  /**
+   * Set the target java.io.OutputStream
+   */
+  void setOutputStream(java.io.OutputStream out);
+  
+  /**
+   * Set the target java.io.OutputStream
+   */
+  void setOutputStream(java.io.OutputStream out, String charset);
+  
+  /**
+   * Start the document
+   * @param xmlversion The XML version
+   * @param charset the Character Encoding
+   */
+  void startDocument(String xmlversion, String charset);
+
+  /**
+   * Start the document
+   * @param xmlversion The XML version
+   */
+  void startDocument(String xmlversion);
+  
+  /**
+   * Start the document
+   */
+  void startDocument();
+ 
+  /**
+   * End the document
+   */
+  void endDocument();
+  
+  /**
+   * Start an atom:feed element
+   */
+  void startFeed();
+
+  /**
+   * Start an atom:feed element
+   * @param attribute Extension attributes
+   */
+  void startFeed(Map<QName,String> attributes);
+  
+  /**
+   * End the atom:feed element
+   */
+  void endFeed();
+  
+  /**
+   * Start an atom:entry element
+   */
+  void startEntry();
+  
+  /**
+   * Start an atom:entry element
+   * @param attribute Extension attributes
+   */
+  void startEntry(Map<QName,String> attributes);
+  
+  /**
+   * End the atom:entry element
+   */
+  void endEntry();
+  
+  /**
+   * Write an atom:id element
+   * @param iri The value
+   * @param attribute Extension attributes
+   */
+  void writeId(String iri, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:icon element
+   * @param iri The value
+   * @param attribute Extension attributes
+   */
+  void writeIcon(String iri, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:logo element
+   * @param iri The value
+   * @param attribute Extension attributes
+   */
+  void writeLogo(String iri, Map<QName,String> attributes);
+  
+  /**
+   * Write an IRI element element
+   * @param iri The value
+   * @param attribute Extension attributes
+   */
+  void writeIRIElement(QName qname, String iri, Map<QName,String> attributes);
+
+  /**
+   * Write an atom:id element
+   * @param iri The value
+   * @param attribute Extension attributes
+   */
+  void writeId(IRI iri, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:icon element
+   * @param iri The value
+   * @param attribute Extension attributes
+   */
+  void writeIcon(IRI iri, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:logo element
+   * @param iri The value
+   * @param attribute Extension attributes
+   */
+  void writeLogo(IRI iri, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:iri element
+   * @param iri The value
+   * @param attribute Extension attributes
+   */
+  void writeIRIElement(QName qname, IRI iri, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:id element
+   * @param iri The value
+   */
+  void writeId(String iri);
+  
+  /**
+   * Write an atom:icon element
+   * @param iri The value
+   */
+  void writeIcon(String iri);
+  
+  /**
+   * Write an atom:logo element
+   * @param iri The value
+   */
+  void writeLogo(String iri);
+  
+  /**
+   * Write an IRI element
+   * @param iri The value
+   */
+  void writeIRIElement(QName qname, String iri);
+
+  /**
+   * Write an atom:id element
+   * @param iri The value
+   */
+  void writeId(IRI iri);
+  
+  /**
+   * Write an atom:icon element
+   * @param iri The value
+   */
+  void writeIcon(IRI iri);
+  
+  /**
+   * Write an atom:logo element
+   * @param iri The value
+   */
+  void writeLogo(IRI iri);
+  
+  /**
+   * Write an IRI element
+   * @param iri The value
+   */
+  void writeIRIElement(QName qname, IRI iri);
+  
+  /**
+   * Write an atom:id element with a new IRI value
+   * @param iri The value
+   */
+  void writeId();
+
+  /**
+   * Write an atom:id element with a new IRI value
+   * @param iri The value
+   * @param attribute Extension attributes
+   */
+  void writeId(Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:updated element
+   * @param date The date value
+   * @param attributes Extension attributes
+   */
+  void writeUpdated(Date date, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:published element
+   * @param date The date value
+   * @param attributes Extension attributes
+   */
+  void writePublished(Date date, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:edited element
+   * @param date The date value
+   * @param attributes Extension attributes
+   */
+  void writeEdited(Date date, Map<QName,String> attributes);
+  
+  /**
+   * Write a Date element
+   * @param date The date value
+   * @param attributes Extension attributes
+   */
+  void writeDate(QName qname, Date date, Map<QName,String> attributes);
+
+  /**
+   * Write an atom:updated element
+   * @param date The date value
+   * @param attributes Extension attributes
+   */
+  void writeUpdated(String date, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:published element
+   * @param date The date value
+   * @param attributes Extension attributes
+   */
+  void writePublished(String date, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:edited element
+   * @param date The date value
+   * @param attributes Extension attributes
+   */
+  void writeEdited(String date, Map<QName,String> attributes);
+  
+  /**
+   * Write a Date element
+   * @param qname The element qname
+   * @param date The date value
+   * @param attributes Extension attributes
+   */
+  void writeDate(QName qname, String date, Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:updated element
+   * @param date The date value
+   */
+  void writeUpdated(Date date);
+  
+  /**
+   * Write an atom:published element
+   * @param date The date value
+   */
+  void writePublished(Date date);
+  
+  /**
+   * Write an atom:edited element
+   * @param date The date value
+   */
+  void writeEdited(Date date);
+  
+  /**
+   * Write a Date element
+   * @param qname The element qname
+   * @param date The date value
+   */
+  void writeDate(QName qname, Date date);
+
+  /**
+   * Write an atom:updated element
+   * @param date The date value
+   */
+  void writeUpdated(String date);
+  
+  /**
+   * Write an atom:published element
+   * @param date The date value
+   */
+  void writePublished(String date);
+  
+  /**
+   * Write an atom:edited element
+   * @param date The date value
+   */
+  void writeEdited(String date);
+  
+  /**
+   * Write a Date element
+   * @param qname The element qname
+   * @param date The date value
+   */
+  void writeDate(QName qname, String date);
+  
+  /**
+   * Write a person element
+   * @param qname The element qname
+   * @param name The person name
+   * @param email The person email
+   * @param uri The person uri
+   * @param attributes Extension attributes
+   */  
+  void writePerson(QName qname, String name, String email, String uri, Map<QName,String> attributes);
+  
+  /**
+   * Start a person element
+   * @param qname The element qname
+   * @param name The person name
+   * @param email The person email
+   * @param uri The person uri
+   * @param attributes Extension attributes
+   */  
+  void startPerson(QName qname, Map<QName,String> attributes);
+  
+  /**
+   * Write a person name element
+   * @param name The person name
+   * @param attributes Extension attributes
+   */
+  void writePersonName(String name,Map<QName,String> attributes);
+  
+  /**
+   * Write a person email element
+   * @param email The person email
+   * @param attributes Extension attributes
+   */
+  void writePersonEmail(String email,Map<QName,String> attributes);
+  
+  /**
+   * Write a person uri element
+   * @param uri The person uri
+   * @param attributes Extension attributes
+   */
+  void writePersonUri(String uri,Map<QName,String> attributes);
+  
+  /**
+   * End the person element
+   */
+  void endPerson();
+  
+  
+  /**
+   * Write an atom:link element
+   * @param iri The href value
+   * @param attributes Extension attributes
+   */
+  void writeLink(String iri,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param attributes Extension attributes
+   */
+  void writeLink(String iri, String rel,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param type The type value
+   * @param attributes Extension attributes
+   */
+  void writeLink(String iri, String rel, String type,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param type The type value
+   * @param title The title value
+   * @param hreflang The hreflang value
+   * @param length The link length
+   * @param attributes Extension attributes
+   */
+  void writeLink(String iri, String rel, String type, String title, String hreflang, int length,Map<QName,String> attributes);
+
+  /**
+   * Start a atom:link element
+   * @param iri The href value
+   * @param attributes Extension attributes
+   */
+  void startLink(String iri,Map<QName,String> attributes);
+
+  /**
+   * Start an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param attributes Extension attributes
+   */
+  void startLink(String iri, String rel,Map<QName,String> attributes);
+
+  /**
+   * Start an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param type The type value
+   * @param attributes Extension attributes
+   */
+  void startLink(String iri, String rel, String type,Map<QName,String> attributes);
+
+  /**
+   * Start an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param type The type value
+   * @param title The title value
+   * @param hreflang The hreflang value
+   * @param length The link length
+   * @param attributes Extension attributes
+   */
+  void startLink(String iri, String rel, String type, String title, String hreflang, int length,Map<QName,String> attributes);
+  
+  /**
+   * End the atom:link
+   */
+  void endLink();
+
+  /**
+   * Write an atom:link element
+   * @param iri The href value
+   */
+  void writeLink(String iri);
+
+  /**
+   * Write an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   */
+  void writeLink(String iri, String rel);
+  
+  /**
+   * Write an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param type The type value
+   */
+  void writeLink(String iri, String rel, String type);
+  
+  /**
+   * Write an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param type The type value
+   * @param title The title value
+   * @param hreflang The hreflang value
+   * @param length The link length
+   */
+  void writeLink(String iri, String rel, String type, String title, String hreflang, int length);
+  
+  /**
+   * Start an atom:link element
+   * @param iri The href value
+   */
+  void startLink(String iri);
+
+  /**
+   * Start an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   */
+  void startLink(String iri, String rel);
+  
+  /**
+   * Start an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param type The type value
+   */
+  void startLink(String iri, String rel, String type);
+  
+  /**
+   * Start an atom:link element
+   * @param iri The href value
+   * @param rel The rel value
+   * @param type The type value
+   * @param title The title value
+   * @param hreflang The hreflang value
+   * @param length The link length
+   */
+  void startLink(String iri, String rel, String type, String title, String hreflang, int length);
+  
+  /**
+   * Write an atom:category element
+   * @param term The term value
+   * @param attributes Extension attributes
+   */
+  void writeCategory(String term,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:category element
+   * @param term The term value
+   * @param scheme The term value
+   * @param attributes Extension attributes
+   */
+  void writeCategory(String term, String scheme,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:category element
+   * @param term The term value
+   * @param scheme The term value
+   * @param label The term value
+   * @param attributes Extension attributes
+   */
+  void writeCategory(String term, String scheme, String label,Map<QName,String> attributes);
+  
+  /**
+   * Start an atom:category element
+   * @param term The term value
+   * @param attributes Extension attributes
+   */
+  void startCategory(String term,Map<QName,String> attributes);
+
+  /**
+   * Start an atom:category element
+   * @param term The term value
+   * @param scheme The term value
+   * @param attributes Extension attributes
+   */
+  void startCategory(String term, String scheme,Map<QName,String> attributes);
+  
+  /**
+   * Start an atom:category element
+   * @param term The term value
+   * @param scheme The term value
+   * @param label The term value
+   * @param attributes Extension attributes
+   */
+  void startCategory(String term, String scheme, String label,Map<QName,String> attributes);
+  
+  /**
+   * End the atom:category
+   */
+  void endCategory();
+
+  /**
+   * Write an atom:category element
+   * @param term The term value
+   */
+  void writeCategory(String term);
+  
+  /**
+   * Write an atom:category element
+   * @param term The term value
+   * @param scheme The term value
+   */
+  void writeCategory(String term, String scheme);
+  
+  /**
+   * Write an atom:category element
+   * @param term The term value
+   * @param scheme The term value
+   * @param label The term value
+   */
+  void writeCategory(String term, String scheme, String label);
+  
+  /**
+   * Start an atom:category element
+   * @param term The term value
+   */
+  void startCategory(String term);
+  
+  /**
+   * Start an atom:category element
+   * @param term The term value
+   * @param scheme The term value
+   */
+  void startCategory(String term, String scheme);
+  
+  /**
+   * Start an atom:category element
+   * @param term The term value
+   * @param scheme The term value
+   * @param label The term value
+   */
+  void startCategory(String term, String scheme, String label);
+  
+  
+  /**
+   * Start an atom:source element
+   * @param attributes Extension attributes
+   */
+  void startSource(Map<QName,String> attributes);
+  
+  /**
+   * Start an atom:source element
+   */
+  void startSource();
+  
+  /**
+   * End the atom:source
+   */
+  void endSource();
+  
+  /**
+   * Write a Text element
+   * @param qname The element qname
+   * @param type The text type
+   * @param value The text value
+   * @param attribute Extension attributes
+   */
+  void writeText(QName qname, Text.Type type, String value,Map<QName,String> attributes);
+  
+  /**
+   * Start a Text element
+   * @param qname The element qname
+   * @param type The text type
+   * @param attribute Extension attributes
+   */
+  void startText(QName qname, Text.Type type,Map<QName,String> attributes);
+
+  /**
+   * Write a Text element
+   * @param qname The element qname
+   * @param type The text type
+   * @param value The text value
+   */
+  void writeText(QName qname, Text.Type type, String value);
+  
+  /**
+   * Start a Text element
+   * @param qname The element qname
+   * @param type The text type
+   */
+  void startText(QName qname, Text.Type type);
+  
+  /**
+   * Write an atom:content element
+   * @param type The text type
+   * @param value The text value
+   * @param attribute Extension attributes
+   */
+  void writeContent(Content.Type type, String value,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:content element
+   * @param type The text type
+   * @param value The text value
+   * @param attribute Extension attributes
+   */
+  void writeContent(Content.Type type, InputStream value,Map<QName,String> attributes) throws IOException;
+  
+  /**
+   * Write an atom:content element
+   * @param type The text type
+   * @param value The text value
+   * @param attribute Extension attributes
+   */
+  void writeContent(Content.Type type, DataHandler value,Map<QName,String> attributes) throws IOException;
+  
+  /**
+   * Write an atom:content element
+   * @param type The text type
+   * @param value The text value
+   * @param attribute Extension attributes
+   */
+  void writeContent(String type, String value,Map<QName,String> attributes);
+  
+  /**
+   * Start an atom:content element
+   * @param type The text type
+   * @param value The text value
+   * @param attribute Extension attributes
+   */
+  void startContent(Content.Type type,Map<QName,String> attributes);
+  
+  /**
+   * Start an atom:content element
+   * @param type The text type
+   * @param attribute Extension attributes
+   */
+  void startContent(String type,Map<QName,String> attributes);
+  
+  /**
+   * Start an atom:content element
+   * @param type The text type
+   * @param src The src value
+   * @param attribute Extension attributes
+   */
+  void startContent(Content.Type type, String src,Map<QName,String> attributes);
+
+  /**
+   * Start an atom:content element
+   * @param type The text type
+   * @param src The text value
+   * @param attribute Extension attributes
+   */
+  void startContent(String type, String src,Map<QName,String> attributes);
+    
+  /**
+   * End the atom:content element
+   */
+  void endContent();
+  
+  /**
+   * Write an atom:content element
+   * @param type The text type
+   * @param value The text value
+   */  
+  void writeContent(Content.Type type, String value);
+  
+  /**
+   * Write an atom:content element
+   * @param type The text type
+   * @param value The text value
+   */  
+  void writeContent(Content.Type type, InputStream value) throws IOException;
+  
+  /**
+   * Write an atom:content element
+   * @param type The text type
+   * @param value The text value
+   */  
+  void writeContent(Content.Type type, DataHandler value) throws IOException;
+  
+  /**
+   * Write an atom:content element
+   * @param type The text type
+   * @param value The text value
+   */  
+  void writeContent(String type, String value);
+  
+  /**
+   * Start an atom:content element
+   * @param type The text type
+   */  
+  void startContent(Content.Type type);
+  
+  /**
+   * Start an atom:content element
+   * @param type The text type
+   */  
+  void startContent(String type);
+  
+  /**
+   * Start an atom:content element
+   * @param type The text type
+   * @param src The src value
+   */  
+  void startContent(Content.Type type, String src);
+  
+  /**
+   * Start an atom:content element
+   * @param type The text type
+   * @param src The src value
+   */  
+  void startContent(String type, String src);
+  
+  /**
+   * Start an element
+   * @param qname Element qname
+   * @param attributes Extension attributes
+   */  
+  void startElement(QName qname,Map<QName,String> attributes);
+  
+  /**
+   * Start an element
+   * @param qname Element qname
+   */  
+  void startElement(QName qname);
+  
+  /**
+   * Write element text
+   * @param value The text value
+   */  
+  void writeElementText(String value);
+  
+  /**
+   * Write element text
+   * @param datahandler The text value
+   */  
+  void writeElementText(DataHandler datahandler) throws IOException;
+  
+  /**
+   * Write element text
+   * @param in The text value
+   */  
+  void writeElementText(InputStream in) throws IOException;
+  
+  /**
+   * End the element
+   */
+  void endElement();
+  
+  /**
+   * Write an atom:title element
+   * @param value The text value
+   */
+  void writeTitle(String value);
+  
+  /**
+   * Write an atom:title element
+   * @param type The text type
+   * @param value The text value
+   */
+  void writeTitle(Text.Type type, String value);
+
+  /**
+   * Write an atom:subtitle element
+   * @param value The text value
+   */
+  void writeSubtitle(String value);
+  
+  /**
+   * Write an atom:subtitle element
+   * @param type The text type
+   * @param value The text value
+   */
+  void writeSubtitle(Text.Type type, String value);
+  
+  /**
+   * Write an atom:summary element
+   * @param value The text value
+   */
+  void writeSummary(String value);
+  
+  /**
+   * Write an atom:summary element
+   * @param type The text type
+   * @param value The text value
+   */
+  void writeSummary(Text.Type type, String value);
+  
+  /**
+   * Write an atom:rights element
+   * @param value The text value
+   */
+  void writeRights(String value);
+  
+  /**
+   * Write an atom:rights element
+   * @param type The text type
+   * @param value The text value
+   */
+  void writeRights(Text.Type type, String value);
+  
+  /**
+   * Write an atom:title element
+   * @param value The text value
+   * @param attributes Extension attributes
+   */
+  void writeTitle(String value,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:title element
+   * @param type The text type
+   * @param value The text value
+   * @param attributes Extension attributes
+   */
+  void writeTitle(Text.Type type, String value,Map<QName,String> attributes);
+
+  /**
+   * Write an atom:subtitle element
+   * @param value The text value
+   * @param attributes Extension attributes
+   */
+  void writeSubtitle(String value,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:subtitle element
+   * @param type The text type
+   * @param value The text value
+   * @param attributes Extension attributes
+   */
+  void writeSubtitle(Text.Type type, String value,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:summary element
+   * @param value The text value
+   * @param attributes Extension attributes
+   */
+  void writeSummary(String value,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:summary element
+   * @param type The text type
+   * @param value The text value
+   * @param attributes Extension attributes
+   */
+  void writeSummary(Text.Type type, String value,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:rights element
+   * @param value The text value
+   * @param attributes Extension attributes
+   */
+  void writeRights(String value,Map<QName,String> attributes);
+  
+  /**
+   * Write an atom:rights element
+   * @param type The text type
+   * @param value The text value
+   * @param attributes Extension attributes
+   */
+  void writeRights(Text.Type type, String value,Map<QName,String> attributes);
+  
+  
+  /**
+   * Write a person element
+   * @param qname the element qname
+   * @param name The person name
+   * @param email The person email
+   * @param uri The person uri
+   */
+  void writePerson(QName qname, String name, String email, String uri);
+
+  /**
+   * Start a person element
+   * @param qname The element qname
+   */  
+  void startPerson(QName qname);
+  
+  /**
+   * Write a person name
+   * @param name The person name
+   */
+  void writePersonName(String name);
+
+  /**
+   * Write a person email
+   * @param email The person email
+   */
+  void writePersonEmail(String email);
+
+  /**
+   * Write a person uri
+   * @param uri The person uri
+   */
+  void writePersonUri(String uri);
+  
+  /**
+   * Write an atom:author element
+   * @param name The person name
+   * @param email The person email
+   * @param uri The person uri
+   */
+  void writeAuthor(String name, String email, String uri);
+  
+  /**
+   * Write an atom:author element
+   * @param name The person name
+   * @param email The person email
+   * @param uri The person uri
+   * @param attribute ExtensionAttributes
+   */
+  void writeAuthor(String name, String email, String uri, Map<QName,String> attributes);
+  
+  /**
+   * Start an atom:author element
+   */
+  void startAuthor();
+  
+  /**
+   * Start an atom:author element
+   * @params attributes ExtensionAttributes
+   */
+  void startAuthor(Map<QName,String> attributes);
+  
+  /**
+   * End the atom:author element
+   */
+  void endAuthor();
+  
+  /**
+   * Write an atom:contributor element
+   * @param name The person name
+   * @param email The person email
+   * @param uri The person uri
+   */
+  void writeContributor(String name, String email, String uri);
+  
+  /**
+   * Write an atom:contributor element
+   * @param name The person name
+   * @param email The person email
+   * @param uri The person uri
+   * @param attributes Extension attributes
+   */
+  void writeContributor(String name, String email, String uri, Map<QName,String> attributes);
+  
+  /**
+   * Start an atom:contributor element
+   */
+  void startContributor();
+  
+  /**
+   * Start an atom:contributor element
+   * @param attributes Extension attributes
+   */
+  void startContributor(Map<QName,String> attributes);
+  
+  /**
+   * End an atom:contributor element
+   */
+  void endContributor();
+  
+  /**
+   * Write an atom:generator element
+   * @param version The version value
+   * @param uri The uri value
+   * @param value The text value
+   */
+  void writeGenerator(String version, String uri, String value);
+
+  /**
+   * Write an atom:generator element
+   * @param version The version value
+   * @param uri The uri value
+   * @param value The text value
+   * @param attributes Extension attributes
+   */
+  void writeGenerator(String version, String uri, String value, Map<QName,String> attributes);
+
+  /**
+   * Start an atom:generator element
+   * @param version The version value
+   * @param uri The uri value
+   */
+  void startGenerator(String version, String uri);
+  
+  /**
+   * Start an atom:generator element
+   * @param version The version value
+   * @param uri The uri value
+   * @param attributes Extension attributes
+   */
+  void startGenerator(String version, String uri, Map<QName,String> attributes);
+  
+  /**
+   * End the atom:generator element
+   */
+  void endGenerator();
+  
+  /**
+   * Write an XML comment
+   */
+  void writeComment(String value);
+  
+  /**
+   * Write an XML Processing Instruction
+   */
+  void writePI(String value);
+
+  /**
+   * Write an XML Processing Instruction
+   */
+  void writePI(String value, String target);
+  
+  
+  /**
+   * Start an app:service element
+   */
+  void startService();
+  
+  /**
+   * Start an app:service element
+   * @param attributes Extension attributes
+   */
+  void startService(Map<QName,String> attributes);
+  
+  /**
+   * End an app:service element
+   */
+  void endService();
+  
+  /**
+   * Start an app:workspace element
+   */
+  void startWorkspace();
+  
+  /**
+   * Start an app:workspace element
+   * @param attributes Extension attributes
+   */
+  void startWorkspace(Map<QName,String> attributes);
+  
+  /**
+   * End an app:workspace element
+   */
+  void endWorkspace();
+  
+  /**
+   * Start an app:collection element
+   * @param href The href value
+   */
+  void startCollection(String href);
+  
+  /**
+   * Start an app:collection element
+   * @param href The href value
+   * @param attributes Extension attributes
+   */
+  void startCollection(String href, Map<QName,String> attributes);
+  
+  /**
+   * End an app:collection element
+   */
+  void endCollection();
+  
+  /**
+   * Writes app:accept elements
+   * @param accepts accept element values
+   */
+  void writeAccepts(String... accepts);
+  
+  /**
+   * Start an app:categories element
+   */
+  void startCategories();
+  
+  /**
+   * Start an app:categories element
+   * @param fixed True if the app:categories element is fixed
+   */
+  void startCategories(boolean fixed);
+  
+  /**
+   * Start an app:categories element
+   * @param fixed True if the app:categories element is fixed
+   * @param scheme The scheme value
+   */
+  void startCategories(boolean fixed, String scheme);
+  
+  /**
+  * Start an app:categories element
+  * @param attributes Extension attributes
+  */
+  void startCategories(Map<QName,String> attributes);
+  
+  /**
+  * Start an app:categories element
+  * @param fixed True if the app:categories element is fixed
+  * @param attributes Extension attributes
+  */
+  void startCategories(boolean fixed, Map<QName,String> attributes);
+  
+  /**
+   * Start an app:categories element
+   * @param fixed True if the app:categories element is fixed
+   * @param scheme The scheme value
+   * @param attributes Extension attributes
+   */
+  void startCategories(boolean fixed, String scheme, Map<QName,String> attributes);
+  
+  /**
+   * End the app:categories element
+   */
+  void endCategories();
+
+  /**
+   * Start the app:control element
+   */
+  void startControl();
+  
+  /**
+   * Start the app:control element
+   * @param attributes Extension attributes
+   */
+  void startControl(Map<QName,String> attributes);
+  
+  /**
+   * End the app:control element
+   */
+  void endControl();
+  
+  /**
+   * Write an app:draft element
+   * @param draft true if app:draft=yes
+   */
+  void writeDraft(boolean draft);
+  
+}
+

Modified: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/WriterFactory.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/WriterFactory.java?rev=591523&r1=591522&r2=591523&view=diff
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/WriterFactory.java (original)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/writer/WriterFactory.java Fri Nov  2 17:32:39 2007
@@ -44,4 +44,19 @@
    * @return A matching writer
    */
   <T extends Writer>T getWriterByMediaType(String mediatype);
+  
+  
+  /**
+   * Get the default StreamWriter. This is equivalent to calling 
+   * abdera.getStreamWriter();
+   * @return The default stream writer
+   */
+  <T extends StreamWriter>T newStreamWriter();
+  
+  /**
+   * Get the named StreamWriter.
+   * @param name The name of the StreamWriter
+   * @return The specified StreamWriter
+   */
+  <T extends StreamWriter>T newStreamWriter(String name);
 }

Added: incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/simple/StreamWriterExample.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/simple/StreamWriterExample.java?rev=591523&view=auto
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/simple/StreamWriterExample.java (added)
+++ incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/simple/StreamWriterExample.java Fri Nov  2 17:32:39 2007
@@ -0,0 +1,86 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.examples.simple;
+
+import java.util.Date;
+
+import javax.xml.namespace.QName;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.writer.StreamWriter;
+
+/**
+ * Demonstrates the use of the Abdera StreamWriter interface
+ */
+public class StreamWriterExample {
+
+  public static void main(String... args) {
+    
+    Abdera abdera = Abdera.getInstance();
+    
+    StreamWriter out = abdera.newStreamWriter();
+    
+    out.setOutputStream(System.out,"UTF-8");
+    
+    out.startDocument();
+    out.startFeed();
+    
+    out.writeId("http://example.org");
+    out.writeTitle("<Testing 123>");
+    out.writeSubtitle("Foo");
+    out.writeAuthor("James", null, null);
+    out.writeUpdated(new Date());
+      
+    out.writeLink("http://example.org/foo");
+    out.writeLink("http://example.org/bar","self");
+      
+    out.writeCategory("foo");
+    out.writeCategory("bar");
+      
+    out.writeLogo("logo");
+    out.writeIcon("icon");
+    out.writeGenerator("1.0", "http://example.org", "foo");
+      
+    for (int n = 0; n < 100; n++) {
+      out.startEntry();
+      
+      out.writeId("http://example.org/" + n);
+      out.writeTitle("Entry #" + n);
+      out.writeUpdated(new Date());
+      out.writePublished(new Date());
+      out.writeEdited(new Date());
+      out.writeSummary("This is text summary");
+      out.writeAuthor("James", null, null);
+      out.writeContributor("Joe", null, null);
+      out.startContent("application/xml");
+        out.startElement(new QName("a","b","c"));
+          out.startElement(new QName("x","y","z"));
+            out.writeElementText("This is a test");
+          out.endElement();
+        out.endElement();
+      out.endContent();
+      out.endEntry();
+    }
+      
+    out.endFeed();
+    out.endDocument();
+
+    
+  }
+  
+}

Modified: incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMWriterFactory.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMWriterFactory.java?rev=591523&r1=591522&r2=591523&view=diff
==============================================================================
--- incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMWriterFactory.java (original)
+++ incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMWriterFactory.java Fri Nov  2 17:32:39 2007
@@ -21,7 +21,9 @@
 import java.util.Map;
 
 import org.apache.abdera.Abdera;
+import org.apache.abdera.util.Messages;
 import org.apache.abdera.writer.NamedWriter;
+import org.apache.abdera.writer.StreamWriter;
 import org.apache.abdera.writer.Writer;
 import org.apache.abdera.writer.WriterFactory;
 
@@ -31,6 +33,7 @@
 
   private final Abdera abdera;
   private final Map<String,NamedWriter> writers;
+  private final Map<String,Class<? extends StreamWriter>> streamwriters;
   
   public FOMWriterFactory() {
     this(new Abdera());
@@ -40,6 +43,9 @@
     this.abdera = abdera;
     Map<String,NamedWriter>  w = getAbdera().getConfiguration().getNamedWriters();
     writers = (w != null) ? w : new HashMap<String,NamedWriter>();
+    
+    Map<String,Class<? extends StreamWriter>> s = getAbdera().getConfiguration().getStreamWriters();
+    streamwriters = (s != null) ? s : new HashMap<String,Class<? extends StreamWriter>>();
   }
   
   protected Abdera getAbdera() {
@@ -65,6 +71,30 @@
   
   private Map<String,NamedWriter> getWriters() {
     return writers;
+  }
+
+  private Map<String,Class<? extends StreamWriter>> getStreamWriters() {
+    return streamwriters;
+  }
+  
+  public <T extends StreamWriter> T newStreamWriter() {
+    return (T)getAbdera().newStreamWriter();
+  }
+
+  public <T extends StreamWriter> T newStreamWriter(String name) {
+    Class<? extends StreamWriter> _class = getStreamWriters().get(name);
+    StreamWriter sw = null;
+    if (_class != null) {
+      try {
+        sw = _class.newInstance();
+      } catch (Exception e) {
+        throw new RuntimeException(
+          Messages.format(
+            "IMPLEMENTATION.NOT.AVAILABLE",
+            "StreamWriter"),e);
+      }
+    }
+    return (T)sw;
   }
   
 }

Added: incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java?rev=591523&view=auto
==============================================================================
--- incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java (added)
+++ incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/StaxStreamWriter.java Fri Nov  2 17:32:39 2007
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.abdera.parser.stax;
+
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.abdera.parser.stax.util.FOMHelper;
+import org.apache.abdera.util.AbstractStreamWriter;
+import org.apache.axiom.om.util.StAXUtils;
+
+public class StaxStreamWriter 
+  extends AbstractStreamWriter {
+  
+  private static final String NAME = "default";
+  
+  private XMLStreamWriter writer;
+  
+  public StaxStreamWriter() {
+    super(NAME);
+  }
+  
+  public StaxStreamWriter(
+    Writer writer) {
+    super(NAME);
+    setWriter(writer);
+  }
+
+  public StaxStreamWriter(
+    OutputStream out) {
+      super(NAME);
+      setOutputStream(out);
+  }
+  
+  public StaxStreamWriter(
+    OutputStream out, 
+    String charset) {
+    super(NAME);
+    setOutputStream(out,charset);
+  }
+
+  public void setWriter(java.io.Writer writer) {
+    try {
+      this.writer = StAXUtils.createXMLStreamWriter(writer);
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+  public void setOutputStream(java.io.OutputStream out) {
+    try {
+      this.writer = StAXUtils.createXMLStreamWriter(out,"UTF-8");
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+  public void setOutputStream(java.io.OutputStream out, String charset) {
+    try {
+      this.writer = StAXUtils.createXMLStreamWriter(out,charset);
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+  
+  public void startDocument(String xmlversion, String charset) {
+    try {
+      writer.writeStartDocument(xmlversion,charset);
+    } catch(XMLStreamException e) {
+      throw new RuntimeException(e);
+    }    
+  }
+  
+  public void startDocument(String xmlversion) {
+    try {
+      writer.writeStartDocument(xmlversion);
+    } catch(XMLStreamException e) {
+      throw new RuntimeException(e);
+    }
+  }
+  
+  public void endDocument() {
+    try {
+      writer.writeEndDocument();
+    } catch(XMLStreamException e) {
+      throw new RuntimeException(e);
+    }
+  }
+ 
+  public void endElement() {
+    try {
+      pop();
+      writer.writeEndElement();
+    } catch(XMLStreamException e) {
+      throw new RuntimeException(e);
+    }
+  }
+  
+  private void writeNamespace(QName qname, boolean attr) throws XMLStreamException {
+    String prefix = qname.getPrefix();
+    String namespace = qname.getNamespaceURI();
+    prefix = prefix != null ? prefix : "";
+    if (!declared(prefix,namespace)) {
+      if (attr && (namespace == null || "".equals(namespace))) return;
+      if (prefix != null)
+        writer.writeNamespace(prefix,namespace);
+      else
+        writer.writeDefaultNamespace(namespace);
+      declare(prefix,namespace);
+    }
+  }
+  
+  public void startElement(QName qname, Map<QName, String> attributes) {
+    try {
+      push();
+      writer.writeStartElement(qname.getPrefix(),qname.getLocalPart(),qname.getNamespaceURI());
+      writeNamespace(qname,false);
+      if (attributes != null) {
+        for (QName attr : attributes.keySet()) 
+          writeNamespace(attr,true);
+        for (QName attr : attributes.keySet()) {
+          writer.writeAttribute(
+            attr.getPrefix(), 
+            attr.getNamespaceURI(),
+            attr.getLocalPart(),
+            attributes.get(attr));
+        }
+      }
+    } catch(XMLStreamException e) {
+      throw new RuntimeException(e);
+    }
+  }
+  
+  public void writeElementText(String value) {
+    try {
+      writer.writeCharacters(value);
+    } catch(XMLStreamException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  public void writeComment(String value) {
+    try {
+      writer.writeComment(value);
+    } catch(XMLStreamException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  public void writePI(String value) {
+    try {
+      writer.writeProcessingInstruction(value);
+    } catch(XMLStreamException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  public void writePI(String value, String target) {
+    try {
+      writer.writeProcessingInstruction(value,target);
+    } catch(XMLStreamException e) {
+      throw new RuntimeException(e);
+    }
+  }
+  
+  private final Stack<Map<String,String>> namespaces = new Stack<Map<String,String>>();
+  
+  private void push() {
+    namespaces.push(new HashMap<String,String>());
+  }
+  
+  private void pop() {
+    if (!namespaces.isEmpty()) namespaces.pop();
+  }
+  
+  private boolean declared(String prefix, String namespace) {
+    for (int n = namespaces.size() - 1; n >= 0; n--) {
+      Map<String,String> frame = namespaces.get(n);
+      String chk = frame.get(prefix);
+      if (chk == null && namespace == null) return true;
+      if (chk == null && namespace != null) continue;
+      if (chk != null && namespace == null) continue;
+      if (chk.equals(namespace)) return true;
+    }
+    return false;
+  }
+  
+  private void declare(String prefix, String namespace) {
+    if (namespaces.isEmpty()) return;
+    Map<String,String> frame = namespaces.peek();
+    frame.put(prefix, namespace);
+  }
+
+  public void writeId(Map<QName,String> attributes) {
+    writeId(FOMHelper.generateUuid(),attributes);
+  }
+    
+}