[tor-commits] [metrics-web/master] Rip out metrics table.

karsten at torproject.org karsten at torproject.org
Mon Jan 9 17:03:42 UTC 2017


commit bdfca8e75e23c3dd29e1fb6eca7ae835d26acde4
Author: Karsten Loesing <karsten.loesing at 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;
 
- at 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">





More information about the tor-commits mailing list