package org.akaza.openclinica.control;
import org.akaza.openclinica.web.SQLInitServlet;
import org.apache.commons.lang.StringEscapeUtils;
import org.jmesa.view.html.HtmlBuilder;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.fetcher.FeedFetcher;
import com.sun.syndication.fetcher.FetcherException;
import com.sun.syndication.fetcher.impl.FeedFetcherCache;
import com.sun.syndication.fetcher.impl.HashMapFeedInfoCache;
import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher;
import com.sun.syndication.io.FeedException;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RssReaderServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance();
FeedFetcher feedFetcher = new HttpURLFeedFetcher(feedInfoCache);
String rssUrl = SQLInitServlet.getField("rss.url");
String rssMore = SQLInitServlet.getField("rss.more");
String text1 = SQLInitServlet.getField("about.text1");
String text2 = SQLInitServlet.getField("about.text2");
ResourceBundle resword,resformat;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resword = ResourceBundle.getBundle("org.akaza.openclinica.i18n.words",req.getLocale());
resformat = ResourceBundle.getBundle("org.akaza.openclinica.i18n.format",req.getLocale());
PrintWriter pw = new PrintWriter(resp.getOutputStream());
if (rssUrl == null || rssUrl.length() == 0) {
about(pw);
} else {
getFeed(pw);
}
}
void getFeed(PrintWriter pw) {
SyndFeed feed = null;
String htmlFeed = null;
try {
feed = feedFetcher.retrieveFeed(new URL(rssUrl));
htmlFeed = feedHtml(feed);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
htmlFeed = errorFeedHtml(e.getMessage());
e.printStackTrace();
} catch (FeedException e) {
// TODO Auto-generated catch block
htmlFeed = errorFeedHtml(e.getMessage());
e.printStackTrace();
} catch (FetcherException e) {
htmlFeed = errorFeedHtml(e.getMessage());
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
htmlFeed = errorFeedHtml(e.getMessage());
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
pw.println(htmlFeed);
pw.close();
}
}
void about(PrintWriter pw) {
HtmlBuilder htmlBuilder = new HtmlBuilder();
htmlBuilder.h1().close().append(resword.getString("about")).h1End().ul().close();
htmlBuilder.li().close().append(text1).liEnd();
htmlBuilder.li().close().append(text2).liEnd();
htmlBuilder.ulEnd().toString();
pw.println(htmlBuilder.toString());
pw.close();
}
String feedHtml(SyndFeed feed) {
HtmlBuilder htmlBuilder = new HtmlBuilder();
htmlBuilder.h1().close().append(resword.getString("news")).h1End().ul().close();
List<SyndEntryImpl> theFeeds = feed.getEntries();
for (int i = 0; i < (theFeeds.size() >= 4 ? 4 : theFeeds.size()); i++) {
SyndEntryImpl syndFeed = theFeeds.get(i);
String description = null;
if (syndFeed.getDescription().getValue().length() > 50) {
Integer k = 50;
while (syndFeed.getDescription().getValue().charAt(k) != ' ') {
k--;
}
description = syndFeed.getDescription().getValue().substring(0, k) + " ...";
} else {
description = syndFeed.getDescription().getValue();
}
SimpleDateFormat sdf = new SimpleDateFormat(resformat.getString("mid_date_format"));
String theDate = sdf.format(syndFeed.getPublishedDate());
htmlBuilder.li().close().a().href(syndFeed.getLink()).append(" target=\"_blank\"").close().append(
theDate + " - " + StringEscapeUtils.escapeHtml(syndFeed.getTitle()) + " - " + description).aEnd().liEnd();
}
if (rssMore != null && rssMore.length() > 0) {
return htmlBuilder.ulEnd().a().href(rssMore).append(" target=\"_blank\"").close().div().align("right").close().append(resword.getString("more")+"...").divEnd().aEnd()
.toString();
} else {
return htmlBuilder.ulEnd().toString();
}
}
String errorFeedHtml(String error) {
HtmlBuilder htmlBuilder = new HtmlBuilder();
htmlBuilder.h1().close().append(resword.getString("news")).h1End().ul().close();
htmlBuilder.li().close().append(resword.getString("couldnot_retrieve_news")).liEnd();
return htmlBuilder.ulEnd().toString();
}
}