core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/editor/SimpleRSSReader.java
author dadubrow
Tue, 03 Aug 2010 11:50:05 -0500
changeset 1751 4a0d736ba6a0
parent 1721 18638adda547
child 1759 abac0db1cb52
permissions -rw-r--r--
log errors
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1721
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
     1
/*
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
     3
* All rights reserved.
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
     4
* This component and the accompanying materials are made available
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
     6
* which accompanies this distribution, and is available
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
     8
*
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
     9
* Initial Contributors:
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    11
*
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    12
* Contributors:
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    13
*
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    14
* Description: 
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    15
*
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    16
*/
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    17
package com.nokia.carbide.internal.discovery.ui.editor;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    18
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    19
import java.io.IOException;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    20
import java.io.InputStream;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    21
import java.net.MalformedURLException;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    22
import java.net.URL;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    23
import java.net.URLConnection;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    24
import java.text.DateFormat;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    25
import java.text.ParseException;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    26
import java.util.ArrayList;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    27
import java.util.Date;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    28
import java.util.HashSet;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    29
import java.util.List;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    30
import java.util.Set;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    31
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    32
import javax.xml.parsers.ParserConfigurationException;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    33
import javax.xml.parsers.SAXParser;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    34
import javax.xml.parsers.SAXParserFactory;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    35
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    36
import org.xml.sax.Attributes;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    37
import org.xml.sax.SAXException;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    38
import org.xml.sax.helpers.DefaultHandler;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    39
1751
4a0d736ba6a0 log errors
dadubrow
parents: 1721
diff changeset
    40
import com.nokia.carbide.discovery.ui.Activator;
4a0d736ba6a0 log errors
dadubrow
parents: 1721
diff changeset
    41
