[tor-commits] [metrics-web/master] Adds an ATOM feed for the News (Fixes: #23854)
karsten at torproject.org
karsten at torproject.org
Wed Mar 21 15:50:58 UTC 2018
commit 556fa300319e5cce3e224df1b79684c473e6be77
Author: Iain R. Learmonth <irl at fsfe.org>
Date: Tue Mar 20 18:37:17 2018 +0000
Adds an ATOM feed for the News (Fixes: #23854)
This extends NewsServlet to have an ATOM output format, as well as the
existing HTML output. A new JSP is used to serialize the output.
The feed has been tested to be compatible with both Firefox and
Thunderbird.
---
.../org/torproject/metrics/web/NewsServlet.java | 16 +++++
.../org/torproject/metrics/web/UpdateNews.java | 2 +-
src/main/resources/web.xml | 1 +
src/main/resources/web/jsps/news-atom.jsp | 76 ++++++++++++++++++++++
4 files changed, 94 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/torproject/metrics/web/NewsServlet.java b/src/main/java/org/torproject/metrics/web/NewsServlet.java
index 3bfb1b7..a5775dd 100644
--- a/src/main/java/org/torproject/metrics/web/NewsServlet.java
+++ b/src/main/java/org/torproject/metrics/web/NewsServlet.java
@@ -53,7 +53,15 @@ public class NewsServlet extends AnyServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
+ if (request.getRequestURI().endsWith("news.atom")) {
+ doGetAtom(request, response);
+ } else {
+ doGetHtml(request, response);
+ }
+ }
+ private void doGetHtml(HttpServletRequest request,
+ HttpServletResponse response) throws IOException, ServletException {
/* Create categories based on current system time. */
Map<String, String[]> cutOffDates = new LinkedHashMap<>();
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.US);
@@ -107,5 +115,13 @@ public class NewsServlet extends AnyServlet {
request.getRequestDispatcher("WEB-INF/news.jsp").forward(request,
response);
}
+
+ private void doGetAtom(HttpServletRequest request,
+ HttpServletResponse response) throws IOException, ServletException {
+ request.setAttribute("news", this.sortedNews);
+ request.setAttribute("updated", this.sortedNews.get(0).getStart());
+ request.getRequestDispatcher("WEB-INF/news-atom.jsp").forward(request,
+ response);
+ }
}
diff --git a/src/main/java/org/torproject/metrics/web/UpdateNews.java b/src/main/java/org/torproject/metrics/web/UpdateNews.java
index 3705d4a..b8c95d6 100644
--- a/src/main/java/org/torproject/metrics/web/UpdateNews.java
+++ b/src/main/java/org/torproject/metrics/web/UpdateNews.java
@@ -116,7 +116,7 @@ public class UpdateNews {
continue;
}
entry.addLink(link.substring(link.indexOf(" ") + 1),
- link.substring(0, link.indexOf(" ")));
+ link.substring(0, link.indexOf(" ")));
}
}
entry.unknown = unknown;
diff --git a/src/main/resources/web.xml b/src/main/resources/web.xml
index a5c3212..9c83591 100644
--- a/src/main/resources/web.xml
+++ b/src/main/resources/web.xml
@@ -238,6 +238,7 @@
</servlet>
<servlet-mapping>
<servlet-name>NewsServlet</servlet-name>
+ <url-pattern>/news.atom</url-pattern>
<url-pattern>/news.html</url-pattern>
</servlet-mapping>
diff --git a/src/main/resources/web/jsps/news-atom.jsp b/src/main/resources/web/jsps/news-atom.jsp
new file mode 100644
index 0000000..0c25b72
--- /dev/null
+++ b/src/main/resources/web/jsps/news-atom.jsp
@@ -0,0 +1,76 @@
+<%@ page contentType="text/xml" %><?xml version="1.0"?>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <title>Tor Project</title>
+ <subtitle>Metrics Timeline</subtitle>
+ <updated><c:out value="${updated}"/>T12:00:00Z</updated>
+ <link href="https://metrics.torproject.org/news.atom" rel="self" />
+ <link href="https://metrics.torproject.org/news.html" />
+ <id>https://metrics.torproject.org/news.atom</id>
+ <c:forEach var="entry" items="${news}">
+ <entry>
+ <title><c:out value="${entry.shortDescription}"/></title>
+ <updated><c:out value="${entry.start}"/>T12:00:00Z</updated>
+ <id>https://metrics.torproject.org/news.atom#<c:out value="${entry.start}"/><c:out value="${fn:substringBefore(entry.shortDescription, ' ')}"/>${fn:length(entry.shortDescription)}</id>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <dl>
+ <dt>Dates</dt>
+ <dd>
+ <c:choose>
+ <c:when test="${empty entry.start}">
+ N/A
+ </c:when>
+ <c:when test="${entry.ongoing}">
+ <c:out value="${entry.start}"/> to present
+ </c:when>
+ <c:when test="${empty entry.end}">
+ <c:out value="${entry.start}"/>
+ </c:when>
+ <c:otherwise>
+ <c:out value="${entry.start}"/> to
+ <c:out value="${entry.end}"/>
+ </c:otherwise>
+ </c:choose>
+ </dd>
+ <c:if test="${not empty entry.placeNames}">
+ <dt>Places</dt>
+ <dd>
+ <c:forEach var="placeName" items="${entry.placeNames}">
+ <c:out value="${placeName}"/>
+ </c:forEach>
+ </dd>
+ </c:if>
+ <c:if test="${not empty entry.protocols}">
+ <dt>Protocols</dt>
+ <dd>
+ <c:forEach var="protocol" items="${entry.protocols}">
+ <c:out value="${protocol}"/>
+ </c:forEach>
+ </dd>
+ </c:if>
+ <c:if test="${entry.unknown}">
+ <dt>Unknown</dt>
+ <dd>Yes</dd>
+ </c:if>
+ </dl>
+ <c:if test="${not empty entry.links}">
+ <ul>
+ <c:forEach var="link" items="${entry.links}">
+ <li>
+ <a href="<c:out value='${link.target}'/>">
+ <c:out value="${link.label}"/>
+ </a>
+ </li>
+ </c:forEach>
+ </ul>
+ </c:if>
+ </div>
+ </content>
+ <author>
+ <name>Tor Metrics</name>
+ </author>
+ </entry>
+ </c:forEach>
+</feed>
More information about the tor-commits
mailing list