From 1cf9cf889fa76e2a6c96eda89483f8eebbd03b70 Mon Sep 17 00:00:00 2001 From: daniel oeh Date: Fri, 8 Jun 2012 22:06:06 +0200 Subject: [PATCH] Implemented more methods in SyndFeed and more --- .../syndication/handler/HandlerState.java | 10 +- .../syndication/handler/RSSHandler.java | 100 +++++++++--------- .../syndication/handler/SyndHandler.java | 58 +++++++++- .../syndication/namespace/NSElement.java | 3 +- .../syndication/namespace/Namespace.java | 7 +- .../syndication/namespace/atom/NSAtom.java | 16 +-- 6 files changed, 128 insertions(+), 66 deletions(-) diff --git a/src/de/podfetcher/syndication/handler/HandlerState.java b/src/de/podfetcher/syndication/handler/HandlerState.java index 7e0c07585..830f13687 100644 --- a/src/de/podfetcher/syndication/handler/HandlerState.java +++ b/src/de/podfetcher/syndication/handler/HandlerState.java @@ -1,6 +1,7 @@ package de.podfetcher.syndication.handler; import java.util.ArrayList; +import java.util.HashMap; import java.util.Stack; import de.podfetcher.syndication.namespace.Namespace; @@ -14,7 +15,14 @@ public class HandlerState { protected FeedItem currentItem; protected Stack tagstack; /** Namespaces that have been defined so far. */ - protected ArrayList namespaces; + protected HashMap namespaces; + + public HandlerState() { + feed = new Feed(); + tagstack = new Stack(); + namespaces = new HashMap(); + } + public Feed getFeed() { return feed; diff --git a/src/de/podfetcher/syndication/handler/RSSHandler.java b/src/de/podfetcher/syndication/handler/RSSHandler.java index 279cfca63..e50fa8db2 100644 --- a/src/de/podfetcher/syndication/handler/RSSHandler.java +++ b/src/de/podfetcher/syndication/handler/RSSHandler.java @@ -17,7 +17,21 @@ import org.xml.sax.helpers.DefaultHandler; * @author daniel * */ -public class RSSHandler extends DefaultHandler { +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 ArrayList items; public FeedItem currentItem; public StringBuilder strBuilder; @@ -38,90 +52,80 @@ public class RSSHandler extends DefaultHandler { } } - @Override - public void endDocument() throws SAXException { - feed.setItems(items); - } - @Override public void endElement(String uri, String localName, String qName) throws SAXException { - if (qName.equalsIgnoreCase(FeedHandler.ITEM)) { + if (localName.equals(ITEM)) { currentItem.setFeed(feed); items.add(currentItem); - } else if (qName.equalsIgnoreCase(FeedHandler.TITLE)) { - if (active_root_element.equalsIgnoreCase(FeedHandler.CHANNEL)) { + } else if (localName.equals(TITLE)) { + if (active_root_element.equals(CHANNEL)) { feed.setTitle(strBuilder.toString()); - } else if(active_root_element.equalsIgnoreCase(FeedHandler.ITEM)) { + } else if(active_root_element.equals(ITEM)) { currentItem.setTitle(strBuilder.toString()); - } else if(active_root_element.equalsIgnoreCase(FeedHandler.IMAGE)) { + } else if(active_root_element.equals(IMAGE)) { feed.getImage().setTitle(strBuilder.toString()); } - } else if (qName.equalsIgnoreCase(FeedHandler.DESCR)) { - if (active_root_element.equalsIgnoreCase(FeedHandler.CHANNEL)) { + } else if (localName.equals(DESCR)) { + if (active_root_element.equals(CHANNEL)) { feed.setDescription(strBuilder.toString()); } else { currentItem.setDescription(strBuilder.toString()); } - } else if (qName.equalsIgnoreCase(FeedHandler.LINK)) { - if (active_root_element.equalsIgnoreCase(FeedHandler.CHANNEL)) { + } else if (localName.equals(LINK)) { + if (active_root_element.equals(CHANNEL)) { feed.setLink(strBuilder.toString()); - } else if(active_root_element.equalsIgnoreCase(FeedHandler.ITEM)){ + } else if(active_root_element.equals(ITEM)){ currentItem.setLink(strBuilder.toString()); } - } else if (qName.equalsIgnoreCase(FeedHandler.PUBDATE)) { - if (active_root_element.equalsIgnoreCase(FeedHandler.ITEM)) { + } else if (localName.equals(PUBDATE)) { + if (active_root_element.equals(ITEM)) { currentItem.setPubDate(strBuilder.toString()); } - } else if (qName.equalsIgnoreCase(FeedHandler.URL)) { - if(active_root_element.equalsIgnoreCase(FeedHandler.IMAGE)) { + } else if (localName.equals(URL)) { + if(active_root_element.equals(IMAGE)) { feed.getImage().setDownload_url(strBuilder.toString()); } - } else if(qName.equalsIgnoreCase(FeedHandler.IMAGE)) { - active_root_element = FeedHandler.CHANNEL; + } else if(localName.equals(IMAGE)) { + active_root_element = CHANNEL; } active_sub_element = null; strBuilder = new StringBuilder(); } - @Override - public void startDocument() throws SAXException { - items = new ArrayList(); - strBuilder = new StringBuilder(); - - } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - if (qName.equalsIgnoreCase(FeedHandler.CHANNEL)) { + if (localName.equals(CHANNEL)) { if(feed == null) { feed = new Feed(); } - active_root_element = qName; - } else if (qName.equalsIgnoreCase(FeedHandler.ITEM)) { + active_root_element = localName; + } else if (localName.equals(ITEM)) { currentItem = new FeedItem(); - active_root_element = qName; - } else if (qName.equalsIgnoreCase(FeedHandler.TITLE)) { - active_sub_element = qName; - } else if (qName.equalsIgnoreCase(FeedHandler.DESCR)) { - active_sub_element = qName; - } else if (qName.equalsIgnoreCase(FeedHandler.LINK)) { - active_sub_element = qName; - } else if (qName.equalsIgnoreCase(FeedHandler.PUBDATE)) { - active_sub_element = qName; - } else if (qName.equalsIgnoreCase(FeedHandler.ENCLOSURE)) { + active_root_element = localName; + } else if (localName.equals(TITLE)) { + active_sub_element = localName; + } else if (localName.equals(DESCR)) { + active_sub_element = localName; + } else if (localName.equals(LINK)) { + active_sub_element = localName; + } else if (localName.equals(PUBDATE)) { + active_sub_element = localName; + } else if (localName.equals(ENCLOSURE)) { currentItem.setMedia(new FeedMedia(currentItem, - attributes.getValue(FeedHandler.ENC_URL), - Long.parseLong(attributes.getValue(FeedHandler.ENC_LEN)), - attributes.getValue(FeedHandler.ENC_TYPE))); - } else if(qName.equalsIgnoreCase(FeedHandler.IMAGE)) { + attributes.getValue(ENC_URL), + Long.parseLong(attributes.getValue(ENC_LEN)), + attributes.getValue(ENC_TYPE))); + } else if(localName.equals(IMAGE)) { feed.setImage(new FeedImage()); - active_root_element = qName; - } else if(qName.equalsIgnoreCase(FeedHandler.URL)) { + active_root_element = localName; + } else if(localName.equals(URL)) { active_sub_element = qName; } - + 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 5f20a2b87..4e7652dad 100644 --- a/src/de/podfetcher/syndication/handler/SyndHandler.java +++ b/src/de/podfetcher/syndication/handler/SyndHandler.java @@ -1,14 +1,68 @@ package de.podfetcher.syndication.handler; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; -import de.podfetcher.feed.Feed; -import de.podfetcher.feed.FeedItem; +import de.podfetcher.syndication.namespace.Namespace; +import de.podfetcher.syndication.namespace.atom.NSAtom; /** Superclass for all SAX Handlers which process Syndication formats */ public abstract class SyndHandler extends DefaultHandler{ protected HandlerState state; + + + @Override + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException { + state.tagstack.push(qName); + + String[] parts = qName.split(":"); + Namespace handler = state.namespaces.get(parts[0]); + if (handler != null) { + handler.handleElement(localName, state, attributes); + } + } + + + + @Override + public void endElement(String uri, String localName, String qName) + throws SAXException { + state.tagstack.pop(); + } + + + + @Override + public void endPrefixMapping(String prefix) throws SAXException { + state.namespaces.remove(prefix); + } + + + + @Override + public void startPrefixMapping(String prefix, String uri) + throws SAXException { + // Find the right namespace + if (prefix.equals(NSAtom.NSTAG) || uri.equals(NSAtom.NSURI)) { + state.namespaces.put(prefix, new NSAtom()); + } + } + + + + @Override + public void endDocument() throws SAXException { + super.endDocument(); + } + + @Override + public void startDocument() throws SAXException { + state = new HandlerState(); + } + public HandlerState getState() { return state; } diff --git a/src/de/podfetcher/syndication/namespace/NSElement.java b/src/de/podfetcher/syndication/namespace/NSElement.java index 6b62def77..c13cb0dec 100644 --- a/src/de/podfetcher/syndication/namespace/NSElement.java +++ b/src/de/podfetcher/syndication/namespace/NSElement.java @@ -3,9 +3,10 @@ package de.podfetcher.syndication.namespace; import org.xml.sax.Attributes; import de.podfetcher.feed.Feed; +import de.podfetcher.syndication.handler.HandlerState; /** Defines a XML Element of a specific namespace */ public abstract class NSElement { /** Called by its namespace if the processing of the element gets more complex */ - public abstract void handleElement(String localName, Feed feed, Attributes attributes); + public abstract void handleElement(String localName, HandlerState state, Attributes attributes); } diff --git a/src/de/podfetcher/syndication/namespace/Namespace.java b/src/de/podfetcher/syndication/namespace/Namespace.java index 152c53652..3709a35c5 100644 --- a/src/de/podfetcher/syndication/namespace/Namespace.java +++ b/src/de/podfetcher/syndication/namespace/Namespace.java @@ -3,16 +3,17 @@ package de.podfetcher.syndication.namespace; import org.xml.sax.Attributes; import de.podfetcher.feed.Feed; +import de.podfetcher.syndication.handler.HandlerState; 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, Feed feed, Attributes attributes); + public abstract void handleElement(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 String getNsTag(); - public abstract String getNsURI(); } diff --git a/src/de/podfetcher/syndication/namespace/atom/NSAtom.java b/src/de/podfetcher/syndication/namespace/atom/NSAtom.java index c55e9fcd6..803228cc5 100644 --- a/src/de/podfetcher/syndication/namespace/atom/NSAtom.java +++ b/src/de/podfetcher/syndication/namespace/atom/NSAtom.java @@ -3,16 +3,20 @@ package de.podfetcher.syndication.namespace.atom; import org.xml.sax.Attributes; import de.podfetcher.feed.Feed; +import de.podfetcher.syndication.handler.HandlerState; 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, Feed feed, Attributes attributes) { + public void handleElement(String localName, HandlerState state, Attributes attributes) { if (localName.equals(TITLE)) { } @@ -25,14 +29,4 @@ public class NSAtom extends Namespace { } - @Override - public String getNsTag() { - return "atom"; - } - - @Override - public String getNsURI() { - return "http://www.w3.org/2005/Atom"; - } - }