/* * Copyright 2008-2013 Lars Vogel * * Licensed under the Eclipse Public License - v 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.eclipse.org/legal/epl-v10.html * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES * OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and * limitations under the License. */ package com.amazonaws.eclipse.core.rss; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.XMLEvent; public class RSSFeedParser { static final String TITLE = "title"; static final String DESCRIPTION = "description"; static final String CHANNEL = "channel"; static final String LANGUAGE = "language"; static final String COPYRIGHT = "copyright"; static final String LINK = "link"; static final String AUTHOR = "author"; static final String ITEM = "item"; static final String PUB_DATE = "pubDate"; static final String GUID = "guid"; final URL url; public RSSFeedParser(String feedUrl) { try { this.url = new URL(feedUrl); } catch (MalformedURLException e) { throw new RuntimeException(e); } } public Feed readFeed() { Feed feed = null; try { boolean isFeedHeader = true; // Set header values intial to the empty string String description = ""; String title = ""; String link = ""; String language = ""; String copyright = ""; String author = ""; String pubdate = ""; String guid = ""; // First create a new XMLInputFactory XMLInputFactory inputFactory = XMLInputFactory.newInstance(); // Setup a new eventReader InputStream in = read(); XMLEventReader eventReader = inputFactory.createXMLEventReader(in); // Read the XML document while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); if (event.isStartElement()) { String localPart = event.asStartElement().getName().getLocalPart(); if (localPart.equals(ITEM)) { if (isFeedHeader) { isFeedHeader = false; feed = new Feed(title, link, description, language, copyright, pubdate); } event = eventReader.nextEvent(); } else if (localPart.equals(TITLE)) { title = getCharacterData(event, eventReader); } else if (localPart.equals(DESCRIPTION)) { description = getCharacterData(event, eventReader); } else if (localPart.equals(LINK)) { link = getCharacterData(event, eventReader); } else if (localPart.equals(GUID)) { guid = getCharacterData(event, eventReader); } else if (localPart.equals(LANGUAGE)) { language = getCharacterData(event, eventReader); } else if (localPart.equals(AUTHOR)) { author = getCharacterData(event, eventReader); } else if (localPart.equals(PUB_DATE)) { pubdate = getCharacterData(event, eventReader); } else if (localPart.equals(COPYRIGHT)) { copyright = getCharacterData(event, eventReader); } } else if (event.isEndElement()) { if (event.asEndElement().getName().getLocalPart() == (ITEM)) { FeedMessage message = new FeedMessage(); message.setAuthor(author); message.setDescription(description); message.setGuid(guid); message.setLink(link); message.setTitle(title); feed.getMessages().add(message); event = eventReader.nextEvent(); continue; } } } } catch (XMLStreamException e) { throw new RuntimeException(e); } return feed; } private String getCharacterData(XMLEvent event, XMLEventReader eventReader) throws XMLStreamException { String result = ""; event = eventReader.nextEvent(); if (event instanceof Characters) { result = event.asCharacters().getData(); } return result; } private InputStream read() { try { return url.openStream(); } catch (IOException e) { throw new RuntimeException(e); } } }