diff options
author | daniel oeh <daniel.oeh@gmail.com> | 2014-03-31 19:45:03 +0200 |
---|---|---|
committer | daniel oeh <daniel.oeh@gmail.com> | 2014-03-31 19:45:03 +0200 |
commit | 5a6c7ef43a89ae03c6de94f070314ec5bc5c3c9d (patch) | |
tree | 3cbd1b8368555ba5867ae68c5246c2a4490c5fc9 /src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator | |
parent | b2de7512f4c871e882760bfe8bffa27d10c1c68a (diff) | |
download | AntennaPod-5a6c7ef43a89ae03c6de94f070314ec5bc5c3c9d.zip |
Added feed generators, basic rss tests
Diffstat (limited to 'src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator')
4 files changed, 264 insertions, 0 deletions
diff --git a/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/AtomGenerator.java b/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/AtomGenerator.java new file mode 100644 index 000000000..a47321427 --- /dev/null +++ b/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/AtomGenerator.java @@ -0,0 +1,106 @@ +package instrumentationTest.de.test.antennapod.util.syndication.feedgenerator; + +import android.util.Xml; +import de.danoeh.antennapod.feed.Feed; +import de.danoeh.antennapod.feed.FeedItem; +import de.danoeh.antennapod.feed.FeedMedia; +import de.danoeh.antennapod.syndication.util.SyndDateUtils; +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Creates Atom feeds. See FeedGenerator for more information. + */ +public class AtomGenerator implements FeedGenerator{ + + private static final String NS_ATOM = "http://www.w3.org/2005/Atom"; + + public static final long FEATURE_USE_RFC3339LOCAL = 1; + + @Override + public void writeFeed(Feed feed, OutputStream outputStream, String encoding, long flags) throws IOException { + if (feed == null) throw new IllegalArgumentException("feed = null"); + if (outputStream == null) throw new IllegalArgumentException("outputStream = null"); + if (encoding == null) throw new IllegalArgumentException("encoding = null"); + + XmlSerializer xml = Xml.newSerializer(); + xml.setOutput(outputStream, encoding); + xml.startDocument(encoding, null); + + xml.startTag(null, "feed"); + xml.attribute(null, "xmlns", NS_ATOM); + + // Write Feed data + if (feed.getIdentifyingValue() != null) { + xml.startTag(null, "id"); + xml.text(feed.getIdentifyingValue()); + xml.endTag(null, "id"); + } + if (feed.getTitle() != null) { + xml.startTag(null, "title"); + xml.text(feed.getTitle()); + xml.endTag(null, "title"); + } + if (feed.getLink() != null) { + xml.startTag(null, "link"); + xml.attribute(null, "rel", "alternate"); + xml.attribute(null, "href", feed.getLink()); + xml.endTag(null, "link"); + } + if (feed.getDescription() != null) { + xml.startTag(null, "subtitle"); + xml.text(feed.getDescription()); + xml.endTag(null, "subtitle"); + } + + // Write FeedItem data + if (feed.getItems() != null) { + for (FeedItem item : feed.getItems()) { + + if (item.getIdentifyingValue() != null) { + xml.startTag(null, "id"); + xml.text(item.getIdentifyingValue()); + xml.endTag(null, "id"); + } + if (item.getTitle() != null) { + xml.startTag(null, "title"); + xml.text(item.getTitle()); + xml.endTag(null, "title"); + } + if (item.getLink() != null) { + xml.startTag(null, "link"); + xml.attribute(null, "rel", "alternate"); + xml.attribute(null, "href", item.getLink()); + xml.endTag(null, "link"); + } + if (item.getPubDate() != null) { + xml.startTag(null, "published"); + if ((flags & FEATURE_USE_RFC3339LOCAL) != 0) { + xml.text(SyndDateUtils.formatRFC3339Local(item.getPubDate())); + } else { + xml.text(SyndDateUtils.formatRFC3339UTC(item.getPubDate())); + } + } + if (item.getDescription() != null) { + xml.startTag(null, "content"); + xml.text(item.getDescription()); + xml.endTag(null, "content"); + } + if (item.getMedia() != null) { + FeedMedia media = item.getMedia(); + xml.startTag(null, "link"); + xml.attribute(null, "rel", "enclosure"); + xml.attribute(null, "href", media.getDownload_url()); + xml.attribute(null, "type", media.getMime_type()); + xml.attribute(null, "length", String.valueOf(media.getSize())); + xml.endTag(null, "link"); + } + } + } + + xml.endTag(null, "feed"); + xml.endDocument(); + } +} diff --git a/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/FeedGenerator.java b/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/FeedGenerator.java new file mode 100644 index 000000000..e6b0f0697 --- /dev/null +++ b/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/FeedGenerator.java @@ -0,0 +1,28 @@ +package instrumentationTest.de.test.antennapod.util.syndication.feedgenerator; + +import de.danoeh.antennapod.feed.Feed; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Generates a machine-readable, platform-independent representation of a Feed object. + */ +public interface FeedGenerator { + + /** + * Creates a machine-readable, platform-independent representation of a given + * Feed object and writes it to the given OutputStream. + * <p/> + * The representation might not be compliant with its specification if the feed + * is missing certain attribute values. This is intentional because the FeedGenerator is + * used for creating test data. + * + * @param feed The feed that should be written. Must not be null. + * @param outputStream The output target that the feed will be written to. The outputStream is not closed after + * the method's execution Must not be null. + * @param encoding The encoding to use. Must not be null. + * @param flags Optional argument for enabling implementation-dependent features. + */ + public void writeFeed(Feed feed, OutputStream outputStream, String encoding, long flags) throws IOException; +} diff --git a/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/GeneratorUtil.java b/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/GeneratorUtil.java new file mode 100644 index 000000000..0742f8d78 --- /dev/null +++ b/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/GeneratorUtil.java @@ -0,0 +1,20 @@ +package instrumentationTest.de.test.antennapod.util.syndication.feedgenerator; + +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; + +/** + * Utility methods for FeedGenerator + */ +public class GeneratorUtil { + + public static void addPaymentLink(XmlSerializer xml, String paymentLink) throws IOException { + xml.startTag("http://www.w3.org/2005/Atom", "link"); + xml.attribute(null, "rel", "payment"); + xml.attribute(null, "title", "Flattr this!"); + xml.attribute(null, "href", paymentLink); + xml.attribute(null, "type", "text/html"); + xml.endTag("http://www.w3.org/2005/Atom", "link"); + } +} diff --git a/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/RSS2Generator.java b/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/RSS2Generator.java new file mode 100644 index 000000000..aea995e0f --- /dev/null +++ b/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/RSS2Generator.java @@ -0,0 +1,110 @@ +package instrumentationTest.de.test.antennapod.util.syndication.feedgenerator; + +import android.util.Xml; +import de.danoeh.antennapod.feed.Feed; +import de.danoeh.antennapod.feed.FeedItem; +import de.danoeh.antennapod.syndication.util.SyndDateUtils; +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Creates RSS 2.0 feeds. See FeedGenerator for more information. + */ +public class RSS2Generator implements FeedGenerator{ + + public static final long FEATURE_WRITE_GUID = 1; + + @Override + public void writeFeed(Feed feed, OutputStream outputStream, String encoding, long flags) throws IOException { + if (feed == null) throw new IllegalArgumentException("feed = null"); + if (outputStream == null) throw new IllegalArgumentException("outputStream = null"); + if (encoding == null) throw new IllegalArgumentException("encoding = null"); + + XmlSerializer xml = Xml.newSerializer(); + xml.setOutput(outputStream, encoding); + xml.startDocument(encoding, null); + + xml.setPrefix("atom", "http://www.w3.org/2005/Atom"); + xml.startTag(null, "rss"); + xml.attribute(null, "version", "2.0"); + xml.startTag(null, "channel"); + + // Write Feed data + if (feed.getTitle() != null) { + xml.startTag(null, "title"); + xml.text(feed.getTitle()); + xml.endTag(null, "title"); + } + if (feed.getDescription() != null) { + xml.startTag(null, "description"); + xml.text(feed.getDescription()); + xml.endTag(null, "description"); + } + if (feed.getLink() != null) { + xml.startTag(null, "link"); + xml.text(feed.getLink()); + xml.endTag(null, "link"); + } + if (feed.getLanguage() != null) { + xml.startTag(null, "language"); + xml.text(feed.getLanguage()); + xml.endTag(null, "language"); + } + + if (feed.getPaymentLink() != null) { + GeneratorUtil.addPaymentLink(xml, feed.getPaymentLink()); + } + + // Write FeedItem data + if (feed.getItems() != null) { + for (FeedItem item : feed.getItems()) { + xml.startTag(null, "item"); + + if (item.getTitle() != null) { + xml.startTag(null, "title"); + xml.text(item.getTitle()); + xml.endTag(null, "title"); + } + if (item.getDescription() != null) { + xml.startTag(null, "description"); + xml.text(item.getDescription()); + xml.endTag(null, "description"); + } + if (item.getLink() != null) { + xml.startTag(null, "link"); + xml.text(item.getLink()); + xml.endTag(null, "link"); + } + if (item.getPubDate() != null) { + xml.startTag(null, "pubDate"); + xml.text(SyndDateUtils.formatRFC822Date(item.getPubDate())); + xml.endTag(null, "pubDate"); + } + if ((flags & FEATURE_WRITE_GUID) != 0) { + xml.startTag(null, "guid"); + xml.text(item.getItemIdentifier()); + xml.endTag(null, "guid"); + } + if (item.getMedia() != null) { + xml.startTag(null, "enclosure"); + xml.attribute(null, "url", item.getMedia().getDownload_url()); + xml.attribute(null, "length", String.valueOf(item.getMedia().getSize())); + xml.attribute(null, "type", item.getMedia().getMime_type()); + xml.endTag(null, "enclosure"); + } + if (item.getPaymentLink() != null) { + GeneratorUtil.addPaymentLink(xml, item.getPaymentLink()); + } + + xml.endTag(null, "item"); + } + } + + xml.endTag(null, "channel"); + xml.endTag(null, "rss"); + + xml.endDocument(); + } +} |