Implemented support for default Namespaces

This commit is contained in:
daniel oeh 2012-06-09 13:10:23 +02:00
parent a0237d6035
commit 6726c92b40
3 changed files with 22 additions and 7 deletions

View File

@ -16,8 +16,8 @@ public class FeedHandler {
public Feed parseFeed(Feed feed) { public Feed parseFeed(Feed feed) {
TypeGetter tg = new TypeGetter(); TypeGetter tg = new TypeGetter();
tg.getType(feed); TypeGetter.Type type = tg.getType(feed);
SyndHandler handler = new SyndHandler(feed); SyndHandler handler = new SyndHandler(feed, type);
try { try {
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true); factory.setNamespaceAware(true);

View File

@ -17,11 +17,13 @@ public class HandlerState {
protected Stack<SyndElement> tagstack; protected Stack<SyndElement> tagstack;
/** Namespaces that have been defined so far. */ /** Namespaces that have been defined so far. */
protected HashMap<String, Namespace> namespaces; protected HashMap<String, Namespace> namespaces;
protected Stack<Namespace> defaultNamespaces;
public HandlerState(Feed feed) { public HandlerState(Feed feed) {
this.feed = feed; this.feed = feed;
tagstack = new Stack<SyndElement>(); tagstack = new Stack<SyndElement>();
namespaces = new HashMap<String, Namespace>(); namespaces = new HashMap<String, Namespace>();
defaultNamespaces = new Stack<Namespace>();
} }

View File

@ -12,15 +12,18 @@ import de.podfetcher.syndication.namespace.SyndElement;
import de.podfetcher.syndication.namespace.atom.NSAtom; import de.podfetcher.syndication.namespace.atom.NSAtom;
import de.podfetcher.syndication.namespace.rss20.NSRSS20; import de.podfetcher.syndication.namespace.rss20.NSRSS20;
// TODO implement default namespace
/** Superclass for all SAX Handlers which process Syndication formats */ /** Superclass for all SAX Handlers which process Syndication formats */
public class SyndHandler extends DefaultHandler { public class SyndHandler extends DefaultHandler {
private static final String TAG = "SyndHandler"; private static final String TAG = "SyndHandler";
private static final String DEFAULT_PREFIX = "";
protected HandlerState state; protected HandlerState state;
public SyndHandler(Feed feed) { public SyndHandler(Feed feed, TypeGetter.Type type) {
state = new HandlerState(feed); state = new HandlerState(feed);
state.namespaces.put("", new NSRSS20()); // TODO remove later if (type == TypeGetter.Type.RSS20) {
state.defaultNamespaces.push(new NSRSS20());
}
} }
@Override @Override
@ -28,6 +31,9 @@ public class SyndHandler extends DefaultHandler {
Attributes attributes) throws SAXException { Attributes attributes) throws SAXException {
Namespace handler = state.namespaces.get(uri); Namespace handler = state.namespaces.get(uri);
if (handler == null && uri.equals(DEFAULT_PREFIX) && !state.defaultNamespaces.empty()) {
handler = state.defaultNamespaces.peek();
}
if (handler != null) { if (handler != null) {
handler.handleElementStart(localName, state, attributes); handler.handleElementStart(localName, state, attributes);
state.tagstack.push(new SyndElement(localName, handler)); state.tagstack.push(new SyndElement(localName, handler));
@ -50,6 +56,9 @@ public class SyndHandler extends DefaultHandler {
public void endElement(String uri, String localName, String qName) public void endElement(String uri, String localName, String qName)
throws SAXException { throws SAXException {
Namespace handler = state.namespaces.get(uri); Namespace handler = state.namespaces.get(uri);
if (handler == null && uri.equals(DEFAULT_PREFIX) && !state.defaultNamespaces.empty()) {
handler = state.defaultNamespaces.peek();
}
if (handler != null) { if (handler != null) {
handler.handleElementEnd(localName, state); handler.handleElementEnd(localName, state);
state.tagstack.pop(); state.tagstack.pop();
@ -69,8 +78,12 @@ public class SyndHandler extends DefaultHandler {
Log.d(TAG, "Found Prefix Mapping with prefix " + prefix + " and uri " Log.d(TAG, "Found Prefix Mapping with prefix " + prefix + " and uri "
+ uri); + uri);
// Find the right namespace // Find the right namespace
if (prefix.equals(NSAtom.NSTAG) || uri.equals(NSAtom.NSURI)) { if (uri.equals(NSAtom.NSURI)) {
state.namespaces.put(uri, new NSAtom()); if (prefix.equals(DEFAULT_PREFIX)) {
state.defaultNamespaces.push(new NSAtom());
} else if (prefix.equals(NSAtom.NSTAG)) {
state.namespaces.put(uri, new NSAtom());
}
} }
} }