diff options
author | daniel oeh <daniel.oeh@gmail.com> | 2012-06-09 12:34:18 +0200 |
---|---|---|
committer | daniel oeh <daniel.oeh@gmail.com> | 2012-06-09 12:34:18 +0200 |
commit | a0237d60358196c36b95e7d5c1b7d2d09f1ec022 (patch) | |
tree | 13da0f8d56355323e298c8e2403afa8d6ca9ee2e /src/de/podfetcher/syndication/handler | |
parent | b19afaa82ca20970e52093ff4c17e290f02cd923 (diff) | |
download | AntennaPod-a0237d60358196c36b95e7d5c1b7d2d09f1ec022.zip |
Converted RSSHandler into RSS 2.0 Namespace
Diffstat (limited to 'src/de/podfetcher/syndication/handler')
4 files changed, 43 insertions, 124 deletions
diff --git a/src/de/podfetcher/syndication/handler/FeedHandler.java b/src/de/podfetcher/syndication/handler/FeedHandler.java index 4b33e11de..dcc7e4ca7 100644 --- a/src/de/podfetcher/syndication/handler/FeedHandler.java +++ b/src/de/podfetcher/syndication/handler/FeedHandler.java @@ -17,7 +17,7 @@ public class FeedHandler { public Feed parseFeed(Feed feed) { TypeGetter tg = new TypeGetter(); tg.getType(feed); - RSSHandler handler = new RSSHandler(feed); + SyndHandler handler = new SyndHandler(feed); try { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(true); diff --git a/src/de/podfetcher/syndication/handler/HandlerState.java b/src/de/podfetcher/syndication/handler/HandlerState.java index 9eccf4f74..755388efb 100644 --- a/src/de/podfetcher/syndication/handler/HandlerState.java +++ b/src/de/podfetcher/syndication/handler/HandlerState.java @@ -34,6 +34,18 @@ public class HandlerState { public Stack<SyndElement> getTagstack() { return tagstack; } + + + public void setFeed(Feed feed) { + this.feed = feed; + } + + + public void setCurrentItem(FeedItem currentItem) { + this.currentItem = currentItem; + } + + } diff --git a/src/de/podfetcher/syndication/handler/RSSHandler.java b/src/de/podfetcher/syndication/handler/RSSHandler.java deleted file mode 100644 index 5a61b9daa..000000000 --- a/src/de/podfetcher/syndication/handler/RSSHandler.java +++ /dev/null @@ -1,108 +0,0 @@ -package de.podfetcher.syndication.handler; - -import java.util.ArrayList; - -import de.podfetcher.feed.Feed; -import de.podfetcher.feed.FeedImage; -import de.podfetcher.feed.FeedItem; -import de.podfetcher.feed.FeedMedia; -import de.podfetcher.syndication.namespace.SyndElement; - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -/** - * SAX-Parser for reading RSS-Feeds - * - * @author daniel - * - */ -public class RSSHandler extends SyndHandler { - public final static String CHANNEL = "channel"; - public final static String ITEM = "item"; - public final static String TITLE = "title"; - public final static String LINK = "link"; - public final static String DESCR = "description"; - public final static String PUBDATE = "pubDate"; - public final static String ENCLOSURE = "enclosure"; - public final static String IMAGE = "image"; - public final static String URL = "url"; - - public final static String ENC_URL = "url"; - public final static String ENC_LEN = "length"; - public final static String ENC_TYPE = "type"; - - - public RSSHandler(Feed feed) { - super(feed); - } - - @Override - public void characters(char[] ch, int start, int length) - throws SAXException { - if (state.tagstack.size() >= 2) { - String content = new String(ch, start, length); - SyndElement topElement = state.tagstack.pop(); - String top = topElement.getName(); - String second = state.tagstack.peek().getName(); - state.tagstack.push(topElement); - if (top.equals(TITLE)) { - if (second.equals(ITEM)) { - state.currentItem.setTitle(content); - } else if (second.equals(CHANNEL)) { - state.feed.setTitle(content); - } else if (second.equals(IMAGE)) { - state.feed.getImage().setTitle(IMAGE); - } - } else if (top.equals(DESCR)) { - if (second.equals(CHANNEL)) { - state.feed.setDescription(content); - } else if (second.equals(ITEM)) { - state.feed.setDescription(content); - } - } else if (top.equals(LINK)) { - if (second.equals(CHANNEL)) { - state.feed.setLink(content); - } else if (second.equals(ITEM)) { - state.currentItem.setLink(content); - } - } else if (top.equals(PUBDATE) && second.equals(ITEM)) { - state.currentItem.setPubDate(content); - } else if (top.equals(URL) && second.equals(IMAGE)) { - state.feed.getImage().setDownload_url(content); - } - } - } - - @Override - public void endElement(String uri, String localName, String qName) - throws SAXException { - if (localName.equals(ITEM)) { - state.currentItem = null; - } - super.endElement(uri, localName, qName); - } - - @Override - public void startElement(String uri, String localName, String qName, - Attributes attributes) throws SAXException { - - if (localName.equals(ITEM)) { - state.currentItem = new FeedItem(); - state.feed.getItems().add(state.currentItem); - state.currentItem.setFeed(state.feed); - - } else if (localName.equals(ENCLOSURE)) { - state.currentItem - .setMedia(new FeedMedia(state.currentItem, attributes - .getValue(ENC_URL), Long.parseLong(attributes - .getValue(ENC_LEN)), attributes.getValue(ENC_TYPE))); - } else if (localName.equals(IMAGE)) { - state.feed.setImage(new FeedImage()); - } - - super.startElement(uri, localName, qName, attributes); - } - -} diff --git a/src/de/podfetcher/syndication/handler/SyndHandler.java b/src/de/podfetcher/syndication/handler/SyndHandler.java index c772fdbaf..a6351afcf 100644 --- a/src/de/podfetcher/syndication/handler/SyndHandler.java +++ b/src/de/podfetcher/syndication/handler/SyndHandler.java @@ -10,49 +10,64 @@ import de.podfetcher.feed.Feed; import de.podfetcher.syndication.namespace.Namespace; import de.podfetcher.syndication.namespace.SyndElement; import de.podfetcher.syndication.namespace.atom.NSAtom; +import de.podfetcher.syndication.namespace.rss20.NSRSS20; +// TODO implement default namespace /** Superclass for all SAX Handlers which process Syndication formats */ -public abstract class SyndHandler extends DefaultHandler{ +public class SyndHandler extends DefaultHandler { private static final String TAG = "SyndHandler"; protected HandlerState state; public SyndHandler(Feed feed) { state = new HandlerState(feed); + state.namespaces.put("", new NSRSS20()); // TODO remove later } - + @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - state.tagstack.push(new SyndElement(qName)); - - + Namespace handler = state.namespaces.get(uri); if (handler != null) { - handler.handleElement(localName, state, attributes); + handler.handleElementStart(localName, state, attributes); + state.tagstack.push(new SyndElement(localName, handler)); + } } - - @Override - public void endElement(String uri, String localName, String qName) + public void characters(char[] ch, int start, int length) throws SAXException { - state.tagstack.pop(); - } + SyndElement top = state.tagstack.peek(); + if (top.getNamespace() != null) { + top.getNamespace().handleCharacters(state, ch, start, length); + } + // ignore element otherwise + } + @Override + public void endElement(String uri, String localName, String qName) + throws SAXException { + Namespace handler = state.namespaces.get(uri); + if (handler != null) { + handler.handleElementEnd(localName, state); + state.tagstack.pop(); + + } + + } @Override public void endPrefixMapping(String prefix) throws SAXException { // TODO remove Namespace } - - @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { - Log.d(TAG, "Found Prefix Mapping with prefix " + prefix + " and uri " + uri); + Log.d(TAG, "Found Prefix Mapping with prefix " + prefix + " and uri " + + uri); // Find the right namespace if (prefix.equals(NSAtom.NSTAG) || uri.equals(NSAtom.NSURI)) { state.namespaces.put(uri, new NSAtom()); @@ -62,5 +77,5 @@ public abstract class SyndHandler extends DefaultHandler{ public HandlerState getState() { return state; } - + } |