summaryrefslogtreecommitdiff
path: root/src/de/podfetcher/syndication/handler
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/podfetcher/syndication/handler')
-rw-r--r--src/de/podfetcher/syndication/handler/FeedHandler.java2
-rw-r--r--src/de/podfetcher/syndication/handler/HandlerState.java12
-rw-r--r--src/de/podfetcher/syndication/handler/RSSHandler.java108
-rw-r--r--src/de/podfetcher/syndication/handler/SyndHandler.java45
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;
}
-
+
}