/*
* 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.nio.channels.Channels;
import java.nio.channels.WritableByteChannel;
import java.util.Date;
import java.util.Formatter;
import java.util.Locale;
import javax.activation.DataHandler;
import javax.xml.namespace.QName;
import org.apache.abdera.Abdera;
import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.i18n.rfc4646.Lang;
import org.apache.abdera.model.AtomDate;
import org.apache.abdera.model.Content;
import org.apache.abdera.model.Text;
import org.apache.abdera.model.Text.Type;
import org.apache.abdera.writer.StreamWriter;
import org.apache.commons.codec.binary.Base64;
public abstract class AbstractStreamWriter
implements StreamWriter {
protected final Abdera abdera;
protected final String name;
protected boolean autoflush = false;
protected boolean autoclose = false;
protected boolean autoindent = false;
protected AbstractStreamWriter(
Abdera abdera,
String name) {
this.abdera = abdera;
this.name = name;
}
public StreamWriter setAutoflush(boolean auto) {
this.autoflush = auto;
return this;
}
public StreamWriter setAutoclose(boolean auto) {
this.autoclose = auto;
return this;
}
public StreamWriter setChannel(WritableByteChannel channel) {
return setOutputStream(Channels.newOutputStream(channel));
}
public StreamWriter setChannel(WritableByteChannel channel, String charset) {
return setWriter(Channels.newWriter(channel, charset));
}
public String getName() {
return name;
}
public StreamWriter startDocument() {
return startDocument("1.0");
}
public StreamWriter endDocument() {
return this;
}
public StreamWriter startFeed() {
return startElement(Constants.FEED);
}
public StreamWriter endFeed() {
return endElement();
}
public StreamWriter startEntry() {
return startElement(Constants.ENTRY);
}
public StreamWriter endEntry() {
return endElement();
}
public StreamWriter endCategory() {
return endElement();
}
public StreamWriter endContent() {
return endElement();
}
public StreamWriter endLink() {
return endElement();
}
public StreamWriter endPerson() {
return endElement();
}
public StreamWriter endSource() {
return endElement();
}
public StreamWriter endText() {
return endElement();
}
public StreamWriter startLink(
String iri,
String rel,
String type,
String title,
String hreflang,
long length) {
return
startElement(Constants.LINK).
writeAttribute("href",iri).
writeAttribute("rel",rel).
writeAttribute("type",type).
writeAttribute("title",title).
writeAttribute("hreflang",hreflang).
writeAttribute("length",length > -1 ? String.valueOf(length) : null);
}
public StreamWriter startPerson(
QName qname) {
return startElement(qname);
}
public StreamWriter startSource() {
return startElement(Constants.SOURCE);
}
public StreamWriter startText(
QName qname,
Text.Type type) {
return
startElement(qname).
writeAttribute("type",type!=null?type.name().toLowerCase():"text");
}
public StreamWriter writeDate(
QName qname,
String date) {
return
startElement(qname).
writeElementText(date).
endElement();
}
public StreamWriter writeIRIElement(
QName qname,
String iri) {
return
startElement(qname).
writeElementText(iri).
endElement();
}
public StreamWriter writePersonEmail(
String email) {
if (email == null) return this;
return
startElement(Constants.EMAIL).
writeElementText(email).
endElement();
}
public StreamWriter writePersonName(
String name) {
if (name == null) return this;
return
startElement(Constants.NAME).
writeElementText(name).
endElement();
}
public StreamWriter writePersonUri(
String uri) {
if (uri == null) return this;
return
startElement(Constants.URI).
writeElementText(uri).
endElement();
}
public StreamWriter startContent(
Content.Type type,
String src) {
return startContent(type.name().toLowerCase(),src);
}
public StreamWriter startContent(
String type,
String src) {
return startElement(Constants.CONTENT).
writeAttribute("type",type).
writeAttribute("src",src);
}
public StreamWriter startContent(
Content.Type type) {
return startContent(type,null);
}
public StreamWriter startContent(
String type) {
return startContent(type,null);
}
public StreamWriter startLink(
String iri) {
return startLink(iri,null,null,null,null,-1);
}
public StreamWriter startLink(
String iri,
String rel) {
return startLink(iri,rel,null,null,null,-1);
}
public StreamWriter startLink(
String iri,
String rel,
String type) {
return startLink(iri,rel,type,null,null,-1);
}
public StreamWriter writeCategory(
String term) {
return writeCategory(term,null,null);
}
public StreamWriter writeCategory(
String term,
String scheme) {
return writeCategory(term,scheme,null);
}
public StreamWriter writeCategory(
String term,
String scheme,
String label) {
return
startElement(Constants.CATEGORY).
writeAttribute("term",term).
writeAttribute("scheme",scheme).
writeAttribute("label",label).
endElement();
}
public StreamWriter writeContent(
Content.Type type,
String value) {
return startContent(type).
writeElementText(value).
endContent();
}
public StreamWriter writeContent(
Content.Type type,
InputStream value) throws IOException {
return startContent(type).
writeElementText(value).
endContent();
}
public StreamWriter writeContent(
Content.Type type,
DataHandler value) throws IOException {
return
startContent(type).
writeElementText(value).
endContent();
}
public StreamWriter writeContent(
String type,
String value) {
return
startContent(type).
writeElementText(value).
endContent();
}
public StreamWriter writeEdited(
Date date) {
writeDate(Constants.EDITED, date);
return this;
}
public StreamWriter writeId(
String iri) {
return writeIRIElement(Constants.ID, iri);
}
public StreamWriter writeIcon(
String iri) {
return writeIRIElement(Constants.ICON, iri);
}
public StreamWriter writeLogo(
String iri) {
return writeIRIElement(Constants.LOGO, iri);
}
public StreamWriter writeLink(
String iri) {
return writeLink(iri,null,null,null,null,-1);
}
public StreamWriter writeLink(
String iri,
String rel) {
return writeLink(iri,rel,null,null,null,-1);
}
public StreamWriter writeLink(
String iri,
String rel,
String type) {
return writeLink(iri,rel,type,null,null,-1);
}
public StreamWriter writeLink(
String iri,
String rel,
String type,
String title,
String hreflang,
long length) {
return
startLink(iri, rel, type, title, hreflang, length).
endLink();
}
public StreamWriter writePerson(
QName qname,
String name,
String email,
String uri) {
return
startPerson(qname).
writePersonName(name).
writePersonEmail(email).
writePersonUri(uri).
endPerson();
}
public StreamWriter writePublished(
Date date) {
return writeDate(Constants.PUBLISHED,date);
}
public StreamWriter writeText(
QName qname,
Text.Type type,
String value) {
return
startText(qname,type).
writeElementText(value).
endElement();
}
public StreamWriter writeUpdated(
Date date) {
return writeDate(Constants.UPDATED,date);
}
public StreamWriter writeUpdated(String date) {
return writeDate(Constants.UPDATED, date);
}
public StreamWriter writePublished(String date) {
return writeDate(Constants.PUBLISHED, date);
}
public StreamWriter writeEdited(String date) {
return writeDate(Constants.EDITED, date);
}
public StreamWriter writeDate(QName qname, Date date) {
return writeDate(qname, AtomDate.format(date));
}
public StreamWriter writeId(IRI iri) {
return writeIRIElement(Constants.ID, iri);
}
public StreamWriter writeIcon(IRI iri) {
return writeIRIElement(Constants.ICON, iri);
}
public StreamWriter writeLogo(IRI iri) {
return writeIRIElement(Constants.LOGO, iri);
}
public StreamWriter writeIRIElement(QName qname, IRI iri) {
return writeIRIElement(qname, iri.toString());
}
public StreamWriter 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"));
return this;
}
public StreamWriter writeElementText(DataHandler value) throws IOException {
writeElementText(value.getInputStream());
return this;
}
public StreamWriter writeTitle(String value) {
return writeText(Constants.TITLE, Text.Type.TEXT, value);
}
public StreamWriter writeTitle(Text.Type type, String value) {
return writeText(Constants.TITLE, type, value);
}
public StreamWriter writeSubtitle(String value) {
return writeText(Constants.SUBTITLE, Text.Type.TEXT, value);
}
public StreamWriter writeSubtitle(Text.Type type, String value) {
return writeText(Constants.SUBTITLE, type, value);
}
public StreamWriter writeSummary(String value) {
return writeText(Constants.SUMMARY, Text.Type.TEXT, value);
}
public StreamWriter writeSummary(Text.Type type, String value) {
return writeText(Constants.SUMMARY, type, value);
}
public StreamWriter writeRights(String value) {
return writeText(Constants.RIGHTS, Text.Type.TEXT, value);
}
public StreamWriter writeRights(Text.Type type, String value) {
return writeText(Constants.RIGHTS, type, value);
}
public StreamWriter writeAuthor(String name, String email, String uri) {
return writePerson(Constants.AUTHOR,name,email,uri);
}
public StreamWriter writeAuthor(String name) {
return writeAuthor(name, null, null);
}
public StreamWriter startAuthor() {
return startElement(Constants.AUTHOR);
}
public StreamWriter endAuthor() {
return endElement();
}
public StreamWriter writeContributor(String name, String email, String uri) {
return writePerson(Constants.CONTRIBUTOR,name,email,uri);
}
public StreamWriter writeContributor(String name) {
return writeContributor(name,null,null);
}
public StreamWriter startContributor() {
return startElement(Constants.CONTRIBUTOR);
}
public StreamWriter endContributor() {
return endElement();
}
public StreamWriter writeGenerator(String version, String uri, String value) {
return
startElement(Constants.GENERATOR).
writeAttribute("version",version).
writeAttribute("uri",uri).
writeElementText(value).
endElement();
}
public StreamWriter startGenerator(String version, String uri) {
return
startElement(Constants.GENERATOR).
writeAttribute("version",version).
writeAttribute("uri",uri);
}
public StreamWriter endGenerator() {
return endElement();
}
public StreamWriter startCategory(String term) {
return startCategory(term,null,null);
}
public StreamWriter startCategory(String term, String scheme) {
return startCategory(term,scheme,null);
}
public StreamWriter startCategory(String term, String scheme, String label) {
return
startElement(Constants.CATEGORY).
writeAttribute("term",term).
writeAttribute("scheme",scheme).
writeAttribute("label",label);
}
public StreamWriter startService() {
return startElement(Constants.SERVICE);
}
public StreamWriter endService() {
return endElement();
}
public StreamWriter startWorkspace() {
return startElement(Constants.WORKSPACE);
}
public StreamWriter endWorkspace() {
return endElement();
}
public StreamWriter startCollection(String href) {
return
startElement(Constants.COLLECTION).
writeAttribute("href",href);
}
public StreamWriter endCollection() {
endElement();
return this;
}
public StreamWriter writeAccepts(String... accepts) {
for (String accept : accepts) {
startElement(Constants.ACCEPT).
writeElementText(accept).
endElement();
}
return this;
}
public StreamWriter writeAcceptsEntry() {
return writeAccepts("application/atom+xml;type=entry");
}
public StreamWriter writeAcceptsNothing() {
return writeAccepts("");
}
public StreamWriter startCategories() {
return startCategories(false,null);
}
public StreamWriter startCategories(boolean fixed) {
return startCategories(fixed,null);
}
public StreamWriter startCategories(boolean fixed, String scheme) {
startElement(Constants.CATEGORIES);
if (fixed) {
writeAttribute("fixed", "yes");
}
if (scheme != null && scheme.length() > 0) {
writeAttribute("scheme",scheme);
}
return this;
}
public StreamWriter endCategories() {
return endElement();
}
public StreamWriter startControl() {
return startElement(Constants.CONTROL);
}
public StreamWriter endControl() {
return endElement();
}
public StreamWriter writeDraft(boolean draft) {
return
startElement(Constants.DRAFT).
writeElementText(draft?"yes":"no").
endElement();
}
public StreamWriter writeAttribute(
String name,
String value) {
if (value == null) return this;
return writeAttribute(
name,
null,
null,
value);
}
public StreamWriter writeAttribute(
String name,
String namespace,
String value) {
if (value == null) return this;
return writeAttribute(
name,
namespace,
null,
value);
}
public StreamWriter writeAttribute(
QName qname,
String value) {
if (value == null) return this;
return writeAttribute(
qname.getLocalPart(),
qname.getNamespaceURI(),
qname.getPrefix(), value);
}
public StreamWriter startElement(QName qname) {
return startElement(
qname.getLocalPart(),
qname.getNamespaceURI(),
qname.getPrefix());
}
public StreamWriter startElement(String name) {
return startElement(name,null,null);
}
public StreamWriter startElement(
String name,
String namespace) {
return startElement(name,namespace,null);
}
public StreamWriter setAutoIndent(boolean indent) {
this.autoindent = indent;
return this;
}
public StreamWriter writeAttribute(
QName qname,
Date value) {
return writeAttribute(
qname.getLocalPart(),
qname.getNamespaceURI(),
qname.getPrefix(),
value);
}
public StreamWriter writeAttribute(
String name,
Date value) {
return writeAttribute(
name, null, null, value);
}
public StreamWriter writeAttribute(
String name,
String namespace,
Date value) {
return writeAttribute(
name,
namespace,
null,
value);
}
public StreamWriter writeAttribute(
String name,
String namespace,
String prefix,
Date value) {
return writeAttribute(
name,
namespace,
prefix,
AtomDate.format(value));
}
public StreamWriter writeAttribute(
QName qname,
int value) {
return writeAttribute(
qname.getLocalPart(),
qname.getNamespaceURI(),
qname.getPrefix(),
value);
}
public StreamWriter writeAttribute(
String name,
int value) {
return writeAttribute(
name, null, null, value);
}
public StreamWriter writeAttribute(
String name,
String namespace,
int value) {
return writeAttribute(
name,
namespace,
null,
value);
}
public StreamWriter writeAttribute(
String name,
String namespace,
String prefix,
int value) {
return writeAttribute(
name,
namespace,
prefix,
Integer.toString(value));
}
public StreamWriter writeAttribute(
QName qname,
long value) {
return writeAttribute(
qname.getLocalPart(),
qname.getNamespaceURI(),
qname.getPrefix(),
value);
}
public StreamWriter writeAttribute(
String name,
long value) {
return writeAttribute(
name, null, null, value);
}
public StreamWriter writeAttribute(
String name,
String namespace,
long value) {
return writeAttribute(
name,
namespace,
null,
value);
}
public StreamWriter writeAttribute(
String name,
String namespace,
String prefix,
long value) {
return writeAttribute(
name,
namespace,
prefix,
Long.toString(value));
}
public StreamWriter writeAttribute(
QName qname,
double value) {
return writeAttribute(
qname.getLocalPart(),
qname.getNamespaceURI(),
qname.getPrefix(),
value);
}
public StreamWriter writeAttribute(
String name,
double value) {
return writeAttribute(
name, null, null, value);
}
public StreamWriter writeAttribute(
String name,
String namespace,
double value) {
return writeAttribute(
name,
namespace,
null,
value);
}
public StreamWriter writeAttribute(
String name,
String namespace,
String prefix,
double value) {
return writeAttribute(
name,
namespace,
prefix,
Double.toString(value));
}
public StreamWriter writeElementText(Date value) {
return writeElementText(AtomDate.format(value));
}
public StreamWriter writeElementText(int value) {
return writeElementText(Integer.toString(value));
}
public StreamWriter writeElementText(long value) {
return writeElementText(Long.toString(value));
}
public StreamWriter writeElementText(double value) {
return writeElementText(Double.toString(value));
}
public StreamWriter writeBase(String iri) {
return writeAttribute(Constants.BASE, iri);
}
public StreamWriter writeBase(IRI iri) {
return writeBase(iri.toString());
}
public StreamWriter writeLanguage(String lang) {
return writeAttribute(Constants.LANG, lang);
}
public StreamWriter writeLanguage(Lang lang) {
return writeLanguage(lang.toString());
}
public StreamWriter writeLanguage(Locale locale) {
return writeLanguage(new Lang(locale));
}
public StreamWriter writeIRIElement(String name, IRI iri) {
return
startElement(name).
writeElementText(iri.toString()).
endElement();
}
public StreamWriter writeIRIElement(String name, String namespace, IRI iri) {
return
startElement(name,namespace).
writeElementText(iri.toString()).
endElement();
}
public StreamWriter writeIRIElement(
String name,
String namespace,
String prefix,
IRI iri) {
return
startElement(name,namespace,prefix).
writeElementText(iri.toString()).
endElement();
}
public StreamWriter writeIRIElement(
String name,
String namespace,
String prefix,
String iri) {
return
startElement(name,namespace,prefix).
writeElementText(iri).
endElement();
}
public StreamWriter writeIRIElement(
String name,
String namespace,
String iri) {
return
startElement(name,namespace).
writeElementText(iri).
endElement();
}
public StreamWriter writeIRIElement(
String name,
String iri) {
return
startElement(name).
writeElementText(iri).
endElement();
}
public StreamWriter writeDate(
String name,
Date date) {
return
startElement(name).
writeElementText(date).
endElement();
}
public StreamWriter writeDate(
String name,
String namespace,
Date date) {
return
startElement(name,namespace).
writeElementText(date).
endElement();
}
public StreamWriter writeDate(
String name,
String namespace,
String prefix,
Date date) {
return
startElement(name,namespace,prefix).
writeElementText(date).
endElement();
}
public StreamWriter writeDate(
String name,
String date) {
return
startElement(name).
writeElementText(date).
endElement();
}
public StreamWriter writeDate(
String name,
String namespace,
String date) {
return
startElement(name,namespace).
writeElementText(date).
endElement();
}
public StreamWriter writeDate(
String name,
String namespace,
String prefix,
String date) {
return
startElement(name,namespace,prefix).
writeElementText(date).
endElement();
}
public StreamWriter startText(
String name,
String namespace,
String prefix,
Type type) {
return
startElement(name,namespace,prefix).
writeAttribute("type",type!=null?type.name().toLowerCase():"text");
}
public StreamWriter startText(
String name,
String namespace,
Type type) {
return
startElement(name,namespace).
writeAttribute("type",type!=null?type.name().toLowerCase():"text");
}
public StreamWriter startText(
String name,
Type type) {
return
startElement(name).
writeAttribute("type",type!=null?type.name().toLowerCase():"text");
}
public StreamWriter writeText(
String name,
String namespace,
String prefix,
Type type,
String value) {
return
startText(name,namespace,prefix,type).
writeElementText(value).
endElement();
}
public StreamWriter writeText(
String name,
String namespace,
Type type,
String value) {
return
startText(name,namespace,type).
writeElementText(value).
endElement();
}
public StreamWriter writeText(
String name,
Type type,
String value) {
return
startText(name,type).
writeElementText(value).
endElement();
}
public StreamWriter startPerson(
String name,
String namespace,
String prefix) {
return startElement(name,namespace,prefix);
}
public StreamWriter startPerson(
String name,
String namespace) {
return startElement(name,namespace);
}
public StreamWriter startPerson(String name) {
return startElement(name);
}
public StreamWriter writePerson(
String localname,
String namespace,
String prefix,
String name,
String email,
String uri) {
return
startPerson(localname,namespace,prefix).
writePersonName(name).
writePersonEmail(email).
writePersonUri(uri).
endPerson();
}
public StreamWriter writePerson(
String localname,
String namespace,
String name,
String email,
String uri) {
return
startPerson(localname,namespace).
writePersonName(name).
writePersonEmail(email).
writePersonUri(uri).
endPerson();
}
public StreamWriter writePerson(
String localname,
String name,
String email,
String uri) {
return
startPerson(localname).
writePersonName(name).
writePersonEmail(email).
writePersonUri(uri).
endPerson();
}
public Appendable append(
char c)
throws IOException {
return writeElementText(
String.valueOf(c));
}
public Appendable append(
CharSequence csq,
int start,
int end)
throws IOException {
return append(
csq.subSequence(
start, end));
}
public Appendable append(
CharSequence csq)
throws IOException {
return writeElementText(
csq.toString());
}
public StreamWriter writeElementText(String format, Object... args) {
new Formatter(this).format(format,args);
return this;
}
}