A complete 3D game development suite written purely in Java.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
jmonkeyengine/sdk/jme3-welcome-screen/src/com/jme3/gde/welcome/rss/RssFeedParser.java

242 lines
10 KiB

package com.jme3.gde.welcome.rss;
/**
*
* @author Lars Vogel, normenhansen
*/
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;
import org.openide.util.Exceptions;
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";
private final URL url;
private final HTMLEditorKit ekit;
private final HTMLDocument doc;
public RssFeedParser(String feedUrl) {
try {
this.url = new URL(feedUrl);
ekit = new HTMLEditorKit();
doc = new HTMLDocument();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public HTMLDocument getDocument() {
return doc;
}
public HTMLEditorKit getEditorKit() {
return ekit;
}
public void updateFeed() {
Thread t = new Thread(new Runnable() {
public void run() {
try {
final Feed feed = readFeed();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
List<FeedMessage> msgs = feed.getMessages();
try {
doc.remove(0, doc.getLength());
ekit.insertHTML(doc, doc.getLength(),
"<html>"
+ "<head>"
+ "</head>"
+ "<body>",
0,
0,
null);
// ekit.insertHTML(doc, doc.getLength(),
// "<h1>"
// + "Latest News"
// + "</h1>",
// 0,
// 0,
// null);
for (FeedMessage feedMessage : msgs) {
ekit.insertHTML(doc, doc.getLength(),
"<h3><a href='"
+ feedMessage.getLink()
+ "'>"
+ feedMessage.getTitle()
+ "</a></h3>",
0,
0,
null);
// ekit.insertHTML(doc, doc.getLength(),
// "<p>"
// + feedMessage.getDescription()
// + "</p>",
// 0,
// 0,
// null);
ekit.insertHTML(doc, doc.getLength(),
"<br/>",
0,
0,
null);
}
ekit.insertHTML(doc, doc.getLength(),
"</body>"
+ "</html>",
0,
0,
null);
doc.insertString(0, "", null);
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
});
} catch (Exception ex) {
Exceptions.printStackTrace(ex);
}
}
});
t.start();
}
@SuppressWarnings("null")
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()) {
if (event.asStartElement().getName().getLocalPart() != null && event.asStartElement().getName().getLocalPart().equals(ITEM)) {
if (isFeedHeader) {
isFeedHeader = false;
feed = new Feed(title, link, description, language,
copyright, pubdate);
}
event = eventReader.nextEvent();
continue;
}
if (event.asStartElement().getName().getLocalPart() != null && event.asStartElement().getName().getLocalPart().equals(TITLE)) {
event = eventReader.nextEvent();
title = event.asCharacters().getData();
continue;
}
if (event.asStartElement().getName().getLocalPart() != null && event.asStartElement().getName().getLocalPart().equals(DESCRIPTION)) {
event = eventReader.nextEvent();
if(event.getClass().getName().equals("com.ctc.wstx.evt.CompactStartElement")){
description = event.asStartElement().asCharacters().getData();
}else{
description = event.asCharacters().getData();
}
continue;
}
if (event.asStartElement().getName().getLocalPart() != null && event.asStartElement().getName().getLocalPart().equals(LINK)) {
event = eventReader.nextEvent();
//System.out.println("Teh hack: " + event.toString() + event.getClass());
Object chars = event.asCharacters();
if (chars instanceof javax.xml.stream.events.Characters) {
javax.xml.stream.events.Characters jchars = (javax.xml.stream.events.Characters) chars;
link = jchars.getData();
} else {
link = event.asCharacters().getData();
}
continue;
}
if (event.asStartElement().getName().getLocalPart() != null && event.asStartElement().getName().getLocalPart().equals(GUID)) {
event = eventReader.nextEvent();
guid = event.asCharacters().getData();
continue;
}
if (event.asStartElement().getName().getLocalPart() != null && event.asStartElement().getName().getLocalPart().equals(LANGUAGE)) {
event = eventReader.nextEvent();
language = event.asCharacters().getData();
continue;
}
if (event.asStartElement().getName().getLocalPart() != null && event.asStartElement().getName().getLocalPart().equals(AUTHOR)) {
event = eventReader.nextEvent();
author = event.asCharacters().getData();
continue;
}
if (event.asStartElement().getName().getLocalPart() != null && event.asStartElement().getName().getLocalPart().equals(PUB_DATE)) {
event = eventReader.nextEvent();
pubdate = event.asCharacters().getData();
continue;
}
if (event.asStartElement().getName().getLocalPart() != null && event.asStartElement().getName().getLocalPart().equals(COPYRIGHT)) {
event = eventReader.nextEvent();
copyright = event.asCharacters().getData();
continue;
}
} else if (event.isEndElement()) {
if (event.asEndElement().getName().getLocalPart() != null && event.asEndElement().getName().getLocalPart().equals(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 InputStream read() {
try {
return url.openStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}