commit bdfca8e75e23c3dd29e1fb6eca7ae835d26acde4 Author: Karsten Loesing karsten.loesing@gmx.net Date: Mon Dec 12 12:16:33 2016 +0100
Rip out metrics table. --- .../org/torproject/metrics/web/IndexServlet.java | 246 +-------------------- website/web/WEB-INF/about.jsp | 6 +- website/web/WEB-INF/index.jsp | 86 ++----- 3 files changed, 25 insertions(+), 313 deletions(-)
diff --git a/website/src/org/torproject/metrics/web/IndexServlet.java b/website/src/org/torproject/metrics/web/IndexServlet.java index 576bac2..f365cbb 100644 --- a/website/src/org/torproject/metrics/web/IndexServlet.java +++ b/website/src/org/torproject/metrics/web/IndexServlet.java @@ -4,261 +4,23 @@ package org.torproject.metrics.web;
import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.BitSet; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
-@SuppressWarnings("serial") public class IndexServlet extends HttpServlet {
- private static final String[][] knownTags = new String[][] { - { "cl", "Clients" }, - { "rl", "Relays" }, - { "br", "Bridges" }, - { "pt", "Pluggable transports" }, - { "hs", "Hidden services" }, - { "bw", "Bandwidth" }, - { "pf", "Performance" }, - { "dv", "Diversity" } - }; - private static final String[] defaultTags = - new String[] { "cl", "rl", "br", "pt", "hs", "bw", "pf", "dv" }; - - private static final String[][] knownTypes = new String[][] { - { "gr", "Graph" }, - { "tb", "Table" }, - { "ln", "Link" }, - { "dt", "Data" } - }; - private static final String[] defaultTypes = - new String[] { "gr", "tb", "ln", "dt" }; - - private static final String[][] knownLevels = new String[][] { - { "bs", "Basic" }, - { "ad", "Advanced" } - }; - private static final String[] defaultLevels = new String[] { "bs" }; - - private static final String[][] knownOrders = new String[][] { - { "name", "Name" }, - { "tags", "Tags" }, - { "type", "Type" }, - { "level", "Level" }, - { "shuffle", "None (shuffle)" } - }; - private static final String[] defaultOrders = new String[] { "type" }; - - private List<Metric> availableMetrics; - - @Override - public void init() throws ServletException { - this.availableMetrics = new ArrayList<Metric>(); - for (org.torproject.metrics.web.Metric metric - : MetricsProvider.getInstance().getMetricsList()) { - this.availableMetrics.add(new Metric(metric.getId() + ".html", - metric.getTitle(), metric.getTags(), metric.getType(), - metric.getLevel())); - } - } + private static final long serialVersionUID = -5156539049907533057L;
@Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - @SuppressWarnings("rawtypes") - Map parameterMap = request.getParameterMap(); - BitSet requestedTags = this.parseParameter( - (String[]) parameterMap.get("tag"), knownTags, defaultTags); - BitSet requestedTypes = this.parseParameter( - (String[]) parameterMap.get("type"), knownTypes, defaultTypes); - BitSet requestedLevels = this.parseParameter( - (String[]) parameterMap.get("level"), knownLevels, defaultLevels); - BitSet requestedOrder = this.parseParameter( - (String[]) parameterMap.get("order"), knownOrders, defaultOrders); - request.setAttribute("tags", this.formatParameter(knownTags, - requestedTags)); - request.setAttribute("types", this.formatParameter(knownTypes, - requestedTypes)); - request.setAttribute("levels", this.formatParameter(knownLevels, - requestedLevels)); - request.setAttribute("order", this.formatParameter(knownOrders, - requestedOrder)); - List<Metric> filteredAndOrderedMetrics = this.filterMetrics( - requestedTags, requestedTypes, requestedLevels); - this.orderMetrics(filteredAndOrderedMetrics, requestedOrder); - request.setAttribute("results", this.formatMetrics( - filteredAndOrderedMetrics)); + + /* Forward the request to the JSP that does all the hard work. */ request.getRequestDispatcher("WEB-INF/index.jsp").forward(request, response); } - - private BitSet parseParameter(String[] unparsedValues, - String[][] knownValues, String[] defaultValues) { - BitSet result = new BitSet(); - if (unparsedValues == null || unparsedValues.length == 0 - || unparsedValues.length > knownValues.length) { - unparsedValues = defaultValues; - } - Set<String> requestedValues = - new HashSet<String>(Arrays.asList(unparsedValues)); - for (int i = 0; i < knownValues.length; i++) { - if (requestedValues.contains(knownValues[i][0])) { - result.set(i); - } - } - return result; - } - - private String[][] formatParameter(String[][] strings, BitSet bitSet) { - String[][] formattedParameter = new String[strings.length][]; - for (int i = 0; i < formattedParameter.length; i++) { - String[] formatted = new String[] { strings[i][0], strings[i][1], - "" }; - if (bitSet.get(i)) { - formatted[2] = " checked"; - } - formattedParameter[i] = formatted; - } - return formattedParameter; - } - - private static class Metric { - - private String url; - - private String name; - - private BitSet tags; - - private BitSet type; - - private BitSet level; - - private Metric(String url, String name, String[] tagStrings, - String typeString, String levelString) { - this.url = url; - this.name = name; - this.tags = this.convertStringsToBitSet(knownTags, tagStrings); - this.type = this.convertStringToBitSet(knownTypes, typeString); - this.level = this.convertStringToBitSet(knownLevels, levelString); - } - - private BitSet convertStringsToBitSet(String[][] knownKeysAndValues, - String[] givenKeyStrings) { - BitSet result = new BitSet(knownKeysAndValues.length); - Set<String> keys = new HashSet<String>(Arrays.asList( - givenKeyStrings)); - for (int i = 0; i < knownKeysAndValues.length; i++) { - if (keys.contains(knownKeysAndValues[i][1])) { - result.set(i); - } - } - if (result.cardinality() != givenKeyStrings.length) { - throw new RuntimeException("Unknown key(s): " + keys); - } - return result; - } - - private BitSet convertStringToBitSet(String[][] knownKeysAndValues, - String givenKeyString) { - return this.convertStringsToBitSet(knownKeysAndValues, - new String[] { givenKeyString }); - } - - private String[] toStrings() { - return new String[] { this.url, this.name, - this.convertBitSetToString(knownTags, this.tags), - this.convertBitSetToString(knownTypes, this.type), - this.convertBitSetToString(knownLevels, this.level) }; - } - - private String convertBitSetToString(String[][] knownKeysAndValues, - BitSet bitSet) { - StringBuilder sb = new StringBuilder(); - int index = -1; - while ((index = bitSet.nextSetBit(index + 1)) >= 0) { - sb.append(", " + knownKeysAndValues[index][1]); - } - return sb.substring(Math.min(sb.length(), 2)); - } - } - - private List<Metric> filterMetrics(BitSet requestedTags, - BitSet requestedTypes, BitSet requestedLevels) { - List<Metric> filteredMetrics = new ArrayList<Metric>(); - for (Metric metric : availableMetrics) { - if (requestedTags.intersects(metric.tags) - && requestedTypes.intersects(metric.type) - && requestedLevels.intersects(metric.level)) { - filteredMetrics.add(metric); - } - } - return filteredMetrics; - } - - private void orderMetrics(List<Metric> resultMetrics, - BitSet requestedOrder) { - switch (requestedOrder.nextSetBit(0)) { - case 0: - Collections.sort(resultMetrics, new Comparator<Metric>() { - public int compare(Metric first, Metric second) { - return first.name.compareTo(second.name); - } - }); - break; - case 1: - Collections.sort(resultMetrics, new Comparator<Metric>() { - public int compare(Metric first, Metric second) { - return compareTwoBitSets(first.tags, second.tags); - } - }); - break; - case 2: - Collections.sort(resultMetrics, new Comparator<Metric>() { - public int compare(Metric first, Metric second) { - return compareTwoBitSets(first.type, second.type); - } - }); - break; - case 3: - Collections.sort(resultMetrics, new Comparator<Metric>() { - public int compare(Metric first, Metric second) { - return compareTwoBitSets(first.level, second.level); - } - }); - break; - default: - Collections.shuffle(resultMetrics); - break; - } - } - - private int compareTwoBitSets(BitSet first, BitSet second) { - if (first.equals(second)) { - return 0; - } - BitSet xor = (BitSet) first.clone(); - xor.xor(second); - return xor.length() == second.length() ? -1 : 1; - } - - private String[][] formatMetrics( - List<Metric> filteredAndOrderedMetrics) { - String[][] formattedMetrics = - new String[filteredAndOrderedMetrics.size()][]; - for (int i = 0; i < formattedMetrics.length; i++) { - formattedMetrics[i] = filteredAndOrderedMetrics.get(i).toStrings(); - } - return formattedMetrics; - } } + diff --git a/website/web/WEB-INF/about.jsp b/website/web/WEB-INF/about.jsp index 91a696b..a067674 100644 --- a/website/web/WEB-INF/about.jsp +++ b/website/web/WEB-INF/about.jsp @@ -9,11 +9,7 @@ <body> <div class="center"> <div class="main-column"> - <h2><a href="/"><img src="images/metrics-logo.png" width="153" -height="200" al -t="Metrics logo"><img src="images/metrics-wordmark.png" width="384" height="50" -alt="M -etrics wordmark"></a></h2> + <h2><a href="/"><img src="images/metrics-logo.png" width="153" height="200" alt="Metrics logo"><img src="images/metrics-wordmark.png" width="384" height="50" alt="Metrics wordmark"></a></h2> <br>
<p>"Tor metrics are the ammunition that lets Tor and other security diff --git a/website/web/WEB-INF/index.jsp b/website/web/WEB-INF/index.jsp index 6e06474..ad4b79f 100644 --- a/website/web/WEB-INF/index.jsp +++ b/website/web/WEB-INF/index.jsp @@ -30,77 +30,31 @@ of data, rather than just dogma or perspective." <br> <!-- Navigation end -->
- <p>Welcome to Tor Metrics, the primary place to learn interesting - facts about the Tor network, the largest deployed anonymity - network to date. - If something can be measured safely, you'll find it here.*</p> - <p><small>*And if you come across something that is missing here, - please - <a href="https://www.torproject.org/about/contact.html.en">let us - know</a>.</small></p> + <p>Welcome! What would you like to know about the Tor network?</p>
<div> -<div style="border:1px solid gray;border-radius:10px;padding:10px;float:left;overflow:hidden;margin-right:20px;"> -<form action="/"> -<p> -<b>Tags</b><br> -<c:forEach var="row" items="${tags}"> -<label><input name="tag" type="checkbox" value="${row[0]}" <c:if test="${fn:length(row[2]) > 0}"> checked</c:if>> ${row[1]}</label></br> -</c:forEach> -</p> -<p> -<b>Type</b></br> -<c:forEach var="row" items="${types}"> -<label><input name="type" type="checkbox" value="${row[0]}" <c:if test="${fn:length(row[2]) > 0}"> checked</c:if>> ${row[1]}</label></br> -</c:forEach> -</p> -<p> -<b>Level</b></br> -<c:forEach var="row" items="${levels}"> -<label><input name="level" type="checkbox" value="${row[0]}" <c:if test="${fn:length(row[2]) > 0}"> checked</c:if>> ${row[1]}</label></br> -</c:forEach> -</p> -<p> -<b>Order</b></br> -<c:forEach var="row" items="${order}"> -<label><input name="order" type="radio" value="${row[0]}" <c:if test="${fn:length(row[2]) > 0}"> checked</c:if>> ${row[1]}</label></br> -</c:forEach> -</p> -<p> -<input type="submit" value="Update"> -</p> -</form> -</div> +<a href="userstats-relay-country.html"><h3>Users</h3></a> +<p>Where are Tor users from? How do they connect to Tor?</p>
-<div style="overflow:hidden;"> -<style> -table { - border-spacing: 10px; -} -</style> -<table> -<thead> -<tr> -<th>Name</th> -<th>Tags</th> -<th>Type</th> -<th>Level</th> -</tr> -</thead> -<tbody> -<c:forEach var="row" items="${results}"> -<tr> -<td><a href="${row[0]}">${row[1]}</a></td> -<td>${row[2]}</td> -<td>${row[3]}</td> -<td>${row[4]}</td> -</tr> -</c:forEach> -</tbody> -</table> -</div> +<a href="networksize.html"><h3>Relays and Bridges</h3></a> +<p>How many relays and bridges are online? What do we know about them?</p> + +<a href="bandwidth.html"><h3>Traffic</h3></a> +<p>How much traffic can the Tor network handle? How much traffic is there?</p> + +<a href="torperf.html"><h3>Performance</h3></a> +<p>How fast and reliable is the Tor network?</p> + +<a href="hidserv-dir-onions-seen.html"><h3>Onion Services</h3></a> +<p>How many onion services are there? How much traffic do they pull?</p> + +<h3>Downloads (coming soon)</h3> +<p>How many downloads of Tor applications are there? How many updates?</p> </div>
+<p>Let us know if we're missing anything, or if we should measure something +else.</p> + </div> </div> <div class="bottom" id="bottom">
tor-commits@lists.torproject.org