uidate: fix newsfeed images
[scilab.git] / scilab / modules / ui_data / src / java / org / scilab / modules / ui_data / newsfeed / NewsFetcher.java
1 /*\r
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
3 * Copyright (C) 2015 - Scilab Enterprises\r
4 *\r
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises\r
6  *\r
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,\r
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.\r
9  * This file was originally licensed under the terms of the CeCILL v2.1,\r
10  * and continues to be available under such terms.\r
11  * For more information, see the COPYING file which you should have received\r
12  * along with this program.\r
13 *\r
14 */\r
15 \r
16 package org.scilab.modules.ui_data.newsfeed;\r
17 \r
18 import java.net.URL;\r
19 \r
20 import javax.xml.parsers.DocumentBuilder;\r
21 import javax.xml.parsers.DocumentBuilderFactory;\r
22 import org.w3c.dom.Document;\r
23 import org.w3c.dom.Element;\r
24 import org.w3c.dom.NodeList;\r
25 import org.w3c.dom.Node;\r
26 \r
27 import java.util.Date;\r
28 import java.text.SimpleDateFormat;\r
29 import java.util.Locale;\r
30 \r
31 import java.util.List;\r
32 import java.util.ArrayList;\r
33 \r
34 /**\r
35  * Fetches news through a RSS feed\r
36  * The RSS URL is configurable in the settings file\r
37  */\r
38 public class NewsFetcher {\r
39     private URL rssURL = null;\r
40 \r
41     public NewsFetcher() {\r
42     }\r
43 \r
44     public void readSettings() throws Exception {\r
45         rssURL = null;\r
46         String urlSetting = NewsFeedSettings.getStringSetting("url");\r
47         rssURL = new URL(urlSetting);\r
48     }\r
49 \r
50     public URL getURL() {\r
51         return rssURL;\r
52     }\r
53 \r
54 \r
55     public boolean isOK() {\r
56         return rssURL != null;\r
57     }\r
58 \r
59     public List<News> fetchNews() throws Exception {\r
60         List<News> newsList = new ArrayList<News>();\r
61         DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();\r
62         Document doc = builder.parse(rssURL.openStream());\r
63 \r
64         NodeList items = doc.getElementsByTagName("item");\r
65         if ((items == null) || (items.getLength() == 0)) {\r
66             throw new Exception("The fetched document has no 'item' element, please check it is a RSS feed.");\r
67         }\r
68 \r
69         SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);\r
70 \r
71         for (int i = 0; i < items.getLength(); i++) {\r
72             Element item = (Element) items.item(i);\r
73             String title = getItemValue(item, "title");\r
74             String dateStr = getItemValue(item, "pubDate");\r
75             Date date = formatter.parse(dateStr);\r
76             String description = getItemValue(item, "description");\r
77             String content = getItemValue(item, "content:encoded");\r
78             // media content\r
79             NewsMediaContent mediaContent = null;\r
80             Node mediaContentNode = getItemNode(item, "media:content");\r
81             if (mediaContentNode != null) {\r
82                 String url = mediaContentNode.getAttributes().getNamedItem("url").getNodeValue();\r
83                 String width = mediaContentNode.getAttributes().getNamedItem("width").getNodeValue();\r
84                 String height = mediaContentNode.getAttributes().getNamedItem("height").getNodeValue();\r
85                 mediaContent = new NewsMediaContent(url, width, height);\r
86             }\r
87             String link = getItemValue(item, "link");\r
88             newsList.add(new News(title, date, description, content, mediaContent, link));\r
89         }\r
90         return newsList;\r
91     }\r
92 \r
93     private Node getItemNode(Element item, String nodeName) {\r
94         NodeList nodeList = item.getElementsByTagName(nodeName);\r
95         if (nodeList.getLength() > 0) {\r
96             return nodeList.item(0);\r
97         } else {\r
98             return null;\r
99         }\r
100     }\r
101 \r
102     private String getItemValue(Element item, String nodeName) {\r
103         Node node = getItemNode(item, nodeName);\r
104         if (node != null) {\r
105             if (node.hasChildNodes()) {\r
106                 return node.getFirstChild().getNodeValue();\r
107             }\r
108         }\r
109         return null;\r
110     }\r
111 \r
112 }\r