package info.persistent.pushbot.commands;
import com.google.appengine.api.xmpp.JID;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import info.persistent.pushbot.util.Urls;
import info.persistent.pushbot.util.Xmpp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
public abstract class FeedCommandHandler implements CommandHandler {
private static final Logger logger =
Logger.getLogger(FeedCommandHandler.class.getName());
@Override
public void handle(JID user, String... args) {
if (args.length != 1) {
Xmpp.sendMessage(user, "feed URL not specified");
return;
}
URL feedUrl;
try {
feedUrl = new URL(args[0]);
} catch (MalformedURLException err) {
logger.log(Level.INFO, "URL parse exception", err);
Xmpp.sendMessage(user, "Feed URL is malformed");
return;
}
feedUrl = normalizeFeedUrl(feedUrl);
if (feedUrl == null) {
Xmpp.sendMessage(user, "This does not appear to be a feed URL");
return;
}
handle(user, feedUrl);
}
private static URL normalizeFeedUrl(URL feedUrl) {
URL queryUrl;
try {
queryUrl =
new URL(
"http://ajax.googleapis.com/ajax/services/feed/lookup?v=1.0&q="
+ Urls.encode(feedUrl.toString()));
} catch (MalformedURLException err) {
// We know exactly what's in this URL, it should well-formed
throw new RuntimeException(err);
}
BufferedReader queryReader;
try {
queryReader =
new BufferedReader(new InputStreamReader(queryUrl.openStream()));
} catch (IOException err) {
logger.log(Level.INFO, "Could not query AJAX Feed API", err);
return null;
}
JSONObject queryJson = (JSONObject) JSONValue.parse(queryReader);
Number responseStatus = (Number) queryJson.get("responseStatus");
if (responseStatus == null || responseStatus.intValue() >= 300) {
return null;
}
JSONObject responseData = (JSONObject) queryJson.get("responseData");
if (responseData == null) {
return null;
}
String responseUrl = (String) responseData.get("url");
try {
return new URL(responseUrl);
} catch (MalformedURLException err) {
logger.log(Level.INFO, "Malformed feed URL in response from API", err);
return null;
}
}
protected abstract void handle(JID user, URL feedUrl);
}