summaryrefslogtreecommitdiff
path: root/src/de/podfetcher/syndication
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2012-06-11 11:19:08 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2012-06-11 11:19:08 +0200
commit105039dd9f4859d959aba5b9729a7108266d30d7 (patch)
treec06c9b1ed600c4edf6b5971f270cd1e05116619e /src/de/podfetcher/syndication
parent19053b2b59c01467ea476683b069b3a186c5032a (diff)
downloadAntennaPod-105039dd9f4859d959aba5b9729a7108266d30d7.zip
Implemented Atom namespace
Diffstat (limited to 'src/de/podfetcher/syndication')
-rw-r--r--src/de/podfetcher/syndication/handler/HandlerState.java8
-rw-r--r--src/de/podfetcher/syndication/handler/SyndHandler.java23
-rw-r--r--src/de/podfetcher/syndication/handler/TypeGetter.java4
-rw-r--r--src/de/podfetcher/syndication/namespace/atom/NSAtom.java72
-rw-r--r--src/de/podfetcher/syndication/namespace/rss20/NSRSS20.java6
-rw-r--r--src/de/podfetcher/syndication/util/HtmlUnescaper.java1
6 files changed, 85 insertions, 29 deletions
diff --git a/src/de/podfetcher/syndication/handler/HandlerState.java b/src/de/podfetcher/syndication/handler/HandlerState.java
index 088dd295a..a95cae6f0 100644
--- a/src/de/podfetcher/syndication/handler/HandlerState.java
+++ b/src/de/podfetcher/syndication/handler/HandlerState.java
@@ -46,6 +46,14 @@ public class HandlerState {
public void setCurrentItem(FeedItem currentItem) {
this.currentItem = currentItem;
}
+
+ /** Returns the SyndElement that comes after the top element of the tagstack. */
+ public SyndElement getSecondTag() {
+ SyndElement top = tagstack.pop();
+ SyndElement second = tagstack.peek();
+ tagstack.push(top);
+ return second;
+ }
diff --git a/src/de/podfetcher/syndication/handler/SyndHandler.java b/src/de/podfetcher/syndication/handler/SyndHandler.java
index 949690af4..5f61c9750 100644
--- a/src/de/podfetcher/syndication/handler/SyndHandler.java
+++ b/src/de/podfetcher/syndication/handler/SyndHandler.java
@@ -12,7 +12,6 @@ import de.podfetcher.syndication.namespace.SyndElement;
import de.podfetcher.syndication.namespace.atom.NSAtom;
import de.podfetcher.syndication.namespace.rss20.NSRSS20;
-
/** Superclass for all SAX Handlers which process Syndication formats */
public class SyndHandler extends DefaultHandler {
private static final String TAG = "SyndHandler";
@@ -32,19 +31,21 @@ public class SyndHandler extends DefaultHandler {
Namespace handler = getHandlingNamespace(uri);
if (handler != null) {
- SyndElement element = handler.handleElementStart(localName, state, attributes);
+ SyndElement element = handler.handleElementStart(localName, state,
+ attributes);
state.tagstack.push(element);
-
+
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
-
- SyndElement top = state.tagstack.peek();
- if (top.getNamespace() != null) {
- top.getNamespace().handleCharacters(state, ch, start, length);
+ if (!state.tagstack.empty()) {
+ SyndElement top = state.tagstack.peek();
+ if (top.getNamespace() != null) {
+ top.getNamespace().handleCharacters(state, ch, start, length);
+ }
}
}
@@ -55,9 +56,9 @@ public class SyndHandler extends DefaultHandler {
if (handler != null) {
handler.handleElementEnd(localName, state);
state.tagstack.pop();
-
+
}
-
+
}
@Override
@@ -77,10 +78,10 @@ public class SyndHandler extends DefaultHandler {
}
}
}
-
+
private Namespace getHandlingNamespace(String uri) {
Namespace handler = state.namespaces.get(uri);
- if (handler == null && uri.equals(DEFAULT_PREFIX) && !state.defaultNamespaces.empty()) {
+ if (handler == null && !state.defaultNamespaces.empty()) {
handler = state.defaultNamespaces.peek();
}
return handler;
diff --git a/src/de/podfetcher/syndication/handler/TypeGetter.java b/src/de/podfetcher/syndication/handler/TypeGetter.java
index 9ab9dc70a..71aa9970d 100644
--- a/src/de/podfetcher/syndication/handler/TypeGetter.java
+++ b/src/de/podfetcher/syndication/handler/TypeGetter.java
@@ -38,7 +38,7 @@ public class TypeGetter {
if (eventType == XmlPullParser.START_TAG) {
String tag = xpp.getName();
if (tag.equals(ATOM_ROOT)) {
- Log.d(TAG, "Recongnized type Atom");
+ Log.d(TAG, "Recognized type Atom");
return Type.ATOM;
} else if (tag.equals(RSS_ROOT)
&& (xpp.getAttributeValue(null, "version")
@@ -46,6 +46,7 @@ public class TypeGetter {
Log.d(TAG, "Recognized type RSS 2.0");
return Type.RSS20;
} else {
+ Log.d(TAG, "Type is invalid");
return Type.INVALID;
}
} else {
@@ -58,6 +59,7 @@ public class TypeGetter {
} catch (IOException e) {
e.printStackTrace();
}
+ Log.d(TAG, "Type is invalid");
return Type.INVALID;
}
diff --git a/src/de/podfetcher/syndication/namespace/atom/NSAtom.java b/src/de/podfetcher/syndication/namespace/atom/NSAtom.java
index 7aa01de80..36cad19cf 100644
--- a/src/de/podfetcher/syndication/namespace/atom/NSAtom.java
+++ b/src/de/podfetcher/syndication/namespace/atom/NSAtom.java
@@ -3,6 +3,7 @@ package de.podfetcher.syndication.namespace.atom;
import org.xml.sax.Attributes;
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;
@@ -20,7 +21,10 @@ public class NSAtom extends Namespace {
private static final String UPDATED = "updated";
private static final String AUTHOR = "author";
private static final String CONTENT = "content";
-
+ private static final String IMAGE = "logo";
+ private static final String SUBTITLE = "subtitle";
+ private static final String PUBLISHED = "published";
+
private static final String TEXT_TYPE = "type";
// Link
private static final String LINK_HREF = "href";
@@ -33,7 +37,9 @@ public class NSAtom extends Namespace {
private static final String LINK_REL_ENCLOSURE = "enclosure";
private static final String LINK_REL_RELATED = "related";
private static final String LINK_REL_SELF = "self";
-
+
+ /** Regexp to test whether an Element is a Text Element. */
+ private static final String isText = TITLE + "|" + CONTENT + "|" + "|" + SUBTITLE;
@Override
public SyndElement handleElementStart(String localName, HandlerState state,
Attributes attributes) {
@@ -41,29 +47,29 @@ public class NSAtom extends Namespace {
state.setCurrentItem(new FeedItem());
state.getFeed().getItems().add(state.getCurrentItem());
state.getCurrentItem().setFeed(state.getFeed());
- } else if (localName.equals(TITLE) || localName.equals(CONTENT)) {
- String type = attributes.getValue(null, TEXT_TYPE);
+ } else if (localName.matches(isText)) {
+ String type = attributes.getValue(TEXT_TYPE);
return new AtomText(localName, this, type);
} else if (localName.equals(LINK)) {
- String href = attributes.getValue(null, LINK_HREF);
- String rel = attributes.getValue(null, LINK_REL);
+ String href = attributes.getValue(LINK_HREF);
+ String rel = attributes.getValue(LINK_REL);
SyndElement parent = state.getTagstack().peek();
if (parent.getName().equals(ENTRY)) {
if (rel == null || rel.equals(LINK_REL_ALTERNATE)) {
state.getCurrentItem().setLink(href);
} else if (rel.equals(LINK_REL_ENCLOSURE)) {
- long size = Long.parseLong(attributes.getValue(null,
- LINK_LENGTH));
- String type = attributes.getValue(null, LINK_TYPE);
- String download_url = attributes.getValue(null,
- LINK_REL_ENCLOSURE);
+ String strSize = attributes.getValue(LINK_LENGTH);
+ long size = 0;
+ if (strSize != null) size = Long.parseLong(strSize);
+ String type = attributes.getValue(LINK_TYPE);
+ String download_url = attributes.getValue(LINK_REL_ENCLOSURE);
state.getCurrentItem().setMedia(
new FeedMedia(state.getCurrentItem(), download_url,
size, type));
}
} else if (parent.getName().equals(FEED)) {
if (rel == null || rel.equals(LINK_REL_ALTERNATE)) {
- state.getCurrentItem().setLink(href);
+ state.getFeed().setLink(href);
}
}
}
@@ -73,12 +79,50 @@ public class NSAtom extends Namespace {
@Override
public void handleCharacters(HandlerState state, char[] ch, int start,
int length) {
-
+ if (state.getTagstack().size() >= 2) {
+ AtomText textElement = null;
+ String content = new String(ch, start, length);
+ SyndElement topElement = state.getTagstack().peek();
+ String top = topElement.getName();
+ SyndElement secondElement = state.getSecondTag();
+ String second = secondElement.getName();
+
+ if (top.matches(isText)) {
+ textElement = (AtomText) topElement;
+ textElement.setContent(content);
+ }
+
+ if (top.equals(TITLE)) {
+
+ if (second.equals(FEED)) {
+ state.getFeed().setTitle(textElement.getProcessedContent());
+ } else if (second.equals(ENTRY)) {
+ state.getCurrentItem().setTitle(textElement.getProcessedContent());
+ }
+ } else if (top.equals(SUBTITLE)) {
+ if (second.equals(FEED)) {
+ state.getFeed().setDescription(textElement.getProcessedContent());
+ }
+ } else if (top.equals(CONTENT)) {
+ if (second.equals(ENTRY)) {
+ state.getCurrentItem().setDescription(textElement.getProcessedContent());
+ }
+ } else if (top.equals(PUBLISHED)) {
+ if (second.equals(ENTRY)) {
+ state.getCurrentItem().setPubDate(content);
+ }
+ } else if (top.equals(IMAGE)) {
+ state.getFeed().setImage(new FeedImage(content, null));
+ }
+
+ }
}
@Override
public void handleElementEnd(String localName, HandlerState state) {
- // TODO Auto-generated method stub
+ if (localName.equals(ENTRY)) {
+ state.setCurrentItem(null);
+ }
}
}
diff --git a/src/de/podfetcher/syndication/namespace/rss20/NSRSS20.java b/src/de/podfetcher/syndication/namespace/rss20/NSRSS20.java
index 592a96d66..9b97c1f89 100644
--- a/src/de/podfetcher/syndication/namespace/rss20/NSRSS20.java
+++ b/src/de/podfetcher/syndication/namespace/rss20/NSRSS20.java
@@ -63,10 +63,10 @@ public class NSRSS20 extends Namespace {
int length) {
if (state.getTagstack().size() >= 2) {
String content = new String(ch, start, length);
- SyndElement topElement = state.getTagstack().pop();
+ SyndElement topElement = state.getTagstack().peek();
String top = topElement.getName();
- String second = state.getTagstack().peek().getName();
- state.getTagstack().push(topElement);
+ SyndElement secondElement = state.getSecondTag();
+ String second = secondElement.getName();
if (top.equals(TITLE)) {
if (second.equals(ITEM)) {
state.getCurrentItem().setTitle(content);
diff --git a/src/de/podfetcher/syndication/util/HtmlUnescaper.java b/src/de/podfetcher/syndication/util/HtmlUnescaper.java
index 8b2bc9b1d..703f17ec3 100644
--- a/src/de/podfetcher/syndication/util/HtmlUnescaper.java
+++ b/src/de/podfetcher/syndication/util/HtmlUnescaper.java
@@ -7,6 +7,7 @@ public class HtmlUnescaper {
private static HashMap<String, String> symbols;
static {
+ symbols = new HashMap<String, String>();
symbols.put("&nbsp", " ");
symbols.put("&quot", "\"");
symbols.put("&amp", "&");