summaryrefslogtreecommitdiff
path: root/src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2014-03-31 19:45:03 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2014-03-31 19:45:03 +0200
commit5a6c7ef43a89ae03c6de94f070314ec5bc5c3c9d (patch)
tree3cbd1b8368555ba5867ae68c5246c2a4490c5fc9 /src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator
parentb2de7512f4c871e882760bfe8bffa27d10c1c68a (diff)
downloadAntennaPod-5a6c7ef43a89ae03c6de94f070314ec5bc5c3c9d.zip
Added feed generators, basic rss tests
Diffstat (limited to 'src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator')
-rw-r--r--src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/AtomGenerator.java106
-rw-r--r--src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/FeedGenerator.java28
-rw-r--r--src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/GeneratorUtil.java20
-rw-r--r--src/instrumentationTest/de/test/antennapod/util/syndication/feedgenerator/RSS2Generator.java110
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();
+ }
+}