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 | |
parent | b19afaa82ca20970e52093ff4c17e290f02cd923 (diff) | |
download | AntennaPod-a0237d60358196c36b95e7d5c1b7d2d09f1ec022.zip |
Converted RSSHandler into RSS 2.0 Namespace
-rw-r--r-- | src/de/podfetcher/syndication/handler/FeedHandler.java | 2 | ||||
-rw-r--r-- | src/de/podfetcher/syndication/handler/HandlerState.java | 12 | ||||
-rw-r--r-- | src/de/podfetcher/syndication/handler/SyndHandler.java | 45 | ||||
-rw-r--r-- | src/de/podfetcher/syndication/namespace/Namespace.java | 13 | ||||
-rw-r--r-- | src/de/podfetcher/syndication/namespace/SyndElement.java | 4 | ||||
-rw-r--r-- | src/de/podfetcher/syndication/namespace/atom/NSAtom.java | 19 | ||||
-rw-r--r-- | src/de/podfetcher/syndication/namespace/rss20/NSRSS20.java (renamed from src/de/podfetcher/syndication/handler/RSSHandler.java) | 85 |
7 files changed, 108 insertions, 72 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/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; } - + } diff --git a/src/de/podfetcher/syndication/namespace/Namespace.java b/src/de/podfetcher/syndication/namespace/Namespace.java index 3709a35c5..4101b0118 100644 --- a/src/de/podfetcher/syndication/namespace/Namespace.java +++ b/src/de/podfetcher/syndication/namespace/Namespace.java @@ -10,10 +10,17 @@ public abstract class Namespace { public static final String NSTAG = null; public static final String NSURI = null; - /** Called by a Feedhandler when in startElement and it detects a namespace element */ - public abstract void handleElement(String localName, HandlerState state, Attributes attributes); + /** Called by a Feedhandler when in startElement and it detects a namespace element + * @return true if namespace handled the element, false if it ignored it + * */ + public abstract void handleElementStart(String localName, HandlerState state, Attributes attributes); /** Called by a Feedhandler when in characters and it detects a namespace element */ - public abstract void handleCharacters(String localName, Feed feed, char ch[], int start, int length); + public abstract void handleCharacters(HandlerState state, char ch[], int start, int length); + + /** Called by a Feedhandler when in endElement and it detects a namespace element + * @return true if namespace handled the element, false if it ignored it + * */ + public abstract void handleElementEnd(String localName, HandlerState state); } diff --git a/src/de/podfetcher/syndication/namespace/SyndElement.java b/src/de/podfetcher/syndication/namespace/SyndElement.java index 627ac7b6d..2dd4e7062 100644 --- a/src/de/podfetcher/syndication/namespace/SyndElement.java +++ b/src/de/podfetcher/syndication/namespace/SyndElement.java @@ -6,12 +6,12 @@ public class SyndElement { protected Namespace namespace; public SyndElement(String name, Namespace namespace) { - super(); this.name = name; + this.namespace = namespace; } public Namespace getNamespace() { - return null; + return namespace; } public String getName() { diff --git a/src/de/podfetcher/syndication/namespace/atom/NSAtom.java b/src/de/podfetcher/syndication/namespace/atom/NSAtom.java index 803228cc5..7ca23572e 100644 --- a/src/de/podfetcher/syndication/namespace/atom/NSAtom.java +++ b/src/de/podfetcher/syndication/namespace/atom/NSAtom.java @@ -9,24 +9,29 @@ import de.podfetcher.syndication.namespace.Namespace; public class NSAtom extends Namespace { public static final String NSTAG = "atom"; public static final String NSURI = "http://www.w3.org/2005/Atom"; - + private static final String TITLE = "title"; private static final String LINK = "link"; private static final String UPDATED = "updated"; private static final String AUTHOR = "author"; - + @Override - public void handleElement(String localName, HandlerState state, Attributes attributes) { + public void handleElementStart(String localName, HandlerState state, + Attributes attributes) { if (localName.equals(TITLE)) { - + } + } + + @Override + public void handleCharacters(HandlerState state, char[] ch, int start, + int length) { } @Override - public void handleCharacters(String localName, Feed feed, char[] ch, - int start, int length) { - + public void handleElementEnd(String localName, HandlerState state) { + // TODO Auto-generated method stub } } diff --git a/src/de/podfetcher/syndication/handler/RSSHandler.java b/src/de/podfetcher/syndication/namespace/rss20/NSRSS20.java index 5a61b9daa..c536d216c 100644 --- a/src/de/podfetcher/syndication/handler/RSSHandler.java +++ b/src/de/podfetcher/syndication/namespace/rss20/NSRSS20.java @@ -1,4 +1,4 @@ -package de.podfetcher.syndication.handler; +package de.podfetcher.syndication.namespace.rss20; import java.util.ArrayList; @@ -6,6 +6,9 @@ import de.podfetcher.feed.Feed; import de.podfetcher.feed.FeedImage; import de.podfetcher.feed.FeedItem; import de.podfetcher.feed.FeedMedia; +import de.podfetcher.syndication.handler.HandlerState; +import de.podfetcher.syndication.handler.SyndHandler; +import de.podfetcher.syndication.namespace.Namespace; import de.podfetcher.syndication.namespace.SyndElement; import org.xml.sax.Attributes; @@ -18,7 +21,10 @@ import org.xml.sax.helpers.DefaultHandler; * @author daniel * */ -public class RSSHandler extends SyndHandler { +public class NSRSS20 extends Namespace { + public static final String NSTAG = "rss"; + public static final String NSURI = ""; + public final static String CHANNEL = "channel"; public final static String ITEM = "item"; public final static String TITLE = "title"; @@ -33,76 +39,67 @@ public class RSSHandler extends SyndHandler { public final static String ENC_LEN = "length"; public final static String ENC_TYPE = "type"; + @Override + public void handleElementStart(String localName, HandlerState state, + Attributes attributes) { + if (localName.equals(ITEM)) { + state.setCurrentItem(new FeedItem()); + state.getFeed().getItems().add(state.getCurrentItem()); + state.getCurrentItem().setFeed(state.getFeed()); - public RSSHandler(Feed feed) { - super(feed); + } else if (localName.equals(ENCLOSURE)) { + state.getCurrentItem() + .setMedia(new FeedMedia(state.getCurrentItem(), attributes + .getValue(ENC_URL), Long.parseLong(attributes + .getValue(ENC_LEN)), attributes.getValue(ENC_TYPE))); + } else if (localName.equals(IMAGE)) { + state.getFeed().setImage(new FeedImage()); + } } @Override - public void characters(char[] ch, int start, int length) - throws SAXException { - if (state.tagstack.size() >= 2) { + public void handleCharacters(HandlerState state, char[] ch, int start, + int length) { + if (state.getTagstack().size() >= 2) { String content = new String(ch, start, length); - SyndElement topElement = state.tagstack.pop(); + SyndElement topElement = state.getTagstack().pop(); String top = topElement.getName(); - String second = state.tagstack.peek().getName(); - state.tagstack.push(topElement); + String second = state.getTagstack().peek().getName(); + state.getTagstack().push(topElement); if (top.equals(TITLE)) { if (second.equals(ITEM)) { - state.currentItem.setTitle(content); + state.getCurrentItem().setTitle(content); } else if (second.equals(CHANNEL)) { - state.feed.setTitle(content); + state.getFeed().setTitle(content); } else if (second.equals(IMAGE)) { - state.feed.getImage().setTitle(IMAGE); + state.getFeed().getImage().setTitle(IMAGE); } } else if (top.equals(DESCR)) { if (second.equals(CHANNEL)) { - state.feed.setDescription(content); + state.getFeed().setDescription(content); } else if (second.equals(ITEM)) { - state.feed.setDescription(content); + state.getFeed().setDescription(content); } } else if (top.equals(LINK)) { if (second.equals(CHANNEL)) { - state.feed.setLink(content); + state.getFeed().setLink(content); } else if (second.equals(ITEM)) { - state.currentItem.setLink(content); + state.getCurrentItem().setLink(content); } } else if (top.equals(PUBDATE) && second.equals(ITEM)) { - state.currentItem.setPubDate(content); + state.getCurrentItem().setPubDate(content); } else if (top.equals(URL) && second.equals(IMAGE)) { - state.feed.getImage().setDownload_url(content); + state.getFeed().getImage().setDownload_url(content); } } + } @Override - public void endElement(String uri, String localName, String qName) - throws SAXException { + public void handleElementEnd(String localName, HandlerState state) { if (localName.equals(ITEM)) { - state.currentItem = null; + state.setCurrentItem(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); } } |