Added:
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/InterpretationException.java
Modified:
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/META-INF/MANIFEST.MF
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/FeedPoller.java
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/FeedReader.java
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/Interpreter.java
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/interpreters/AtomInterpreter.java
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/interpreters/ICalInterpreter.java
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/interpreters/RSSInterpreter.java
=======================================
--- /dev/null
+++
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/InterpretationException.java
Mon Aug 23 15:54:15 2010
@@ -0,0 +1,29 @@
+package com.solertium.gogoego.server.extensions.feedreader;
+
+public class InterpretationException extends Exception {
+
+ private static final long serialVersionUID = 1L;
+
+ public InterpretationException() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ public InterpretationException(String message, Throwable cause) {
+ super(message, cause);
+ // TODO Auto-generated constructor stub
+ }
+
+ public InterpretationException(String message) {
+ super(message);
+ // TODO Auto-generated constructor stub
+ }
+
+ public InterpretationException(Throwable cause) {
+ super(cause);
+ // TODO Auto-generated constructor stub
+ }
+
+
+
+}
=======================================
---
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/META-INF/MANIFEST.MF
Tue Feb 23 14:07:17 2010
+++
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/META-INF/MANIFEST.MF
Mon Aug 23 15:54:15 2010
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: FeedReader
Bundle-SymbolicName: com.solertium.gogoego.server.extensions.feedreader
-Bundle-Version: 1.2.2
+Bundle-Version: 1.2.3
Bundle-Activator:
com.solertium.gogoego.server.extensions.feedreader.Activator
Bundle-Vendor: Solertium
Bundle-RequiredExecutionEnvironment: J2SE-1.5
=======================================
---
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/FeedPoller.java
Tue Feb 23 14:07:17 2010
+++
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/FeedPoller.java
Mon Aug 23 15:54:15 2010
@@ -36,7 +36,6 @@
import
com.solertium.gogoego.server.extensions.feedreader.interpreters.AtomInterpreter;
import
com.solertium.gogoego.server.extensions.feedreader.interpreters.ICalInterpreter;
import
com.solertium.gogoego.server.extensions.feedreader.interpreters.RSSInterpreter;
-import com.solertium.util.SysDebugger;
import com.solertium.vfs.ConflictException;
import com.solertium.vfs.VFS;
import com.solertium.vfs.VFSMetadata;
@@ -65,9 +64,12 @@
Object latestLock = new Object();
boolean running = false;
long stamp = 0L;
+
+ private String debug;
public FeedPoller(final String feedURL) {
GoGoEgo.debug().println("NEW feed poller created for " + feedURL);
+ this.debug =
GoGoEgo.get().getFromContext(Application.getCurrent().getContext()).getSiteID()+"debug";
this.feedURL = feedURL;
}
@@ -92,6 +94,7 @@
}
final long age = (System.currentTimeMillis() - stamp) / 1000;
if (age > Long.valueOf(minWaitSeconds)) {
+ GoGoEgo.debug().println("Age ({0}) is greater than {1}, freshening:
{2}", age, minWaitSeconds, feedURL);
synchronized (this) {
if (running)
GoGoEgo.debug().println("But freshener is already running");
@@ -101,13 +104,15 @@
new Thread(new Runnable() {
public void run() {
try {
+ GoGoEgo.debug(debug).println("Freshening {0}", feedURL);
Response resp = context.getClientDispatcher().get(feedURL);
+ GoGoEgo.debug(debug).println("Freshened {0}, response is {1}",
feedURL, resp.getStatus());
if (resp.getStatus().isSuccess()) {
final Writer w = vfs.getWriter(cachePath);
w.write(resp.getEntity().getText());
w.flush();
w.close();
- GoGoEgo.getCacheHandler().removeFromCache(context, feedURL);
+ //GoGoEgo.getCacheHandler().removeFromCache(context, feedURL);
synchronized (latestLock) {
latest = null; // invalidate latest
// read
@@ -129,12 +134,12 @@
}
}
} catch (final Throwable t) {
- t.printStackTrace();
+ GoGoEgo.debug(debug).println("Failed to freshen {0}\n{1}",
feedURL, t);
} finally {
// it is vitally important this always
// be set to false after a run, or the
// feed will not receive more updates
- GoGoEgo.debug().println("finally in freshener.run()");
+ GoGoEgo.debug(debug).println("finally in freshener.run()");
running = false;
}
}
@@ -153,27 +158,42 @@
}
}
} else
- GoGoEgo.debug().println("Age (" + age + ") is less than " +
minWaitSeconds + ", not freshened");
+ GoGoEgo.debug().println("Age ({0}) is less than {1}, not freshened:
{2}", age, minWaitSeconds, feedURL);
FeedInfo fi = null;
synchronized (latestLock) {
if (latest != null)
fi = latest.get();
}
- if (fi == null)
- try {
- fi = new FeedInfo();
- if("RSS".equalsIgnoreCase(format)){
- new RSSInterpreter(feedURL).interpretFeedInfo(cachePath, vfs, fi);
- } else if("ATOM".equalsIgnoreCase(format)){
- new AtomInterpreter(feedURL).interpretFeedInfo(cachePath, vfs, fi);
- } else if("ICAL".equalsIgnoreCase(format)){
- new ICalInterpreter(feedURL).interpretFeedInfo(cachePath, vfs, fi);
- }
- latest = new SoftReference<FeedInfo>(fi);
- } catch (final RuntimeException rx) {
- rx.printStackTrace();
- }
+ if (fi == null) {
+ fi = new FeedInfo();
+
+ //TODO: OSGi!
+
+ Interpreter interpreter = null;
+ if ("RSS".equalsIgnoreCase(format))
+ interpreter = new RSSInterpreter(feedURL);
+ else if ("ATOM".equalsIgnoreCase(format))
+ interpreter = new AtomInterpreter(feedURL);
+ else if ("ICAL".equalsIgnoreCase(format))
+ interpreter = new ICalInterpreter(feedURL);
+
+ if (interpreter == null)
+ GoGoEgo.debug().println("No suitable intepreter found for {0} with
format {1}", feedURL, format);
+ else {
+ try {
+ interpreter.interpretFeedInfo(cachePath, vfs, fi);
+ } catch (InterpretationException e) {
+ GoGoEgo.debug().println("User Error? Failed to interpret {0} via
{1}", feedURL, interpreter.getClass().getSimpleName());
+ GoGoEgo.debug().println("Interpretation Error: {0}", e);
+ } catch (RuntimeException e) {
+ GoGoEgo.debug().println("Unexpected error attempting to interpret {0}
via {1}", feedURL, interpreter.getClass().getSimpleName());
+ GoGoEgo.debug().println("Interpretation Error: {0}", e);
+ }
+ }
+
+ latest = new SoftReference<FeedInfo>(fi);
+ }
feedInfo.merge(fi);
return true;
}
=======================================
---
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/FeedReader.java
Tue Feb 23 14:07:17 2010
+++
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/FeedReader.java
Mon Aug 23 15:54:15 2010
@@ -35,7 +35,6 @@
import org.restlet.data.Request;
import com.solertium.util.MD5Hash;
-import com.solertium.util.SysDebugger;
import com.solertium.vfs.VFSPath;
/**
@@ -61,7 +60,10 @@
}
public FeedItem getItem(final int index) {
- return feedInfo.getItems().get(index);
+ if (index >= 0 && index < feedInfo.getItems().size())
+ return feedInfo.getItems().get(index);
+ else
+ return null;
}
public String getItemCount() {
@@ -89,11 +91,11 @@
}
public String loadFeed(final String url) {
- return loadFeed(url, "RSS", "/feedcache/" + new MD5Hash(url)
+ ".xml", "600");
+ return loadFeed(url, "RSS", "/feedcache/" + new MD5Hash(url+"V3")
+ ".xml", "600");
}
public String loadFeed(final String url, final String format) {
- return loadFeed(url, format, "/feedcache/" + new MD5Hash(url)
+ ".xml", "600");
+ return loadFeed(url, format, "/feedcache/" + new MD5Hash(url+"V3")
+ ".xml", "600");
}
/**
=======================================
---
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/Interpreter.java
Fri Nov 6 09:38:08 2009
+++
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/Interpreter.java
Mon Aug 23 15:54:15 2010
@@ -29,6 +29,9 @@
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import com.solertium.vfs.VFS;
+import com.solertium.vfs.VFSPath;
+
/**
* Interpreter.java
*
@@ -58,7 +61,7 @@
}
}
- public final FeedItem interpretFeedItem(Node itemNode) {
+ public final FeedItem interpretFeedItem(Node itemNode) throws
InterpretationException {
final FeedItem item = doInterpretFeedItem(itemNode);
if (item != null) {
item.setOrigin(origin);
@@ -71,5 +74,7 @@
return origin;
}
- protected abstract FeedItem doInterpretFeedItem(Object itemNode);
-}
+ public abstract void interpretFeedInfo(VFSPath path, VFS vfs, FeedInfo
feedInfo) throws InterpretationException;
+
+ protected abstract FeedItem doInterpretFeedItem(Object itemNode) throws
InterpretationException;
+}
=======================================
---
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/interpreters/AtomInterpreter.java
Tue Feb 23 14:02:06 2010
+++
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/interpreters/AtomInterpreter.java
Mon Aug 23 15:54:15 2010
@@ -27,6 +27,7 @@
import java.text.SimpleDateFormat;
import java.util.Date;
+import org.gogoego.api.plugins.GoGoEgo;
import org.gogoego.api.utils.DocumentUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -35,9 +36,10 @@
import com.solertium.gogoego.server.extensions.feedreader.FeedInfo;
import com.solertium.gogoego.server.extensions.feedreader.FeedItem;
+import
com.solertium.gogoego.server.extensions.feedreader.InterpretationException;
import com.solertium.gogoego.server.extensions.feedreader.Interpreter;
import com.solertium.util.BaseDocumentUtils;
-import com.solertium.util.TrivialExceptionHandler;
+import com.solertium.vfs.NotFoundException;
import com.solertium.vfs.VFS;
import com.solertium.vfs.VFSPath;
@@ -53,20 +55,29 @@
super(origin);
}
- public void interpretFeedInfo(VFSPath path, VFS vfs, FeedInfo feedInfo){
+ public void interpretFeedInfo(VFSPath path, VFS vfs, FeedInfo feedInfo)
throws InterpretationException {
try {
interpretFeedInfo(DocumentUtils.getReadOnlyDocument(path, vfs),
feedInfo);
+ } catch (NotFoundException e) {
+ throw new InterpretationException("Could not find " + path, e);
} catch (IOException e) {
- TrivialExceptionHandler.ignore(this, e);
+ throw new InterpretationException("Could not load " + path, e);
+ } catch (InterpretationException e) {
+ GoGoEgo.debug().println("Failed to interpret feed {0}", path);
+ throw e;
}
}
- public void interpretFeedInfo(Document doc, FeedInfo feedInfo){
- //Document doc = DocumentUtils.getReadOnlyDocument(path, vfs);
+ public void interpretFeedInfo(Document doc, FeedInfo feedInfo) throws
InterpretationException {
setNamespaceAware(doc);
- feedInfo.parseNamespaces(parsers,
doc.getElementsByTagName("feed").item(0));
-
- final NodeList nodes =
doc.getElementsByTagName("feed").item(0).getChildNodes();
+
+ final Node feed = doc.getElementsByTagName("feed").item(0);
+ if (feed == null)
+ throw new InterpretationException("No 'feed' nodes found; does not
follow reported schema for RSS");
+
+ feedInfo.parseNamespaces(parsers, feed);
+
+ final NodeList nodes = feed.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
final Node current = nodes.item(i);
if (current.getNodeName().equals("entry"))
=======================================
---
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/interpreters/ICalInterpreter.java
Tue Feb 23 12:29:12 2010
+++
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/interpreters/ICalInterpreter.java
Mon Aug 23 15:54:15 2010
@@ -36,6 +36,7 @@
import com.solertium.gogoego.server.extensions.feedreader.FeedInfo;
import com.solertium.gogoego.server.extensions.feedreader.ICalFeedItem;
+import
com.solertium.gogoego.server.extensions.feedreader.InterpretationException;
import com.solertium.gogoego.server.extensions.feedreader.Interpreter;
import com.solertium.vfs.NotFoundException;
import com.solertium.vfs.VFS;
@@ -56,7 +57,7 @@
cbuilder = new CalendarBuilder();
}
- public void interpretFeedInfo(VFSPath path, VFS vfs, FeedInfo feedInfo){
+ public void interpretFeedInfo(VFSPath path, VFS vfs, FeedInfo feedInfo)
throws InterpretationException {
try {
//this is not namespace aware, doesnt need to be
Calendar cal = cbuilder.build(vfs.getInputStream(path));
@@ -75,11 +76,11 @@
feedInfo.setSortField("startdate");
} catch (ParserException e) {
- e.printStackTrace();
+ throw new InterpretationException("Failed to parse " + path, e);
} catch (NotFoundException e) {
- e.printStackTrace();
+ throw new InterpretationException("Could not find " + path, e);
} catch (IOException e) {
- e.printStackTrace();
+ throw new InterpretationException("Could not load " + path, e);
}
}
=======================================
---
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/interpreters/RSSInterpreter.java
Tue Feb 23 14:02:06 2010
+++
/trunk/modules/com.solertium.gogoego.server.extensions.feedreader/src/com/solertium/gogoego/server/extensions/feedreader/interpreters/RSSInterpreter.java
Mon Aug 23 15:54:15 2010
@@ -24,14 +24,15 @@
import java.io.IOException;
-import org.gogoego.api.utils.DocumentUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.solertium.gogoego.server.extensions.feedreader.FeedInfo;
import com.solertium.gogoego.server.extensions.feedreader.FeedItem;
+import
com.solertium.gogoego.server.extensions.feedreader.InterpretationException;
import com.solertium.gogoego.server.extensions.feedreader.Interpreter;
+import com.solertium.vfs.NotFoundException;
import com.solertium.vfs.VFS;
import com.solertium.vfs.VFSPath;
@@ -49,28 +50,37 @@
super(origin);
}
- public void interpretFeedInfo(VFSPath path, VFS vfs, FeedInfo feedInfo){
- try{
- Document doc = DocumentUtils.getReadOnlyDocument(path, vfs);
- setNamespaceAware(doc);
- feedInfo.parseNamespaces(parsers,
doc.getElementsByTagName("channel").item(0));
-
- final NodeList nodes =
doc.getElementsByTagName("channel").item(0).getChildNodes();
- for (int i = 0; i < nodes.getLength(); i++) {
- final Node current = nodes.item(i);
- if (current.getNodeName().equals("item"))
- feedInfo.addFeedData(interpretFeedItem(current));
- else if (current.getNodeName().equals("title"))
- feedInfo.setTitle(current.getTextContent());
- else if (current.getNodeName().equals("link"))
- feedInfo.setLink(current.getTextContent());
- else if (current.getNodeName().equals("description"))
- feedInfo.setDescription(current.getTextContent());
- else
- feedInfo.putOptionalField(current.getNodeName(),
current.getTextContent());
- }
- } catch (IOException iox) {
- iox.printStackTrace();
+ public void interpretFeedInfo(VFSPath path, VFS vfs, FeedInfo feedInfo)
throws InterpretationException{
+ final Document doc;
+ try {
+ doc = vfs.getDocument(path);
+ } catch (NotFoundException e) {
+ throw new InterpretationException("Could not find " + path, e);
+ } catch (IOException e) {
+ throw new InterpretationException("Could not load " + path, e);
+ }
+
+ setNamespaceAware(doc);
+
+ final Node channel = doc.getElementsByTagName("channel").item(0);
+ if (channel == null)
+ throw new InterpretationException("No 'channel' nodes found in " + path
+ "; does not follow reported schema for RSS");
+
+ feedInfo.parseNamespaces(parsers, channel);
+
+ final NodeList nodes = channel.getChildNodes();
+ for (int i = 0; i < nodes.getLength(); i++) {
+ final Node current = nodes.item(i);
+ if (current.getNodeName().equals("item"))
+ feedInfo.addFeedData(interpretFeedItem(current));
+ else if (current.getNodeName().equals("title"))
+ feedInfo.setTitle(current.getTextContent());
+ else if (current.getNodeName().equals("link"))
+ feedInfo.setLink(current.getTextContent());
+ else if (current.getNodeName().equals("description"))
+ feedInfo.setDescription(current.getTextContent());
+ else
+ feedInfo.putOptionalField(current.getNodeName(),
current.getTextContent());
}
}