summaryrefslogtreecommitdiff
path: root/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/AtomGenerator.java
blob: 69cc827ec305e72267d69ea94e4c77cf8e8610ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package de.test.antennapod.util.syndication.feedgenerator;

import android.util.Xml;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
import de.danoeh.antennapod.core.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");
        }

        if (feed.getPaymentLink() != null) {
            GeneratorUtil.addPaymentLink(xml, feed.getPaymentLink(), false);
        }

        // Write FeedItem data
        if (feed.getItems() != null) {
            for (FeedItem item : feed.getItems()) {
                xml.startTag(null, "entry");

                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()));
                    }
                    xml.endTag(null, "published");
                }
                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");
                }

                if (item.getPaymentLink() != null) {
                    GeneratorUtil.addPaymentLink(xml, item.getPaymentLink(), false);
                }

                xml.endTag(null, "entry");
            }
        }

        xml.endTag(null, "feed");
        xml.endDocument();
    }
}