core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/editor/SimpleRSSReader.java
author dadubrow
Thu, 29 Jul 2010 13:28:20 -0500
changeset 1721 18638adda547
child 1751 4a0d736ba6a0
permissions -rw-r--r--
more portal changes: - support for rss - better browser support - add some rss feeds
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
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    40
/**
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    41
 * A simple RSS reader
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    42
 * @see http://www.rssboard.org/rss-specification
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    43
 */
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    44
public class SimpleRSSReader {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    45
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    46
	public static class Rss {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    47
		private List<Channel> channels = new ArrayList<Channel>();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    48
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    49
		public List<Channel> getChannels() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    50
			return channels;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    51
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    52
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    53
		protected void addChannel(Channel channel) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    54
			channels.add(channel);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    55
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    56
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    57
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    58
	public static class Container {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    59
		private String title;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    60
		private URL link;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    61
		private String description;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    62
		private Date pubDate;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    63
		private List<String> categories = new ArrayList<String>();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    64
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    65
		public String getTitle() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    66
			return title;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    67
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    68
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    69
		public URL getLink() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    70
			return link;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    71
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    72
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    73
		public String getDescription() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    74
			return description;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    75
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    76
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    77
		public Date getPubDate() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    78
			return pubDate;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    79
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    80
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    81
		public String[] getCategories() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    82
			return (String[]) categories.toArray(new String[categories.size()]);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    83
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    84
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    85
		public boolean isValid() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    86
			return title != null && link != null && description != null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    87
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    88
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    89
		protected void setField(String element, String value) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    90
			if (RSSHandler.TITLE.equals(element))
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    91
				title = value;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    92
			else if (RSSHandler.LINK.equals(element)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    93
				try {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    94
					link = new URL(value);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    95
				} catch (MalformedURLException e) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    96
					// don't store malformed URLs
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    97
					e.printStackTrace();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    98
				}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
    99
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   100
			else if (RSSHandler.DESCRIPTION.equals(element) || RSSHandler.SUMMARY.equals(element))
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   101
				description = value;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   102
			else if (RSSHandler.PUBDATE.equals(element)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   103
				try {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   104
					// FIXME parser needs writing!!
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   105
					pubDate = DateFormat.getInstance().parse(value);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   106
				} catch (ParseException e) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   107
					// don't store malformed dates
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   108
//					e.printStackTrace();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   109
				}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   110
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   111
			else if (RSSHandler.CATEGORY.equals(element))
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   112
				categories.add(value);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   113
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   114
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   115
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   116
	public static class Channel extends Container {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   117
		List<Item> items = new ArrayList<Item>();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   118
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   119
		public List<Item> getItems() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   120
			return items;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   121
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   122
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   123
		protected void addItem(Item item) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   124
			items.add(item);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   125
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   126
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   127
		public boolean hasItems() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   128
			return !items.isEmpty();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   129
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   130
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   131
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   132
	public static class Item extends Container {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   133
		private Channel channel;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   134
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   135
		public Item(Channel channel) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   136
			this.channel = channel;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   137
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   138
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   139
		public Channel getChannel() {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   140
			return channel;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   141
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   142
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   143
	
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   144
	private static class RSSHandler extends DefaultHandler {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   145
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   146
		private static final String CHANNEL = "channel"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   147
		private static final String TITLE = "title"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   148
		private static final String LINK = "link"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   149
		private static final String DESCRIPTION = "description"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   150
		private static final String SUMMARY = "atom:summary"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   151
		private static final String ITEM = "item"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   152
		private static final String PUBDATE = "pubDate"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   153
		private static final String CATEGORY = "category"; //$NON-NLS-1$
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   154
		private static final Set<String> charsElements = new HashSet<String>();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   155
		static {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   156
			charsElements.add(TITLE);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   157
			charsElements.add(LINK);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   158
			charsElements.add(DESCRIPTION);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   159
			charsElements.add(SUMMARY);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   160
			charsElements.add(PUBDATE);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   161
			charsElements.add(CATEGORY);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   162
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   163
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   164
		private Channel curChannel;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   165
		private Item curItem;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   166
		private StringBuffer charsBuf;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   167
		private Rss rss;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   168
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   169
		public RSSHandler(Rss rss) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   170
			this.rss = rss;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   171
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   172
		
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   173
		@Override
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   174
		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   175
			if (charsElements.contains(qName)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   176
				charsBuf = new StringBuffer();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   177
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   178
			if (CHANNEL.equals(qName)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   179
				curChannel = new Channel();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   180
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   181
			else if (ITEM.equals(qName) && curChannel != null) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   182
				curItem = new Item(curChannel);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   183
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   184
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   185
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   186
		@Override
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   187
		public void endElement(String uri, String localName, String qName) throws SAXException {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   188
			if (CHANNEL.equals(qName)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   189
				if (curChannel != null && curChannel.isValid() && curChannel.hasItems())
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   190
					rss.addChannel(curChannel);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   191
				curChannel = null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   192
				curItem = null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   193
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   194
			else if (ITEM.equals(qName)) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   195
				if (curChannel != null && curItem != null && curItem.isValid())
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   196
					curChannel.addItem(curItem);
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   197
				curItem = null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   198
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   199
			else if (charsBuf != null && curChannel != null) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   200
				if (curItem != null)
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   201
					curItem.setField(qName, charsBuf.toString().trim());
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   202
				else
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   203
					curChannel.setField(qName, charsBuf.toString().trim());
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   204
				charsBuf = null;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   205
			} 
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   206
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   207
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   208
		@Override
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   209
		public void characters(char[] ch, int start, int length) throws SAXException {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   210
			if (charsBuf != null) {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   211
				charsBuf.append(new String(ch, start, length));
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   212
			}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   213
		}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   214
		
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
	public static Rss readRSS(URL url) throws SAXException, IOException, ParserConfigurationException {
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   219
		Rss rss = new Rss();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   220
		URLConnection connection = url.openConnection();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   221
		connection.connect();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   222
		InputStream inputStream = url.openStream();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   223
		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   224
		parser.parse(inputStream, new RSSHandler(rss));
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   225
		return rss;
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   226
	}
18638adda547 more portal changes:
dadubrow
parents:
diff changeset
   227
}