1721
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    42
/**
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    43
 * A simple RSS reader
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    44
 * @see http://www.rssboard.org/rss-specification
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    45
 */
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    46
public class SimpleRSSReader {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    47
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    48
	public static class Rss {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    49
		private List<Channel> channels = new ArrayList<Channel>();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    50
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    51
		public List<Channel> getChannels() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    52
			return channels;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    53
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    54
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    55
		protected void addChannel(Channel channel) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    56
			channels.add(channel);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    57
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    58
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    59
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    60
	public static class Container {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    61
		private String title;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    62
		private URL link;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    63
		private String description;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    64
		private Date pubDate;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    65
		private List<String> categories = new ArrayList<String>();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    66
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    67
		public String getTitle() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    68
			return title;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    69
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    70
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    71
		public URL getLink() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    72
			return link;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    73
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    74
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    75
		public String getDescription() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    76
			return description;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    77
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    78
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    79
		public Date getPubDate() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    80
			return pubDate;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    81
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    82
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    83
		public String[] getCategories() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    84
			return (String[]) categories.toArray(new String[categories.size()]);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    85
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    86
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    87
		public boolean isValid() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    88
			return title != null && link != null && description != null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    89
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    90
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    91
		protected void setField(String element, String value) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    92
			if (RSSHandler.TITLE.equals(element))
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    93
				title = value;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    94
			else if (RSSHandler.LINK.equals(element)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    95
				try {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    96
					link = new URL(value);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    97
				} catch (MalformedURLException e) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    98
					// don't store malformed URLs
1751
4a0d736ba6a0 log errors
dadubrow
parents: 1721
diff changeset
    99
					Activator.logError("Bad URL", e);
1721
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   100
				}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   101
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   102
			else if (RSSHandler.DESCRIPTION.equals(element) || RSSHandler.SUMMARY.equals(element))
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   103
				description = value;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   104
			else if (RSSHandler.PUBDATE.equals(element)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   105
				try {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   106
					// FIXME parser needs writing!!
1751
4a0d736ba6a0 log errors
dadubrow
parents: 1721
diff changeset
   107
					DateFormat dateFormat = DateFormat.getInstance();
4a0d736ba6a0 log errors
dadubrow
parents: 1721
diff changeset
   108
					dateFormat.setLenient(true);
4a0d736ba6a0 log errors
dadubrow
parents: 1721
diff changeset
   109
					pubDate = dateFormat.parse(value);
1721
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   110
				} catch (ParseException e) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   111
					// don't store malformed dates
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   112
				}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   113
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   114
			else if (RSSHandler.CATEGORY.equals(element))
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   115
				categories.add(value);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   116
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   117
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   118
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   119
	public static class Channel extends Container {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   120
		List<Item> items = new ArrayList<Item>();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   121
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   122
		public List<Item> getItems() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   123
			return items;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   124
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   125
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   126
		protected void addItem(Item item) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   127
			items.add(item);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   128
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   129
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   130
		public boolean hasItems() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   131
			return !items.isEmpty();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   132
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   133
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   134
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   135
	public static class Item extends Container {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   136
		private Channel channel;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   137
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   138
		public Item(Channel channel) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   139
			this.channel = channel;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   140
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   141
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   142
		public Channel getChannel() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   143
			return channel;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   144
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   145
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   146
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   147
	private static class RSSHandler extends DefaultHandler {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   148
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   149
		private static final String CHANNEL = "channel"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   150
		private static final String TITLE = "title"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   151
		private static final String LINK = "link"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   152
		private static final String DESCRIPTION = "description"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   153
		private static final String SUMMARY = "atom:summary"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   154
		private static final String ITEM = "item"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   155
		private static final String PUBDATE = "pubDate"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   156
		private static final String CATEGORY = "category"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   157
		private static final Set<String> charsElements = new HashSet<String>();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   158
		static {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   159
			charsElements.add(TITLE);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   160
			charsElements.add(LINK);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   161
			charsElements.add(DESCRIPTION);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   162
			charsElements.add(SUMMARY);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   163
			charsElements.add(PUBDATE);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   164
			charsElements.add(CATEGORY);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   165
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   166
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   167
		private Channel curChannel;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   168
		private Item curItem;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   169
		private StringBuffer charsBuf;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   170
		private Rss rss;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   171
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   172
		public RSSHandler(Rss rss) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   173
			this.rss = rss;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   174
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   175
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   176
		@Override
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   177
		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   178
			if (charsElements.contains(qName)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   179
				charsBuf = new StringBuffer();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   180
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   181
			if (CHANNEL.equals(qName)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   182
				curChannel = new Channel();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   183
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   184
			else if (ITEM.equals(qName) && curChannel != null) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   185
				curItem = new Item(curChannel);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   186
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   187
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   188
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   189
		@Override
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   190
		public void endElement(String uri, String localName, String qName) throws SAXException {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   191
			if (CHANNEL.equals(qName)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   192
				if (curChannel != null && curChannel.isValid() && curChannel.hasItems())
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   193
					rss.addChannel(curChannel);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   194
				curChannel = null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   195
				curItem = null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   196
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   197
			else if (ITEM.equals(qName)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   198
				if (curChannel != null && curItem != null && curItem.isValid())
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   199
					curChannel.addItem(curItem);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   200
				curItem = null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   201
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   202
			else if (charsBuf != null && curChannel != null) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   203
				if (curItem != null)
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   204
					curItem.setField(qName, charsBuf.toString().trim());
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   205
				else
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   206
					curChannel.setField(qName, charsBuf.toString().trim());
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   207
				charsBuf = null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   208
			} 
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   209
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   210
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   211
		@Override
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   212
		public void characters(char[] ch, int start, int length) throws SAXException {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   213
			if (charsBuf != null) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   214
				charsBuf.append(new String(ch, start, length));
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   215
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   216
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   217
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   218
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   219
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   220
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   221
	public static Rss readRSS(URL url) throws SAXException, IOException, ParserConfigurationException {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   222
		Rss rss = new Rss();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   223
		URLConnection connection = url.openConnection();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   224
		connection.connect();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   225
		InputStream inputStream = url.openStream();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   226
		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   227
		parser.parse(inputStream, new RSSHandler(rss));
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   228
		return rss;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   229
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   230
}