commit 182d61448b7f6ba32b3cccc68d3a0ecda45fea94 Author: Karsten Loesing karsten.loesing@gmx.net Date: Tue Dec 13 14:03:22 2016 +0100
Add news from a news.json file. --- website/build.xml | 3 + website/etc/news.json | 398 +++++++++++++++++++++ .../torproject/metrics/web/ContentProvider.java | 37 +- .../org/torproject/metrics/web/MetricServlet.java | 4 +- website/src/org/torproject/metrics/web/News.java | 44 +++ .../org/torproject/metrics/web/NewsServlet.java | 98 ++++- .../metrics/web/graphs/GraphParameterChecker.java | 4 +- .../metrics/web/graphs/RObjectGenerator.java | 4 +- .../metrics/web/graphs/TableParameterChecker.java | 4 +- website/web/WEB-INF/news.jsp | 7 + 10 files changed, 583 insertions(+), 20 deletions(-)
diff --git a/website/build.xml b/website/build.xml index 6e156b4..c3aca68 100644 --- a/website/build.xml +++ b/website/build.xml @@ -54,6 +54,9 @@ <zipfileset dir="etc" prefix="WEB-INF/classes" includes="categories.json"/> + <zipfileset dir="etc" + prefix="WEB-INF/classes" + includes="news.json"/> <metainf dir="etc" includes="context.xml"/> </war> diff --git a/website/etc/news.json b/website/etc/news.json new file mode 100644 index 0000000..66db558 --- /dev/null +++ b/website/etc/news.json @@ -0,0 +1,398 @@ +[ + { + "start": "2012-05-15", + "end": "2012-12-15", + "place": "et", + "protocols": [ + "<OR>" + ], + "description": "Ethiopia blocks Tor TLS.", + "links": [ + "<a href="https://bugs.torproject.org/6045%5C%22%3Eticket</a>", + "<a href="https://blog.torproject.org/blog/ethiopia-introduces-deep-packet-inspection%... post 1</a>", + "<a href="https://blog.torproject.org/blog/update-censorship-ethiopia%5C%22%3Eblog post 2</a>" + ] + }, + { + "start": "2013-08-19", + "end": "2014-04-28", + "protocols": [ + "<OR>", + "relay" + ], + "description": "Relay users increase globally from about 800K to over 5M, when computers in the [https://en.wikipedia.org/wiki/Mevade_Botnet Mevade/Sefnit botnetbegan using Tor to communicate. The user count decreased in the following months through efforts to clean up the botnet. Sometime in 2014-04, the botnet switched from using Tor to using SSH.", + "links": [ + "<a href="https://blog.torproject.org/blog/how-to-handle-millions-new-tor-clients%5C%2... post</a>", + "<a href="https://research.torproject.org/techreports/botnet-tr-2013-11-20.pdf%5C%22%3... report</a>", + "<a href="https://blog.fox-it.com/2013/09/05/large-botnet-cause-of-recent-tor-network-...</a>", + "<a href="https://www.facebook.com/notes/protect-the-graph/sefnit-is-back/144808710209... to SSH</a>" + ] + }, + { + "start": "2013-10-27", + "protocols": [ + "<OR>", + "relay" + ], + "description": "Microsoft adds the Mevade/Sefnit botnet signature to various security scanners.", + "links": [ + "<a href="https://blogs.technet.microsoft.com/mmpc/2014/01/09/tackling-the-sefnit-botn... post</a>" + ] + }, + { + "start": "2013-11-03", + "protocols": [ + "<OR>", + "relay" + ], + "description": "Microsoft adds the Mevade/Sefnit botnet signature to their Malicious Software Removal Tool.", + "links": [ + "<a href="https://blogs.technet.microsoft.com/mmpc/2014/01/09/tackling-the-sefnit-botn... post</a>" + ] + }, + { + "start": "2015-11-18", + "end": "2015-12-10", + "place": "bd", + "protocols": [ + "<OR>", + "obfs3", + "obfs4" + ], + "description": "Bangladesh blocks Facebook, WhatsApp, and Viber.", + "links": [ + "<a href="http://phys.org/news/2015-12-bangladesh-facebook.html%5C%22%3Enews article</a>", + "<a href="https://archive.fo/fc2WQ%5C%22%3E(archive)</a>", + "<a href="https://metrics.torproject.org/userstats-relay-country.html?start=2015-08-01... graph</a>" + ] + }, + { + "start": "2016-04-28", + "protocols": [ + "fte" + ], + "description": "Tor Browser 6.0a5 and 6.0a5-hardened released, which lack the fte pluggable transport on Mac.", + "links": [ + "<a href="https://blog.torproject.org/blog/tor-browser-60a5-released%5C%22%3E6.0a5 blog post</a>", + "<a href="https://blog.torproject.org/blog/tor-browser-60a5-hardened-released%5C%22%3E... blog post</a>", + "<a href="https://bugs.torproject.org/18495%5C%22%3Eticket</a>" + ] + }, + { + "start": "2016-05-30", + "protocols": [ + "fte" + ], + "description": "Tor Browser 6.0 released, which lacks the fte pluggable transport on Mac.", + "links": [ + "<a href="https://blog.torproject.org/blog/tor-browser-60-released%5C%22%3E6.0 blog post</a>", + "<a href="https://bugs.torproject.org/18495%5C%22%3Eticket</a>" + ] + }, + { + "start": "2016-05-02", + "end": "2016-05-03", + "place": "br", + "protocols": [ + "<OR>" + ], + "description": "WhatsApp block in Brazil", + "links": [ + "<a href="https://blog.torproject.org/blog/tracking-impact-whatsapp-blockage-tor%5C%22... post</a>", + "<a href="https://ooni.torproject.org/post/brazil-whatsapp-block/%5C%22%3EOONI report</a>", + "<a href="http://bloqueios.info/en/casos/block-for-non-compliance-with-judicial-reques... report</a>" + ] + }, + { + "start": "2016-06-01", + "place": "kz", + "protocols": [ + "<OR>" + ], + "description": "Kazakhstan blocks vanilla Tor TLS. Users mostly switch to obfs4.", + "links": [ + "<a href="https://bugs.torproject.org/20348%5C%22%3Eticket</a>" + ] + }, + { + "start": "2016-08-20", + "place": "ir", + "protocols": [ + "<OR>" + ], + "description": "Iran somehow blocks most direct Tor connections. May also affect bridge users, but it's hard to tell because there were few vanilla bridge users anyway.", + "links": [ + "<a href="https://bugs.torproject.org/20216%5C%22%3Eticket</a>" + ] + }, + { + "start": "2016-08-24", + "protocols": [ + "bridge" + ], + "description": "tor 0.2.8.7 and 0.2.9.2-alpha are released, changing the bridge authority from Tonga to Bifroest.", + "links": [ + "<a href="https://blog.torproject.org/blog/tor-0287-released-important-fixes%5C%22%3E0... announcement</a>" + ] + }, + { + "start": "2016-08-31", + "protocols": [ + "bridge" + ], + "description": "CollecTor begins publishing bridge stats from the new bridge authority Bifroest.", + "links": [ + "<a href="https://lists.torproject.org/pipermail/tor-dev/2016-August/011336.html%5C%22...</a>" + ] + }, + { + "start": "2016-09-02", + "protocols": [ + "bridge" + ], + "description": "The former bridge authority Tonga shuts down. Bridges that have not updated to tor 0.2.8.7 or 0.2.9.2-alpha (which include all 5 default obfs3 bridges and 3/16 default obfs4 bridges) stop reporting statistics.", + "links": [ + "<a href="https://trac.torproject.org/projects/tor/ticket/19690#comment:17%5C%22%3Eshu... notice</a>", + "<a href="https://blog.torproject.org/blog/new-bridge-authority%5C%22%3Eblog post</a>", + "<a href="https://metrics.torproject.org/networksize.html?start=2016-07-01&end=201... of reporting bridges</a>" + ] + }, + { + "start": "2016-09-04", + "place": "ir", + "protocols": [ + "<OR>" + ], + "description": "Iran intensifies the blocking begun on 2016-08-20, getting most of the remaining direct users. There is interference in the graphs from the bridge authority changeover on 2016-09-02, but because the changeover would not have affected counts of ''direct'' users, it may be a coincidence.", + "links": [ + "<a href="https://bugs.torproject.org/20216%5C%22%3Eticket</a>" + ] + }, + { + "start": "2016-09-20", + "protocols": [ + "meek" + ], + "description": "macOS 10.12 (Sierra) is released, breaking some programs that are built with Go <1.7, including the meek-client that comes with Tor Browser. (See 2016-11-15 unbreaking event.)", + "links": [ + "<a href="https://bugs.torproject.org/20250%5C%22%3Eticket</a>" + ] + }, + { + "start": "2016-09-23", + "protocols": [ + "obfs3" + ], + "description": "Default obfs3 bridges ndnop0 and ndnop2 upgrade and begin reporting statistics to the new bridge authority Bifroest.", + "links": [ + "<a href="https://lists.torproject.org/pipermail/metrics-team/2016-September/000217.ht... on bridges not reporting statistics</a>" + ] + }, + { + "start": "2016-09-23", + "protocols": [ + "obfs4" + ], + "description": "Default obfs3 bridges ndnop3 and ndnop5 upgrade and begin reporting statistics to the new bridge authority Bifroest.", + "links": [ + "<a href="https://lists.torproject.org/pipermail/metrics-team/2016-September/000217.ht... on bridges not reporting statistics</a>" + ] + }, + { + "start": "2016-09-23", + "protocols": [ + "obfs3" + ], + "description": "Default obfs3 bridges "Unnamed" and "Unnamed" (fingerprint <a href="https://atlas.torproject.org/#details/AF9F66B7B04F8FF6F32D455F05135250A16543...</a>) upgrade and begin reporting statistics to the new bridge authority Bifroest.", + "links": [] + }, + { + "start": "2016-09-24", + "protocols": [ + "obfs3" + ], + "description": "Default obfs3 bridge LeifEricson upgrades and begins reporting statistics to the new bridge authority Bifroest. This is the last obfs3 bridge that hadn't upgraded.", + "links": [] + }, + { + "start": "2016-09-24", + "protocols": [ + "obfs4" + ], + "description": "Default obfs4 bridge LeifEricson upgrades and begins reporting statistics to the new bridge authority Bifroest. This is the last obfs4 bridge that hadn't upgraded.", + "links": [] + }, + { + "start": "2016-10-02", + "end": "2016-10-03", + "place": "eg", + "protocols": [ + "<OR>", + "relay" + ], + "description": "Reports that direct connections from Egypt are blocked; bridges are required. Maybe be the same as the block beginning 2016-10-25.", + "links": [ + "<a href="https://ooni.torproject.org/post/egypt-network-interference/#attempts-to-blo... report</a>" + ] + }, + { + "start": "2016-10-08", + "end": "2016-10-09", + "place": "tr", + "description": "Turkey blocks storage services including Dropbox, Google Drive, OneDrive, and GitHub. Most (all?) of the blocks were rescinded the next day.", + "links": [ + "<a href="https://turkeyblocks.org/2016/10/08/google-drive-dropbox-blocked-in-turkey/%... article</a>", + "<a href="https://twitter.com/TurkeyBlocks/status/785054084856512512%5C%22%3Eunblockin... tweet</a>", + "<a href="https://www.turkishminute.com/2016/10/09/turkey-lifts-block-dropbox-google-d... article</a>" + ] + }, + { + "start": "2016-10-19", + "end": "2016-11-10", + "protocols": [ + "meek" + ], + "description": "Large decrease in meek users, perhaps caused by problems in Orbot 15.0.2 BETA 1 that were fixed in Orbot 15.2.0 RC8.", + "links": [ + "<a href="https://bugs.torproject.org/20495%5C%22%3Eticket</a>", + "<a href="https://lists.torproject.org/pipermail/tor-project/2016-October/000764.html%... email</a>", + "<a href="https://lists.torproject.org/pipermail/tor-project/2016-November/000778.html... email</a>", + "<a href="https://groups.google.com/d/msg/traffic-obf/CSJLt3t-_OI/FnAqWqquAwAJ%5C%22%3... mail</a>" + ] + }, + { + "start": "2016-10-25", + "place": "eg", + "protocols": [ + "<OR>", + "relay" + ], + "description": "Egypt blocks Tor directory authorities and public relays by TCP RST. Bridges work.", + "links": [ + "<a href="https://ooni.torproject.org/post/egypt-network-interference/#attempts-to-blo... report</a>" + ] + }, + { + "start": "2016-11-03", + "place": "tr", + "description": "Turkey blocks Facebook, Twitter, YouTube, WhatsApp", + "links": [ + "<a href="https://turkeyblocks.org/2016/11/04/social-media-shutdown-turkey/%5C%22%3Ear...</a>" + ] + }, + { + "start": "2016-11-04", + "place": "tr", + "description": "Turkey orders a block on VPN services and Tor", + "links": [ + "<a href="http://turk-internet.com/portal/yazigoster.php?yaziid=54465%5C%22%3ETurkish article</a>", + "<a href="https://motherboard.vice.com/read/turkey-doubles-down-on-censorship-with-blo... article</a>" + ] + }, + { + "start": "2016-11-15", + "protocols": [ + "meek" + ], + "description": "Tor Browser 6.0.6 is released, unbreaking meek on macOS 10.12 (Sierra). (See 2016-09-20 breaking event.)", + "links": [ + "<a href="https://blog.torproject.org/blog/tor-browser-606-released%5C%22%3Eblog post</a>", + "<a href="https://bugs.torproject.org/20250#comment:29%5C%22%3Eticket</a>" + ] + }, + { + "start": "2016-11-15", + "protocols": [ + "obfs4" + ], + "description": "Default obfs4 bridges ndnop3 and ndnop5 turn on timing obfuscation (`iat-mode`).", + "links": [ + "<a href="https://lists.torproject.org/pipermail/tor-project/2016-November/000780.html... list post</a>", + "<a href="https://bugs.torproject.org/20837%5C%22%3Eticket</a>" + ] + }, + { + "start": "2016-11-18", + "protocols": [ + "obfs4" + ], + "description": "Default obfs4 bridge <a href="https://atlas.torproject.org/#details/D9C805C955CB124D188C0D44F271E9BE57DE21...</a> turns on timing obfuscation (`iat-mode=1`).", + "links": [ + "<a href="https://bugs.torproject.org/20837%5C%22%3Eticket</a>" + ] + }, + { + "start": "2016-09-23", + "end": "2016-11-28", + "protocols": [ + "obfs3" + ], + "description": "Outage of default obfs3 bridges "Unnamed" and "Unnamed" (fingerprint <a href="https://atlas.torproject.org/#details/AF9F66B7B04F8FF6F32D455F05135250A16543...</a>). (Start date not known for sure, though it must have been after 2016-09-23; discussed in non-archived tor-team email.)", + "links": [] + }, + { + "start": "2016-12-01", + "place": "by", + "protocols": [ + "<OR>", + "relay" + ], + "description": "Belarus blocks the addresses of public Tor relays, apparently by RST injection. Bridges work, even unobfuscated ones.", + "links": [ + "<a href="https://bugs.torproject.org/20907%5C%22%3Eticket</a>", + "<a href="https://geektimes.ru/post/283392/%5C%22%3Earticle (Russian)</a>", + "<a href="https://ooni.torproject.org/post/belarus-fries-onion/%5C%22%3EOONI blog post</a>" + ] + }, + { + "start": "2016-02-24", + "place": "tm", + "protocols": [ + "<OR>" + ], + "description": "Large drop in direct users in Turkmenistan", + "links": [ + "<a href="https://metrics.torproject.org/userstats-relay-country.html?start=2015-11-01...</a>" + ], + "unknown": true + }, + { + "start": "2016-08-24", + "place": "cn", + "protocols": [ + "<OR>" + ], + "description": "Large decrease in users in China", + "links": [ + "<a href="https://metrics.torproject.org/userstats-relay-country.html?start=2016-07-30...</a>", + "<a href="https://metrics.torproject.org/userstats-bridge-country.html?start=2016-07-3...</a>" + ], + "unknown": true + }, + { + "start": "2016-10-09", + "end": "2016-10-25", + "place": "il", + "protocols": [ + "<OR>" + ], + "description": "Direct users fluctuate wildly in Israel. Bridge users not affected.", + "links": [ + "<a href="https://metrics.torproject.org/userstats-relay-country.html?start=2016-07-28...</a>" + ], + "unknown": true + }, + { + "start": "2016-11-20", + "place": "sa", + "protocols": [ + "<OR>", + "relay" + ], + "description": "Decrease in direct users in Saudi Arabia.", + "links": [ + "<a href="https://bugs.torproject.org/20785%5C%22%3Eticket</a>" + ], + "unknown": true + } +] diff --git a/website/src/org/torproject/metrics/web/ContentProvider.java b/website/src/org/torproject/metrics/web/ContentProvider.java index 606e7db..2dd9105 100644 --- a/website/src/org/torproject/metrics/web/ContentProvider.java +++ b/website/src/org/torproject/metrics/web/ContentProvider.java @@ -6,33 +6,48 @@ package org.torproject.metrics.web; import com.google.gson.Gson; import com.google.gson.GsonBuilder;
-import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List;
-public class MetricsProvider { +public class ContentProvider {
- private static MetricsProvider instance = new MetricsProvider(); + private static ContentProvider instance = new ContentProvider();
- public static MetricsProvider getInstance() { - return MetricsProvider.instance; + public static ContentProvider getInstance() { + return ContentProvider.instance; }
private List<Metric> metricsList;
- private MetricsProvider() { - InputStream in = this.getClass().getClassLoader() - .getResourceAsStream("metrics.json"); + private List<Category> categoriesList; + + private List<News> newsList; + + private ContentProvider() { Gson gson = new GsonBuilder().create(); - Metric[] metricsArray = gson.fromJson(new InputStreamReader(in), - Metric[].class); - this.metricsList = Arrays.asList(metricsArray); + this.metricsList = Arrays.asList(gson.fromJson(new InputStreamReader( + this.getClass().getClassLoader().getResourceAsStream("metrics.json")), + Metric[].class)); + this.categoriesList = Arrays.asList(gson.fromJson(new InputStreamReader( + this.getClass().getClassLoader().getResourceAsStream( + "categories.json")), Category[].class)); + this.newsList = Arrays.asList(gson.fromJson(new InputStreamReader( + this.getClass().getClassLoader().getResourceAsStream( + "news.json")), News[].class)); }
public List<Metric> getMetricsList() { return new ArrayList<Metric>(this.metricsList); } + + public List<Category> getCategoriesList() { + return new ArrayList<Category>(this.categoriesList); + } + + public List<News> getNewsList() { + return new ArrayList<News>(this.newsList); + } }
diff --git a/website/src/org/torproject/metrics/web/MetricServlet.java b/website/src/org/torproject/metrics/web/MetricServlet.java index 8de6922..a280ee4 100644 --- a/website/src/org/torproject/metrics/web/MetricServlet.java +++ b/website/src/org/torproject/metrics/web/MetricServlet.java @@ -51,7 +51,7 @@ public abstract class MetricServlet extends HttpServlet {
@Override public void init() throws ServletException { - this.metrics = MetricsProvider.getInstance().getMetricsList(); + this.metrics = ContentProvider.getInstance().getMetricsList(); Map<String, String> allTypesAndTitles = new HashMap<String, String>(); Map<String, String[]> dataIds = new HashMap<String, String[]>(); Map<String, String[]> relatedIds = new HashMap<String, String[]>(); @@ -116,7 +116,7 @@ public abstract class MetricServlet extends HttpServlet { } } for (Category category : - CategoriesProvider.getInstance().getCategoriesList()) { + ContentProvider.getInstance().getCategoriesList()) { for (String id : category.getMetrics()) { categories.put(id, category); } diff --git a/website/src/org/torproject/metrics/web/News.java b/website/src/org/torproject/metrics/web/News.java new file mode 100644 index 0000000..d16c3a1 --- /dev/null +++ b/website/src/org/torproject/metrics/web/News.java @@ -0,0 +1,44 @@ +/* Copyright 2016 The Tor Project + * See LICENSE for licensing information */ + +package org.torproject.metrics.web; + +public class News { + + private String start; + + private String end; + + private String place; + + private String[] protocols; + + private String description; + + private String[] links; + + String getStart() { + return start; + } + + String getEnd() { + return end; + } + + String getPlace() { + return place; + } + + String[] getProtocols() { + return protocols; + } + + String getDescription() { + return description; + } + + String[] getLinks() { + return links; + } +} + diff --git a/website/src/org/torproject/metrics/web/NewsServlet.java b/website/src/org/torproject/metrics/web/NewsServlet.java index 5186dc6..f924b67 100644 --- a/website/src/org/torproject/metrics/web/NewsServlet.java +++ b/website/src/org/torproject/metrics/web/NewsServlet.java @@ -4,6 +4,18 @@ package org.torproject.metrics.web;
import java.io.IOException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TimeZone; +import java.util.TreeMap; +import java.util.TreeSet;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -14,11 +26,95 @@ public class NewsServlet extends HttpServlet {
private static final long serialVersionUID = -7696996243187241242L;
+ protected SortedSet<News> sortedNews; + + @Override + public void init() throws ServletException { + SortedSet<News> sortedNews = new TreeSet<News>(new Comparator<News>() { + public int compare(News o1, News o2) { + return o1.getStart().compareTo(o2.getStart()) * -1; + } + }); + for (News news : ContentProvider.getInstance().getNewsList()) { + if (news.getStart() != null) { + sortedNews.add(news); + } + } + this.sortedNews = sortedNews; + } + @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
- /* Forward the request to the JSP that does all the hard work. */ + /* Create categories based on current system time. */ + Map<String, String> cutOffDates = new LinkedHashMap<String, String>(); + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.US); + cal.set(Calendar.DAY_OF_WEEK, 1); + cutOffDates.put(String.format("%tF", cal), "This week"); + cal.set(Calendar.DAY_OF_MONTH, 1); + cutOffDates.put(String.format("%tF", cal), "This month"); + cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) /3 * 3); + cutOffDates.put(String.format("%tF", cal), "This quarter"); + cal.set(Calendar.MONTH, 0); + String yearStart = String.format("%tF", cal); + cutOffDates.put(yearStart, "This year"); + do { + cal.add(Calendar.YEAR, -1); + yearStart = String.format("%tF", cal); + cutOffDates.put(yearStart, String.format("%tY", cal)); + } while (yearStart.compareTo(this.sortedNews.first().getStart()) > 0); + + /* Sort news into categories. */ + Map<String, List<String[]>> newsByCategory = + new LinkedHashMap<String, List<String[]>>(); + for (String category : cutOffDates.values()) { + newsByCategory.put(category, new ArrayList<String[]>()); + } + for (News news : this.sortedNews) { + StringBuilder sb = new StringBuilder(); + sb.append("<p>" + news.getStart()); + if (news.getEnd() != null) { + sb.append("–" + news.getEnd()); + } + sb.append(": "); + if (news.getPlace() != null) { + sb.append(news.getPlace() + ", "); + } + if (news.getProtocols() != null) { + int written = 0; + for (String protocol : news.getProtocols()) { + sb.append((written++ > 0 ? ", " : "") + protocol); + } + } + sb.append(", " + news.getDescription()); + if (news.getLinks() != null && news.getLinks().length > 0) { + int written = 0; + sb.append(" ("); + for (String link : news.getLinks()) { + sb.append((written++ > 0 ? " " : "") + link); + } + sb.append(")"); + } + sb.append("</p>"); + String[] formattedNews = new String[] { sb.toString() }; + for (Map.Entry<String, String> category : cutOffDates.entrySet()) { + if (news.getStart().compareTo(category.getKey()) >= 0) { + newsByCategory.get(category.getValue()).add(formattedNews); + break; + } + } + } + + /* Remove categories without news. */ + for (String category : cutOffDates.values()) { + if (newsByCategory.get(category).isEmpty()) { + newsByCategory.remove(category); + } + } + + /* Pass news by category to the JSP and let it do the rest of the work. */ + request.setAttribute("news", newsByCategory); request.getRequestDispatcher("WEB-INF/news.jsp").forward(request, response); } diff --git a/website/src/org/torproject/metrics/web/graphs/GraphParameterChecker.java b/website/src/org/torproject/metrics/web/graphs/GraphParameterChecker.java index b40885c..9f2a774 100644 --- a/website/src/org/torproject/metrics/web/graphs/GraphParameterChecker.java +++ b/website/src/org/torproject/metrics/web/graphs/GraphParameterChecker.java @@ -3,8 +3,8 @@
package org.torproject.metrics.web.graphs;
+import org.torproject.metrics.web.ContentProvider; import org.torproject.metrics.web.Metric; -import org.torproject.metrics.web.MetricsProvider;
import java.text.ParseException; import java.text.SimpleDateFormat; @@ -50,7 +50,7 @@ public class GraphParameterChecker { this.dateFormat = new SimpleDateFormat("yyyy-MM-dd"); this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); this.availableGraphs = new HashMap<String, String[]>(); - for (Metric metric : MetricsProvider.getInstance().getMetricsList()) { + for (Metric metric : ContentProvider.getInstance().getMetricsList()) { if ("Graph".equals(metric.getType())) { this.availableGraphs.put(metric.getId(), metric.getParameters()); } diff --git a/website/src/org/torproject/metrics/web/graphs/RObjectGenerator.java b/website/src/org/torproject/metrics/web/graphs/RObjectGenerator.java index 526e3d3..87f3e33 100644 --- a/website/src/org/torproject/metrics/web/graphs/RObjectGenerator.java +++ b/website/src/org/torproject/metrics/web/graphs/RObjectGenerator.java @@ -3,8 +3,8 @@
package org.torproject.metrics.web.graphs;
+import org.torproject.metrics.web.ContentProvider; import org.torproject.metrics.web.Metric; -import org.torproject.metrics.web.MetricsProvider;
import org.rosuda.REngine.Rserve.RConnection; import org.rosuda.REngine.Rserve.RserveException; @@ -59,7 +59,7 @@ public class RObjectGenerator implements ServletContextListener {
this.availableGraphs = new LinkedHashMap<String, Metric>(); this.availableTables = new LinkedHashMap<String, Metric>(); - for (Metric metric : MetricsProvider.getInstance().getMetricsList()) { + for (Metric metric : ContentProvider.getInstance().getMetricsList()) { String type = metric.getType(); String id = metric.getId(); if ("Graph".equals(type)) { diff --git a/website/src/org/torproject/metrics/web/graphs/TableParameterChecker.java b/website/src/org/torproject/metrics/web/graphs/TableParameterChecker.java index b441ab6..c068b7d 100644 --- a/website/src/org/torproject/metrics/web/graphs/TableParameterChecker.java +++ b/website/src/org/torproject/metrics/web/graphs/TableParameterChecker.java @@ -3,8 +3,8 @@
package org.torproject.metrics.web.graphs;
+import org.torproject.metrics.web.ContentProvider; import org.torproject.metrics.web.Metric; -import org.torproject.metrics.web.MetricsProvider;
import java.text.ParseException; import java.text.SimpleDateFormat; @@ -47,7 +47,7 @@ public class TableParameterChecker { this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
this.availableTables = new HashMap<String, String[]>(); - for (Metric metric : MetricsProvider.getInstance().getMetricsList()) { + for (Metric metric : ContentProvider.getInstance().getMetricsList()) { if ("Table".equals(metric.getType())) { this.availableTables.put(metric.getId(), metric.getParameters()); } diff --git a/website/web/WEB-INF/news.jsp b/website/web/WEB-INF/news.jsp index c47c1b8..61c81b0 100644 --- a/website/web/WEB-INF/news.jsp +++ b/website/web/WEB-INF/news.jsp @@ -33,6 +33,13 @@ of data, rather than just dogma or perspective." <h3>News</h3> <br>
+<c:forEach var="category" items="${news}"> +<h3>${category.key}</h3> +<c:forEach var="entry" items="${category.value}"> +<p>${entry[0]}</p> +</c:forEach> +</c:forEach> + </div> </div> <div class="bottom" id="bottom">
tor-commits@lists.torproject.org