You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@htrace.apache.org by cm...@apache.org on 2015/06/18 01:00:07 UTC

[22/22] incubator-htrace git commit: HTRACE-180 Move the GUI to a top-level subproject. (stack via cmccabe)

HTRACE-180 Move the GUI to a top-level subproject. (stack via cmccabe)

Create new module named htrace-webapp to house webapp. Add a pom to it
that generates a WAR file. Move the web dir from htrace-htraced to this
new module at src/main/web Added a web.xml so WAR builds. Changed the
symlink over in htrace-htraced/go/gobuild.sh to point at the new
location.  Fixed a bug where the java REST client was looking for
htraced in the wrong location.


Project: http://git-wip-us.apache.org/repos/asf/incubator-htrace/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-htrace/commit/d0554d53
Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/d0554d53
Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/d0554d53

Branch: refs/heads/master
Commit: d0554d53af527f8d61b5948c828958dac3a915a2
Parents: 42b2f6a
Author: stack <st...@duboce.net>
Authored: Wed Jun 17 15:49:26 2015 -0700
Committer: Colin Patrick McCabe <cm...@keter.site>
Committed: Wed Jun 17 15:59:40 2015 -0700

----------------------------------------------------------------------
 .gitignore                                      |    5 +-
 htrace-htraced/go/gobuild.sh                    |    2 +-
 htrace-htraced/pom.xml                          |    7 +
 .../org/apache/htrace/util/HTracedProcess.java  |    4 +-
 htrace-htraced/src/web/app/about_view.js        |   33 -
 htrace-htraced/src/web/app/modal.js             |   34 -
 htrace-htraced/src/web/app/predicate.js         |  117 -
 htrace-htraced/src/web/app/predicate_view.js    |   68 -
 htrace-htraced/src/web/app/query_results.js     |   45 -
 htrace-htraced/src/web/app/router.js            |   74 -
 htrace-htraced/src/web/app/search_result.js     |   55 -
 htrace-htraced/src/web/app/search_results.js    |   25 -
 .../src/web/app/search_results_view.js          |  361 -
 htrace-htraced/src/web/app/search_view.js       |  197 -
 htrace-htraced/src/web/app/server_info.js       |   31 -
 htrace-htraced/src/web/app/span.js              |  252 -
 htrace-htraced/src/web/app/span_details_view.js |   39 -
 htrace-htraced/src/web/app/span_group_widget.js |  110 -
 htrace-htraced/src/web/app/span_widget.js       |  237 -
 htrace-htraced/src/web/app/string.js            |   66 -
 htrace-htraced/src/web/app/time_cursor.js       |   81 -
 htrace-htraced/src/web/app/tree.js              |   74 -
 htrace-htraced/src/web/app/triangle_button.js   |  108 -
 htrace-htraced/src/web/app/widget_manager.js    |   62 -
 htrace-htraced/src/web/custom.css               |  101 -
 htrace-htraced/src/web/image/owl.png            |  Bin 435334 -> 0 bytes
 htrace-htraced/src/web/index.html               |  226 -
 htrace-htraced/src/web/lib/backbone-1.1.2.js    | 1608 ---
 .../lib/bootstrap-3.3.1/css/bootstrap-theme.css |  470 -
 .../bootstrap-3.3.1/css/bootstrap-theme.css.map |    1 -
 .../bootstrap-3.3.1/css/bootstrap-theme.min.css |    5 -
 .../web/lib/bootstrap-3.3.1/css/bootstrap.css   | 6332 ------------
 .../lib/bootstrap-3.3.1/css/bootstrap.css.map   |    1 -
 .../lib/bootstrap-3.3.1/css/bootstrap.min.css   |    5 -
 .../src/web/lib/bootstrap-3.3.1/js/bootstrap.js | 2320 -----
 .../web/lib/bootstrap-3.3.1/js/bootstrap.min.js |    7 -
 .../src/web/lib/bootstrap-3.3.1/js/npm.js       |   13 -
 htrace-htraced/src/web/lib/jquery-2.1.4.js      | 9210 ------------------
 htrace-htraced/src/web/lib/moment-2.10.3.js     | 3111 ------
 htrace-htraced/src/web/lib/underscore-1.7.0.js  | 1416 ---
 htrace-webapp/README.md                         |   21 +
 htrace-webapp/pom.xml                           |  104 +
 htrace-webapp/src/main/web/WEB-INF/web.xml      |   20 +
 htrace-webapp/src/main/web/app/about_view.js    |   33 +
 htrace-webapp/src/main/web/app/modal.js         |   34 +
 htrace-webapp/src/main/web/app/predicate.js     |  117 +
 .../src/main/web/app/predicate_view.js          |   68 +
 htrace-webapp/src/main/web/app/query_results.js |   45 +
 htrace-webapp/src/main/web/app/router.js        |   74 +
 htrace-webapp/src/main/web/app/search_result.js |   55 +
 .../src/main/web/app/search_results.js          |   25 +
 .../src/main/web/app/search_results_view.js     |  361 +
 htrace-webapp/src/main/web/app/search_view.js   |  197 +
 htrace-webapp/src/main/web/app/server_info.js   |   31 +
 htrace-webapp/src/main/web/app/span.js          |  252 +
 .../src/main/web/app/span_details_view.js       |   39 +
 .../src/main/web/app/span_group_widget.js       |  110 +
 htrace-webapp/src/main/web/app/span_widget.js   |  237 +
 htrace-webapp/src/main/web/app/string.js        |   66 +
 htrace-webapp/src/main/web/app/time_cursor.js   |   81 +
 htrace-webapp/src/main/web/app/tree.js          |   74 +
 .../src/main/web/app/triangle_button.js         |  108 +
 .../src/main/web/app/widget_manager.js          |   62 +
 htrace-webapp/src/main/web/custom.css           |  101 +
 htrace-webapp/src/main/web/image/owl.png        |  Bin 0 -> 435334 bytes
 htrace-webapp/src/main/web/index.html           |  226 +
 .../src/main/web/lib/backbone-1.1.2.js          | 1608 +++
 .../lib/bootstrap-3.3.1/css/bootstrap-theme.css |  470 +
 .../bootstrap-3.3.1/css/bootstrap-theme.css.map |    1 +
 .../bootstrap-3.3.1/css/bootstrap-theme.min.css |    5 +
 .../web/lib/bootstrap-3.3.1/css/bootstrap.css   | 6332 ++++++++++++
 .../lib/bootstrap-3.3.1/css/bootstrap.css.map   |    1 +
 .../lib/bootstrap-3.3.1/css/bootstrap.min.css   |    5 +
 .../web/lib/bootstrap-3.3.1/js/bootstrap.js     | 2320 +++++
 .../web/lib/bootstrap-3.3.1/js/bootstrap.min.js |    7 +
 .../src/main/web/lib/bootstrap-3.3.1/js/npm.js  |   13 +
 htrace-webapp/src/main/web/lib/jquery-2.1.4.js  | 9210 ++++++++++++++++++
 htrace-webapp/src/main/web/lib/moment-2.10.3.js | 3111 ++++++
 .../src/main/web/lib/underscore-1.7.0.js        | 1416 +++
 pom.xml                                         |    5 +
 80 files changed, 27058 insertions(+), 26900 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 8735de5..4baf9e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,7 @@
 *~
 *.swp
 dependency-reduced-pom.xml
-htrace-htraced/src/go/build
-htrace-htraced/src/go/pkg
+htrace-htraced/go/build
+htrace-htraced/go/pkg
+htrace-htraced/go/web
 htrace-htraced/bin

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/go/gobuild.sh
----------------------------------------------------------------------
diff --git a/htrace-htraced/go/gobuild.sh b/htrace-htraced/go/gobuild.sh
index 259e6a7..121d55b 100755
--- a/htrace-htraced/go/gobuild.sh
+++ b/htrace-htraced/go/gobuild.sh
@@ -108,7 +108,7 @@ install)
     go install ${TAGS} -ldflags "${FLAGS}" -v org/apache/htrace/... "$@"
     # Make a symlink to web src dir so can do development in-situ out
     # of build dir. This is ugly but blame go build.
-    ln -fs "../src/web" "${GOBIN}/../"
+    ln -fs "../../htrace-webapp/src/main/web" "${GOBIN}/../"
     ;;
 bench)
     go test org/apache/htrace/... ${TAGS} -test.bench=. "$@"

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/pom.xml
----------------------------------------------------------------------
diff --git a/htrace-htraced/pom.xml b/htrace-htraced/pom.xml
index 09324b1..d775850 100644
--- a/htrace-htraced/pom.xml
+++ b/htrace-htraced/pom.xml
@@ -179,6 +179,13 @@ language governing permissions and limitations under the License. -->
       <classifier>tests</classifier>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.htrace</groupId>
+      <artifactId>htrace-webapp</artifactId>
+      <version>${project.version}</version>
+      <type>war</type>
+      <scope>provided</scope>
+    </dependency>
     <!-- Global deps. -->
     <dependency>
       <groupId>commons-logging</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/test/java/org/apache/htrace/util/HTracedProcess.java
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/test/java/org/apache/htrace/util/HTracedProcess.java b/htrace-htraced/src/test/java/org/apache/htrace/util/HTracedProcess.java
index 5fa5d95..3e800d2 100644
--- a/htrace-htraced/src/test/java/org/apache/htrace/util/HTracedProcess.java
+++ b/htrace-htraced/src/test/java/org/apache/htrace/util/HTracedProcess.java
@@ -166,7 +166,7 @@ public class HTracedProcess extends Process {
    * @return Path to the htraced binary.
    */
   public static File getPathToHTraceBinaryFromTopLevel(final File topLevel) {
-    return new File(new File(new File(new File(new File(topLevel, "htrace-htraced"), "src"), "go"),
-      "build"), "htraced");
+    return new File(new File(new File(new File(topLevel, "htrace-htraced"), "go"), "build"),
+      "htraced");
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/about_view.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/about_view.js b/htrace-htraced/src/web/app/about_view.js
deleted file mode 100644
index 7dfe868..0000000
--- a/htrace-htraced/src/web/app/about_view.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-htrace.AboutView = Backbone.View.extend({
-  render: function() {
-    this.$el.html(_.template($("#about-view-template").html())
-      ({ model : this.model }));
-    console.log("AboutView#render");
-    return this;
-  },
-
-  close: function() {
-    console.log("AboutView#close")
-    this.undelegateEvents();
-  }
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/modal.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/modal.js b/htrace-htraced/src/web/app/modal.js
deleted file mode 100644
index 91d55fe..0000000
--- a/htrace-htraced/src/web/app/modal.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-// Show a modal dialog box with a warning message.
-htrace.showModalWarning = function(title, body) {
-  var html = _.template($("#modal-warning-template").html())
-      ({ title: title, body: body });
-  htrace.showModal(html);
-}
-
-// Show a modal dialog box.
-htrace.showModal = function(html) {
-  var el = $("#modal");
-  el.html(html);
-  el.modal();
-}

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/predicate.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/predicate.js b/htrace-htraced/src/web/app/predicate.js
deleted file mode 100644
index 87a5602..0000000
--- a/htrace-htraced/src/web/app/predicate.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-htrace.checkStringIsPositiveWholeNumber = function(val) {
-  if (!val.match(/^[0-9]([0-9]*)$/)) {
-    if (!val.match(/[^\s]/)) {
-      throw "You entered an empty string into a numeric field.";
-    }
-    throw "Non-numeric characters found.";
-  }
-};
-
-htrace.checkStringIsNotEmpty = function(val) {
-  if (!val.match(/[^\s]/)) {
-    throw "You entered an empty string into a text field.";
-  }
-};
-
-// Predicate type
-htrace.PType = Backbone.Model.extend({
-  initialize: function(options) {
-    this.name = options.name;
-    this.field = options.field;
-    this.op = options.op;
-  },
-
-  // Try to normalize a value of this type into something htraced can accept.
-  // Returns a string containing the normalized value on success.  Throws a
-  // string explaining the parse error otherwise.
-  // Dates are represented by milliseconds since the epoch; span ids don't start
-  // with 0x.
-  normalize: function(val) {
-    switch (this.field) {
-    case "begin":
-      return htrace.parseDate(val).valueOf().toString();
-    case "end":
-      return htrace.parseDate(val).valueOf().toString();
-    case "description":
-      htrace.checkStringIsNotEmpty(val);
-      return val;
-    case "duration":
-      htrace.checkStringIsPositiveWholeNumber(val);
-      return val;
-    case "spanid":
-      return htrace.normalizeSpanId(val);
-    default:
-      return "Normalization not implemented for field '" + this.field + "'";
-    }
-  },
-
-  getDefaultValue: function() {
-    switch (this.field) {
-    case "begin":
-      return htrace.dateToString(moment());
-    case "end":
-      return htrace.dateToString(moment());
-    case "description":
-      return "";
-    case "duration":
-      return "0";
-    case "spanid":
-      return "";
-    default:
-      return "(unknown)";
-    }
-  }
-});
-
-htrace.parsePType = function(name) {
-  switch (name) {
-    case "Began after":
-      return new htrace.PType({name: name, field:"begin", op:"gt"});
-    case "Began at or before":
-      return new htrace.PType({name: name, field:"begin", op:"le"});
-    case "Ended after":
-      return new htrace.PType({name: name, field:"end", op:"gt"});
-    case "Ended at or before":
-      return new htrace.PType({name: name, field:"end", op:"le"});
-    case "Description contains":
-      return new htrace.PType({name: name, field:"description", op:"cn"});
-    case "Description is exactly":
-      return new htrace.PType({name: name, field:"description", op:"eq"});
-    case "Duration is longer than":
-      return new htrace.PType({name: name, field:"duration", op:"gt"});
-    case "Duration is at most":
-      return new htrace.PType({name: name, field:"duration", op:"le"});
-    case "Span ID is":
-      return new htrace.PType({name: name, field:"spanid", op:"eq"});
-    default:
-      return null
-  }
-};
-
-htrace.Predicate = function(options) {
-  this.op = options.ptype.op;
-  this.field = options.ptype.field;
-  this.val = options.val;
-  return this;
-};

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/predicate_view.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/predicate_view.js b/htrace-htraced/src/web/app/predicate_view.js
deleted file mode 100644
index aefe896..0000000
--- a/htrace-htraced/src/web/app/predicate_view.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-htrace.PredicateView = Backbone.View.extend({
-  initialize: function(options) {
-    this.el = options.el;
-    this.index = options.index;
-    this.ptype = options.ptype;
-    this.searchView = options.searchView;
-  },
-
-  events: {
-    "click .closeButton": "remove",
-  },
-
-  render: function() {
-    this.$el.html(_.template($("#predicate-template").html())
-        ({ desc: this.ptype.name, id: this.index }))
-    if (this.getText() === "") {
-      $(this.$el).find(".form-control").val(this.ptype.getDefaultValue());
-    }
-    console.log(this.toString() + "#render");
-    return this;
-  },
-
-  // Handle the user removing this predicate.
-  remove: function() {
-    this.searchView.removePredicateView(this);
-    Backbone.View.prototype.remove.apply(this, arguments);
-  },
-
-  // Get the text which the user has entered in.
-  getText: function() {
-    return $(this.$el).find(".form-control").val().trim();
-  },
-
-  // Get the predicate expressed by this view.
-  // Throw an exception if the predicate can't be parsed.
-  getPredicate: function() {
-    return new htrace.Predicate({
-        ptype: this.ptype,
-        val: this.ptype.normalize(this.getText())
-    });
-  },
-
-  toString: function() {
-    return "PredicateView(this.el=" + this.el + ", this.index=" +
-        this.index + ", this.ptype='" + this.ptype.name + "')";
-  }
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/query_results.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/query_results.js b/htrace-htraced/src/web/app/query_results.js
deleted file mode 100644
index dc37e1e..0000000
--- a/htrace-htraced/src/web/app/query_results.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-htrace.QueryResults = Backbone.Collection.extend({
-  // The query results are spans.
-  model: htrace.Span,
-
-  initialize: function(options) {
-    this.queryJson = options.queryJson;
-  },
-
-  url: function() {
-    return "query?query=" + this.queryString();
-  },
-
-  parse: function(response, xhr) {
-    return response;
-  },
-
-  prettyQueryString: function() {
-    return JSON.stringify(this.queryJson, null, 2);
-  },
-
-  queryString: function() {
-    return JSON.stringify(this.queryJson);
-  }
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/router.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/router.js b/htrace-htraced/src/web/app/router.js
deleted file mode 100644
index 607da44..0000000
--- a/htrace-htraced/src/web/app/router.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-htrace.HTraceRouter = Backbone.Router.extend({
-  "routes": {
-    "": "empty",
-    "about": "about",
-    "search": "search",
-    "*unknown": "unknown"
-  },
-
-  empty: function() {
-    console.log("Redirecting to #about.");
-    Backbone.history.navigate("about", {"trigger": true, "replace": true});
-  },
-
-  about: function() {
-    console.log("Visiting #about.");
-    serverInfo = new htrace.ServerInfo();
-    var router = this;
-    serverInfo.fetch({
-        "success": function(model, response, options) {
-          router.switchView(new htrace.AboutView({model: serverInfo, el: "#app"}));
-          router.activateNavBarEntry("about")
-        },
-        "error": function(model, response, options) {
-          window.alert("Failed to fetch htraced server info via GET " +
-                       "/server/info: " + JSON.stringify(response));
-        }
-      });
-  },
-
-  search: function() {
-    console.log("Visiting #search.");
-    this.switchView(new htrace.SearchView({el : "#app"}));
-    htrace.router.activateNavBarEntry("search");
-  },
-
-  unknown: function() {
-    console.log("Unknown route " + Backbone.history.getFragment() + ".")
-  },
-
-  "switchView": function(view) {
-    this.view && this.view.close();
-    this.view = view;
-    this.view.render();
-  },
-
-  "activateNavBarEntry": function(id) {
-     $(".nav").find(".active").removeClass("active");
-     $(".nav").find("#" + id).addClass("active");
-  }
-});
-
-htrace.router = new htrace.HTraceRouter();
-Backbone.history.start();

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/search_result.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/search_result.js b/htrace-htraced/src/web/app/search_result.js
deleted file mode 100644
index 9798ad7..0000000
--- a/htrace-htraced/src/web/app/search_result.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-// A pair of span trees: one going up, and the other going down.
-// This represents a single search result.
-htrace.SearchResult = Backbone.Model.extend({
-  initialize: function(options) {
-    this.set("childrenRoot", {
-      root: options.span,
-      contents: null,
-    });
-    this.set("childrenRoot", {
-      root: options.span,
-      contents: null,
-    });
-
-    this.set("parentsRoot", options.span);
-  },
-
-  getBegin: function() {
-    var begin = this.get("span").get("begin");
-    var children = this.get("children");
-    for (var childIdx = 0; childIdx < children.length; childIdx++) {
-      begin = Math.min(begin, children[childIdx].getBegin());
-    }
-    return begin;
-  },
-
-  getEnd: function() {
-    var end = this.get("span").get("end");
-    var children = this.get("children");
-    for (var childIdx = 0; childIdx < children.length; childIdx++) {
-      end = Math.max(end, children[childIdx].getEnd());
-    }
-    return end;
-  }
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/search_results.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/search_results.js b/htrace-htraced/src/web/app/search_results.js
deleted file mode 100644
index 25b18ae..0000000
--- a/htrace-htraced/src/web/app/search_results.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-htrace.SearchResults = Backbone.Collection.extend({
-  // The search results are span trees.
-  model: htrace.SpanTreeNode
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/search_results_view.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/search_results_view.js b/htrace-htraced/src/web/app/search_results_view.js
deleted file mode 100644
index 111f530..0000000
--- a/htrace-htraced/src/web/app/search_results_view.js
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-htrace.SearchResultsView = Backbone.View.extend({
-  // The minimum time span we will allow between begin and end.
-  MINIMUM_TIME_SPAN: 100,
-
-  begin: 0,
-
-  end: this.MINIMUM_TIME_SPAN,
-
-  initialize: function(options) {
-    this.searchResults = options.searchResults;
-    this.el = options.el;
-    this.listenTo(this.searchResults, 'add remove change reset', this.render);
-
-    // Re-render the canvas when the window size changes.
-    // Add a debouncer delay to avoid spamming render requests.
-    var view = this;
-    $(window).on("resize", _.debounce(function()  {
-      view.render();
-    }, 250));
-  },
-
-  // Get the canvas X coordinate of a mouse click from the absolute event
-  // coordinate.
-  getCanvasX: function(e) {
-    return e.pageX - $("#resultsCanvas").offset().left;
-  },
-
-  // Get the canvas Y coordinate of a mouse click from the absolute event
-  // coordinate.
-  getCanvasY: function(e) {
-    return e.pageY - $("#resultsCanvas").offset().top;
-  },
-
-  handleMouseDown: function(e) {
-    e.preventDefault();
-    this.widgetManager.handle({
-      type: "mouseDown",
-      x: this.getCanvasX(e),
-      y: this.getCanvasY(e)
-    });
-    this.draw();
-  },
-
-  handleMouseUp: function(e) {
-    e.preventDefault();
-    this.widgetManager.handle({
-      type: "mouseUp",
-      x: this.getCanvasX(e),
-      y: this.getCanvasY(e)
-    });
-    this.draw();
-  },
-
-  handleMouseOut: function(e) {
-    e.preventDefault();
-    this.widgetManager.handle({
-      type: "mouseOut"
-    });
-    this.draw();
-  },
-
-  handleMouseMove: function(e) {
-    e.preventDefault();
-    this.widgetManager.handle({
-      type: "mouseMove",
-      x: this.getCanvasX(e),
-      y: this.getCanvasY(e)
-    });
-    this.draw();
-  },
-
-  render: function() {
-    console.log("SearchResultsView#render.");
-    $(this.el).html(_.template($("#search-results-view-template").html()));
-    $('#selectedTime').attr('readonly', 'readonly');
-    this.canvas = $("#resultsCanvas");
-    this.ctx = this.canvas.get(0).getContext("2d");
-    this.scaleCanvas();
-    this.setupCoordinates();
-    this.setupWidgets();
-    this.draw();
-    this.attachEvents();
-    return this;
-  },
-
-  /*
-   * Compute the ratio to use between the size of the canvas (i.e.
-   * canvas.ctx.width, canvas.ctx.height) and the size in "HTML5 pixels." Note
-   * that 'HTML5 pixels" don't actually correspond to screen pixels.  A line 1
-   * "HTML5 pixel"  wide actually takes up multiple scren pixels, etc.
-   *
-   * TODO: fix this to be sharper
-   */
-  computeScaleFactor: function() {
-    var backingStoreRatio = this.ctx.backingStorePixelRatio ||
-          this.ctx.mozBackingStorePixelRatio ||
-          this.ctx.msBackingStorePixelRatio ||
-          this.ctx.webkitBackingStorePixelRatio ||
-          this.ctx.oBackingStorePixelRatio ||
-          this.ctx.backingStorePixelRatio || 1;
-    return (window.devicePixelRatio || 1) / backingStoreRatio;
-  },
-
-  // Sets up the canvas size and scaling.
-  scaleCanvas: function() {
-    var cssX = this.canvas.parent().innerWidth();
-    var cssY = $(window).innerHeight() - $("#header").innerHeight() - 50;
-    var ratio = this.computeScaleFactor();
-    console.log("scaleCanvas: cssX=" + cssX + ", cssY=" + cssY + ", ratio=" + ratio);
-    this.maxX = cssX;
-    this.maxY = cssY;
-    $('#searchView').css('height', cssY + "px");
-    $('#results').css('width', cssX + "px");
-    $('#results').css('height', cssY + "px");
-    $('#resultsView').css('width', cssX + "px");
-    $('#resultsView').css('height', cssY + "px");
-    $('#resultsDiv').css('width', cssX + "px");
-    $('#resultsDiv').css('height', cssY + "px");
-    $('#resultsCanvas').css('width', cssX + "px");
-    $('#resultsCanvas').css('height', cssY + "px");
-    this.ctx.canvas.width = cssX * ratio;
-    this.ctx.canvas.height = cssY * ratio;
-    this.ctx.scale(ratio, ratio);
-  },
-
-  //
-  // Set up the screen coordinates.
-  //
-  //  0              xB         xD                   xS         maxX
-  //  +--------------+----------+--------------------+-----------+
-  //  |ProcessId     | Buttons  | Span Description   | Scrollbar |
-  //  +--------------+----------+--------------------+-----------+
-  //
-  setupCoordinates: function() {
-    this.xB = Math.min(300, Math.floor(this.maxX / 5));
-    this.xD = this.xB + Math.min(75, Math.floor(this.maxX / 20));
-    var scrollBarWidth = Math.min(50, Math.floor(this.maxX / 10));
-    this.xS = this.maxX - scrollBarWidth;
-  },
-
-  setupWidgets: function() {
-    this.widgetManager = new htrace.WidgetManager({searchResultsView: this});
-
-    // Create a SpanWidget for each span we know about
-    var spanWidgetHeight = Math.min(25, Math.floor(this.maxY / 32));
-    var numResults = this.searchResults.size();
-    var groupY = 0;
-    for (var i = 0; i < numResults; i++) {
-      var widget = new htrace.SpanGroupWidget({
-        manager: this.widgetManager,
-        ctx: this.ctx,
-        span: this.searchResults.at(i),
-        x0: 0,
-        xB: this.xB,
-        xD: this.xD,
-        xF: this.xS,
-        y0: groupY,
-        begin: this.begin,
-        end: this.end,
-        spanWidgetHeight: spanWidgetHeight
-      });
-      groupY = widget.yF;
-    }
-
-    // Create the time cursor widget.
-    var selectedTime = this.begin;
-    if (this.timeCursor != null) {
-      selectedTime = this.timeCursor.selectedTime;
-    }
-    this.timeCursor = new htrace.TimeCursor({
-      manager: this.widgetManager,
-      selectedTime: selectedTime,
-      el: "#selectedTime"
-    });
-    this.timeCursor.ctx = this.ctx;
-    this.timeCursor.x0 = this.xD;
-    this.timeCursor.xF = this.xS;
-    this.timeCursor.y0 = 0;
-    this.timeCursor.yF = this.maxY;
-    this.timeCursor.begin = this.begin;
-    this.timeCursor.end = this.end;
-  },
-
-  draw: function() {
-    if (this.checkCanvasTooSmall()) {
-      return;
-    }
-
-    // Set the background to white.
-    this.ctx.save();
-    this.ctx.fillStyle="#ffffff";
-    this.ctx.strokeStyle="#000000";
-    this.ctx.fillRect(0, 0, this.maxX, this.maxY);
-    this.ctx.restore();
-
-    // Draw all the widgets.
-    this.widgetManager.handle({type: "draw"});
-  },
-
-  checkCanvasTooSmall: function() {
-    if ((this.maxX < 200) || (this.maxY < 200)) {
-      this.ctx.fillStyle="#cccccc";
-      this.ctx.strokeStyle="#000000";
-      this.ctx.fillRect(0, 0, this.maxX, this.maxY);
-      this.ctx.font = "24px serif";
-      this.ctx.fillStyle="#000000";
-      this.ctx.fillText("Canvas too small!", 0, 24);
-      return true;
-    }
-    return false;
-  },
-
-  attachEvents: function() {
-    // Use jquery to capture mouse events on the canvas.
-    // For some reason using backbone doesn't work for getting these events.
-    var view = this;
-    $("#resultsCanvas").off("mousedown");
-    $("#resultsCanvas").on("mousedown", function(e) {
-      view.handleMouseDown(e);
-    });
-    $("#resultsCanvas").off("mouseup");
-    $("#resultsCanvas").on("mouseup", function(e) {
-      view.handleMouseUp(e);
-    });
-    $("#resultsCanvas").off("mouseout");
-    $("#resultsCanvas").on("mouseout", function(e) {
-      view.handleMouseOut(e);
-    });
-    $("#resultsCanvas").off("mousemove");
-    $("#resultsCanvas").on("mousemove", function(e) {
-      view.handleMouseMove(e);
-    });
-  },
-
-  remove: function() {
-    $(window).off("resize");
-    $("#resultsCanvas").off("mousedown");
-    $("#resultsCanvas").off("mouseup");
-    $("#resultsCanvas").off("mousemove");
-    Backbone.View.prototype.remove.apply(this, arguments);
-  },
-
-  handleBeginOrEndChange: function(e, type) {
-    e.preventDefault();
-    var text = $(e.target).val().trim();
-    var d = null;
-    try {
-      d = htrace.parseDate(text);
-    } catch(err) {
-      $("#begin").val(htrace.dateToString(this.begin));
-      $("#end").val(htrace.dateToString(this.end));
-      htrace.showModalWarning("Timeline " + type + " Format Error",
-        "Please enter a valid time in the timeline " + type + " field.<p/>" +
-        err);
-      return null;
-    }
-    if (type === "begin") {
-      this.setBegin(d.valueOf());
-    } else if (type === "end") {
-      this.setEnd(d.valueOf());
-    } else {
-      throw "invalid type for handleBeginOrEndChange: expected begin or end.";
-    }
-  },
-
-  setBegin: function(val) {
-    if (this.end < val + this.MINIMUM_TIME_SPAN) {
-      this.begin = val;
-      this.end = val + this.MINIMUM_TIME_SPAN;
-      console.log("SearchResultsView#setBegin(begin=" + this.begin +
-            ", end=" + this.end + ")");
-      $("#begin").val(htrace.dateToString(this.begin));
-      $("#end").val(htrace.dateToString(this.end));
-    } else {
-      this.begin = val;
-      console.log("SearchResultsView#setBegin(begin=" + this.begin + ")");
-      $("#begin").val(htrace.dateToString(this.begin));
-    }
-    this.render();
-  },
-
-  setEnd: function(val) {
-    if (this.begin + this.MINIMUM_TIME_SPAN > val) {
-      this.begin = val;
-      this.end = this.begin + this.MINIMUM_TIME_SPAN;
-      console.log("SearchResultsView#setEnd(begin=" + this.begin +
-            ", end=" + this.end + ")");
-      $("#begin").val(htrace.dateToString(this.begin));
-      $("#end").val(htrace.dateToString(this.end));
-    } else {
-      this.end = val;
-      console.log("SearchResultsView#setEnd(end=" + this.end + ")");
-      $("#end").val(htrace.dateToString(this.end));
-    }
-    this.render();
-  },
-
-  zoomFitAll: function() {
-    var numResults = this.searchResults.size();
-    if (numResults == 0) {
-      this.setBegin(0);
-      this.setEnd(this.MINIMUM_TIME_SPAN);
-      return;
-    }
-    var minStart = 4503599627370496;
-    var maxEnd = 0;
-    for (var i = 0; i < numResults; i++) {
-      var span = this.searchResults.at(i);
-      var begin = span.getEarliestBegin();
-      if (begin < minStart) {
-        minStart = begin;
-      }
-      var end = span.getLatestEnd();
-      if (end > minStart) {
-        maxEnd = end;
-      }
-    }
-    this.setBegin(minStart);
-    this.setEnd(maxEnd);
-  },
-
-  // Apply a function to all spans
-  applyToAllSpans: function(cb) {
-    for (var i = 0; i < this.searchResults.length; i++) {
-      htrace.treeTraverseDepthFirstPre(this.searchResults.at(i),
-        htrace.getReifiedChildren, 0,
-          function(node, depth) {
-            console.log("node = " + node + ", node.constructor.name = " + node.constructor.name);
-            cb(node);
-          });
-      htrace.treeTraverseDepthFirstPre(this.searchResults.at(i),
-        htrace.getReifiedParents, 0,
-          function(node, depth) {
-            if (depth > 0) {
-              cb(node);
-            }
-          });
-    }
-  }
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/search_view.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/search_view.js b/htrace-htraced/src/web/app/search_view.js
deleted file mode 100644
index 52f9101..0000000
--- a/htrace-htraced/src/web/app/search_view.js
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-htrace.SearchView = Backbone.View.extend({
-  initialize : function() {
-    this.predicateViews = [];
-    this.highestPredicateIndex = 0;
-    this.searchInProgress = false;
-    this.searchResults = new htrace.SearchResults();
-    this.resultsView = new htrace.SearchResultsView({
-        searchResults: this.searchResults,
-        el: "#results"
-    });
-  },
-
-  events: {
-    "click #searchButton": "searchHandler",
-    "click #clearButton": "clearHandler",
-    "click .add-field": "dropdownHandler",
-    "blur #begin": "blurBeginHandler",
-    "blur #end": "blurEndHandler",
-    "click #zoomButton": "zoomFitAllHandler"
-  },
-
-  searchHandler: function(e){
-    e.preventDefault();
-
-    // Do a new search.
-    this.doSearch(e.ctrlKey);
-  },
-
-  clearHandler: function(e){
-    e.preventDefault();
-
-    // Clear existing search results.
-    this.searchResults.reset();
-  },
-
-  doSearch: function(showDebug){
-    if (this.searchInProgress) {
-      console.log("Can't start a new search while another one is in " +
-          "progress.");
-      return false;
-    }
-
-    // Check if there are no search criteria.
-    if (this.predicateViews.length == 0) {
-      htrace.showModalWarning("No Search Criteria Specified",
-        "You have not specified any search criteria.  " +
-        "Use the 'Add Predicate' button to specify what to search for.");
-      return false;
-    }
-
-    // Build the predicate array.
-    predicates = []
-    var predicateViewsLen = this.predicateViews.length;
-    for (var i = 0; i < predicateViewsLen; i++) {
-      var predicateView = this.predicateViews[i];
-      try {
-        predicates.push(predicateView.getPredicate());
-      } catch(err) {
-        htrace.showModalWarning("Search Field Validation Error",
-          "Invalid search string for the '" + predicateView.ptype.name +
-          "' field.<p/>" + err);
-        return false;
-      }
-    }
-    var queryJson = {
-      pred: predicates,
-      lim: 20
-    };
-    // If there are existing search results, we want results which "come after"
-    // those.  So pass the last span we saw as a continuation token.
-    if (this.searchResults.size() > 0) {
-      queryJson.prev =
-          this.searchResults.at(this.searchResults.size() - 1).unparse();
-    }
-    var searchView = this;
-    var queryResults = new htrace.QueryResults({queryJson: queryJson});
-    console.log("Starting span query " + queryResults.url());
-    this.searchInProgress = true;
-    queryResults.fetch({
-      success: function(model, response, options){
-        var firstResults = (searchView.searchResults.size() === 0);
-        console.log("Success on span query " + queryResults.url() + ": got " +
-            queryResults.size() + " result(s).  firstResults=" + firstResults);
-        searchView.searchResults.add(queryResults.models);
-        if (firstResults) {
-          // After the initial search, zoom to fit everything.
-          // On subsequent searches, we leave the viewport alone.
-          searchView.resultsView.zoomFitAll();
-        }
-        searchView.searchInProgress = false;
-        if (showDebug) {
-          htrace.showModalWarning("Search Debug",
-            "This is the search debug box, accessible by holding down the " +
-            "control key while clicking the search button.<p/>" +
-            "<h3>Query JSON</h3><pre>" + queryResults.prettyQueryString() +
-            "</pre><p/><h3>Response JSON</h3><pre>" +
-            JSON.stringify(queryResults, null, 2) + "</pre><p/>");
-        } else if (queryResults.size() == 0) {
-          if (firstResults) {
-            htrace.showModalWarning("No Results Found",
-              "No results were found for your query.<p/>");
-          } else {
-            htrace.showModalWarning("No Additional Results Found",
-              "No additional results were found for your query.<p/>");
-          }
-        }
-      },
-      error: function(model, response, options){
-        this.searchResults.clear();
-        var err = "Error " + JSON.stringify(response) +
-          " on span query " + query.url();
-        console.log(err);
-        alert(err);
-        searchView.searchInProgress = false;
-      }
-    });
-    return false;
-  },
-
-  dropdownHandler: function(e){
-    e.preventDefault();
-    var text = $(e.target).text();
-    var ptype = htrace.parsePType(text);
-    if (!ptype) {
-      alert("Unable to parse predicate type '" + text + "'");
-      return false;
-    }
-    var index = this.highestPredicateIndex;
-    this.highestPredicateIndex++;
-    var el = "pred" + index;
-    $("#predicates").append('<div id="' + el + '"/></div>');
-    predicateView = new htrace.PredicateView({
-      el: "#" + el,
-      index: index,
-      ptype: ptype,
-      searchView: this
-    });
-    this.predicateViews.push(predicateView);
-    predicateView.render();
-    return true;
-  },
-
-  blurBeginHandler: function(e) {
-    return this.resultsView.handleBeginOrEndChange(e, "begin");
-  },
-
-  blurEndHandler: function(e) {
-    return this.resultsView.handleBeginOrEndChange(e, "end");
-  },
-
-  zoomFitAllHandler: function(e) {
-    e.preventDefault();
-    this.resultsView.zoomFitAll();
-  },
-
-  removePredicateView: function(predicateView) {
-    this.predicateViews = _.without(this.predicateViews, predicateView);
-  },
-
-  render: function() {
-    this.$el.html(_.template($("#search-view-template").html())
-      ({ model : this.model }))
-    this.resultsView.render();
-    console.log("SearchView#render");
-    return this;
-  },
-
-  close: function() {
-    console.log("SearchView#close")
-    while (this.predicateViews.length > 0) {
-      this.predicateViews[0].remove();
-    }
-    this.resultsView.remove();
-    this.resultsView = null;
-    this.undelegateEvents();
-  }
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/server_info.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/server_info.js b/htrace-htraced/src/web/app/server_info.js
deleted file mode 100644
index b03f706..0000000
--- a/htrace-htraced/src/web/app/server_info.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// htraced ServerInfo sent back from /serverInfo.
-// See rest.go.
-htrace.ServerInfo = Backbone.Model.extend({
-  defaults: {
-    "ReleaseVersion": "unknown",
-    "GitVersion": "unknown",
-  },
-
-  url: function() {
-    return "server/info";
-  }
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/span.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/span.js b/htrace-htraced/src/web/app/span.js
deleted file mode 100644
index a056b4f..0000000
--- a/htrace-htraced/src/web/app/span.js
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-// The invalid span ID, which is all zeroes.
-htrace.INVALID_SPAN_ID = "0000000000000000";
-
-// Convert an array of htrace.Span models into a comma-separated string.
-htrace.spanModelsToString = function(spans) {
-  var ret = "";
-  var prefix = "";
-  for (var i = 0; i < spans.length; i++) {
-    ret += prefix + JSON.stringify(spans[i].unparse());
-    prefix = ", ";
-  }
-  return ret;
-};
-
-// Convert an array of return results from ajax calls into an array of
-// htrace.Span models.
-htrace.parseMultiSpanAjaxQueryResults = function(ajaxCalls) {
-  var parsedSpans = [];
-  for (var i = 0; i < ajaxCalls.length; i++) {
-    var text = ajaxCalls[i][0];
-    var result = ajaxCalls[i][1];
-    if (ajaxCalls[i]["status"] != "200") {
-      throw "ajax error: " + ajaxCalls[i].statusText;
-    }
-    var parsedSpan = new htrace.Span({});
-    try {
-      parsedSpan.parse(ajaxCalls[i].responseJSON, {});
-    } catch (e) {
-      throw "span parse error: " + e;
-    }
-    parsedSpans.push(parsedSpan);
-  }
-  return parsedSpans;
-};
-
-htrace.getReifiedParents = function(span) {
-  return span.get("reifiedParents") || [];
-};
-
-htrace.getReifiedChildren = function(span) {
-  return span.get("reifiedChildren") || [];
-};
-
-htrace.Span = Backbone.Model.extend({
-  // Parse a span sent from htraced.
-  // We use more verbose names for some attributes.
-  // Missing attributes are treated as zero or empty.  Numerical attributes are
-  // forced to be numbers.
-  parse: function(response, options) {
-    var span = {};
-    this.set("spanId", response.s ? response.s : htrace.INVALID_SPAN_ID);
-    this.set("traceId", response.i ? response.i : htrace.INVALID_SPAN_ID);
-    this.set("processId", response.r ? response.r : "");
-    this.set("parents", response.p ? response.p : []);
-    this.set("description", response.d ? response.d : "");
-    this.set("begin", response.b ? parseInt(response.b, 10) : 0);
-    this.set("end", response.e ? parseInt(response.e, 10) : 0);
-
-    this.set("selected", false);
-
-    // reifiedChildren starts off as null and will be filled in as needed.
-    this.set("reifiedChildren", null);
-
-    // If there are parents, reifiedParents starts off as null.  Otherwise, we
-    // know it is the empty array.
-    this.set("reifiedParents", (this.get("parents").length == 0) ? [] : null);
-
-    return span;
-  },
-
-  // Transform a span model back into a JSON string suitable for sending over
-  // the wire.
-  unparse: function() {
-    var obj = { };
-    if (!(this.get("spanId") === htrace.INVALID_SPAN_ID)) {
-      obj.s = this.get("spanId");
-    }
-    if (!(this.get("traceId") === htrace.INVALID_SPAN_ID)) {
-      obj.i = this.get("traceId");
-    }
-    if (!(this.get("processId") === "")) {
-      obj.r = this.get("processId");
-    }
-    if (this.get("parents").length > 0) {
-      obj.p = this.get("parents");
-    }
-    if (this.get("description").length > 0) {
-      obj.d = this.get("description");
-    }
-    if (this.get("begin") > 0) {
-      obj.b = this.get("begin");
-    }
-    if (this.get("end") > 0) {
-      obj.e = this.get("end");
-    }
-    return obj;
-  },
-
-  //
-  // Although the parent IDs are always present in the 'parents' field of the
-  // span, sometimes we need the actual parent span models.  In that case we
-  // must "reify" them (make them real).
-  //
-  // This functionReturns a jquery promise which reifies all the parents of this
-  // span and stores them into reifiedParents.  The promise returns the empty
-  // string on success, or an error string on failure.
-  //
-  reifyParents: function() {
-    var span = this;
-    var numParents = span.get("parents").length;
-    var ajaxCalls = [];
-    // Set up AJAX queries to reify the parents.
-    for (var i = 0; i < numParents; i++) {
-      ajaxCalls.push($.ajax({
-        url: "span/" + span.get("parents")[i],
-        data: {},
-        contentType: "application/json; charset=utf-8",
-        dataType: "json"
-      }));
-    }
-    var rootDeferred = jQuery.Deferred();
-    $.when.apply($, ajaxCalls).then(function() {
-      var reifiedParents = [];
-      try {
-        reifiedParents = htrace.parseMultiSpanAjaxQueryResults(ajaxCalls);
-      } catch (e) {
-        rootDeferred.resolve("Error reifying parents for " +
-            span.get("spanId") + ": " + e);
-        return;
-      }
-      // The current span is a child of the reified parents.  There may be other
-      // children of those parents, but we are ignoring that here.  By making
-      // this non-null, the "expand children" button will not appear for these
-      // paren spans.
-      for (var j = 0; j < reifiedParents.length; j++) {
-        reifiedParents[j].set("reifiedChildren", [span]);
-      }
-      console.log("Setting reified parents for " + span.get("spanId") +
-          " to " + htrace.spanModelsToString (reifiedParents));
-      span.set("reifiedParents", reifiedParents);
-      rootDeferred.resolve("");
-    });
-    return rootDeferred.promise();
-  },
-
-  //
-  // The span itself does not contain its children.  However, the server has an
-  // index which can be used to easily find the children of a particular span.
-  //
-  // This function returns a jquery promise which reifies all the children of
-  // this span and stores them into reifiedChildren.  The promise returns the
-  // empty string on success, or an error string on failure.
-  //
-  reifyChildren: function() {
-    var rootDeferred = jQuery.Deferred();
-    var span = this;
-    $.ajax({
-        url: "span/" + span.get("spanId") + "/children?lim=50",
-        data: {},
-        contentType: "application/json; charset=utf-8",
-        dataType: "json"
-      }).done(function(childIds) {
-        var ajaxCalls = [];
-        for (var i = 0; i < childIds.length; i++) {
-          ajaxCalls.push($.ajax({
-            url: "span/" + childIds[i],
-            data: {},
-            contentType: "application/json; charset=utf-8",
-            dataType: "json"
-          }));
-        };
-        $.when.apply($, ajaxCalls).then(function() {
-          var reifiedChildren;
-          try {
-            reifiedChildren = htrace.parseMultiSpanAjaxQueryResults(ajaxCalls);
-          } catch (e) {
-            reifiedChildren = rootDeferred.resolve("Error reifying children " +
-                "for " + span.get("spanId") + ": " + e);
-            return;
-          }
-          // The current span is a parent of the new child.
-          // There may be other parents, but we are ignoring that here.
-          // By making this non-null, the "expand parents" button will not
-          // appear for these child spans.
-          for (var j = 0; j < reifiedChildren.length; j++) {
-            reifiedChildren[j].set("reifiedParents", [span]);
-          }
-          console.log("Setting reified children for " + span.get("spanId") +
-              " to " + htrace.spanModelsToString (reifiedChildren));
-          span.set("reifiedChildren", reifiedChildren);
-          rootDeferred.resolve("");
-        });
-      }).fail(function(statusData) {
-        // Check if the /children query failed.
-        rootDeferred.resolve("Error querying children of " +
-            span.get("spanId") + ": got " + statusData);
-        return;
-      });
-    return rootDeferred.promise();
-  },
-
-  // Get the earliest begin time of this span or any of its reified parents or
-  // children.
-  getEarliestBegin: function() {
-    var earliestBegin = this.get("begin");
-    htrace.treeTraverseDepthFirstPre(this, htrace.getReifiedParents, 0,
-        function(span, depth) {
-          earliestBegin = Math.min(earliestBegin, span.get("begin"));
-        });
-    htrace.treeTraverseDepthFirstPre(this, htrace.getReifiedChildren, 0,
-        function(span, depth) {
-          earliestBegin = Math.min(earliestBegin, span.get("begin"));
-        });
-    return earliestBegin;
-  },
-
-  // Get the earliest begin time of this span or any of its reified parents or
-  // children.
-  getLatestEnd: function() {
-    var latestEnd = this.get("end");
-    htrace.treeTraverseDepthFirstPre(this, htrace.getReifiedParents, 0,
-        function(span, depth) {
-          latestEnd = Math.max(latestEnd, span.get("end"));
-        });
-    htrace.treeTraverseDepthFirstPre(this, htrace.getReifiedChildren, 0,
-        function(span, depth) {
-          latestEnd = Math.max(latestEnd, span.get("end"));
-        });
-    return latestEnd;
-  },
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/span_details_view.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/span_details_view.js b/htrace-htraced/src/web/app/span_details_view.js
deleted file mode 100644
index 9a37055..0000000
--- a/htrace-htraced/src/web/app/span_details_view.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-htrace.SpanDetailsView = Backbone.View.extend({
-  initialize: function(options) {
-    this.el = options.el;
-    this.model = options.model;
-  }
-
-  render: function() {
-    this.$el.html(_.template($("#about-view-template").html())
-      ({ model : this.model }));
-    console.log("AboutView#render");
-    return this;
-  },
-
-  close: function() {
-    console.log("AboutView#close")
-    this.undelegateEvents();
-  }
-});

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/span_group_widget.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/span_group_widget.js b/htrace-htraced/src/web/app/span_group_widget.js
deleted file mode 100644
index e32c2db..0000000
--- a/htrace-htraced/src/web/app/span_group_widget.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-// Widget containing a group of trace spans displayed on the canvas.
-htrace.SpanGroupWidget = function(params) {
-  this.draw = function() {
-    this.ctx.save();
-    this.ctx.fillStyle="#ffffff";
-    this.ctx.fillRect(this.x0, this.y0, this.xF - this.x0, this.yF - this.y0);
-    this.ctx.strokeStyle="#aaaaaa";
-    this.ctx.beginPath();
-    this.ctx.moveTo(this.x0, this.y0);
-    this.ctx.lineTo(this.xF, this.y0);
-    this.ctx.stroke();
-    this.ctx.beginPath();
-    this.ctx.moveTo(this.x0, this.yF);
-    this.ctx.lineTo(this.xF, this.yF);
-    this.ctx.stroke();
-    this.ctx.restore();
-    return true;
-  };
-
-  this.createSpanWidget = function(node, indentLevel,
-      allowUpButton, allowDownButton) {
-    new htrace.SpanWidget({
-      manager: this.manager,
-      ctx: this.ctx,
-      span: node,
-      x0: this.x0,
-      xB: this.xB,
-      xD: this.xD,
-      xF: this.xF,
-      xT: this.childIndent * indentLevel,
-      y0: this.spanY,
-      yF: this.spanY + this.spanWidgetHeight,
-      allowUpButton: allowUpButton,
-      allowDownButton: allowDownButton,
-      begin: this.begin,
-      end: this.end
-    });
-    this.spanY += this.spanWidgetHeight;
-  }
-
-  this.handle = function(e) {
-    switch (e.type) {
-      case "draw":
-        this.draw();
-        return true;
-    }
-  }
-
-  for (var k in params) {
-    this[k]=params[k];
-  }
-  this.manager.register("draw", this);
-  this.spanY = this.y0 + 4;
-
-  // Figure out how much to indent each child's description text.
-  this.childIndent = Math.max(10, (this.xF - this.xD) / 50);
-
-  // Get the maximum depth of the parents tree to find out how far to indent.
-  var parentTreeHeight =
-      htrace.treeHeight(this.span, htrace.getReifiedParents);
-
-  console.log("parentTreeHeight = " + parentTreeHeight);
-  // Traverse the parents tree upwards.
-  var thisWidget = this;
-  htrace.treeTraverseDepthFirstPost(this.span, htrace.getReifiedParents, 0,
-      function(node, depth) {
-        if (depth > 0) {
-          thisWidget.createSpanWidget(node,
-              parentTreeHeight - depth, true, false);
-        }
-      });
-  thisWidget.createSpanWidget(this.span, parentTreeHeight, true, true);
-  // Traverse the children tree downwards.
-  htrace.treeTraverseDepthFirstPre(this.span, htrace.getReifiedChildren, 0,
-      function(node, depth) {
-        if (depth > 0) {
-          thisWidget.createSpanWidget(node,
-              parentTreeHeight + depth, false, true);
-        }
-      });
-  this.yF = this.spanY + 4;
-  console.log("SpanGroupWidget(this.span=" +
-      JSON.stringify(this.span.unparse()) +
-      ", x0=" + this.x0 + ", xB=" + this.xB +
-      ", xD=" + this.xD + ", xF=" + this.xF +
-      ", y0=" + this.y0 + ", yF=" + this.yF +
-      ")");
-  return this;
-};

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/span_widget.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/span_widget.js b/htrace-htraced/src/web/app/span_widget.js
deleted file mode 100644
index 0d18fef..0000000
--- a/htrace-htraced/src/web/app/span_widget.js
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-// Widget containing the trace span displayed on the canvas.
-htrace.SpanWidget = function(params) {
-  this.draw = function() {
-    this.drawBackground();
-    this.drawProcessId();
-    this.drawDescription();
-  };
-
-  // Draw the background of this span widget.
-  this.drawBackground = function() {
-    this.ctx.save();
-    if (this.span.get("selected")) {
-      this.ctx.fillStyle="#ffccff";
-    } else {
-      this.ctx.fillStyle="#ffffff";
-    }
-    this.ctx.fillRect(this.x0, this.y0, this.xSize, this.ySize);
-    this.ctx.restore();
-  }
-
-  // Draw process ID text.
-  this.drawProcessId = function() {
-    this.ctx.save();
-    this.ctx.fillStyle="#000000";
-    this.ctx.font = (this.ySize - 2) + "px sans-serif";
-    this.ctx.beginPath();
-    this.ctx.rect(this.x0, this.y0, this.xB - this.x0, this.ySize);
-    this.ctx.clip();
-    this.ctx.fillText(this.span.get('processId'), this.x0, this.yF - 4);
-    this.ctx.restore();
-  };
-
-  // Draw the span description
-  this.drawDescription = function() {
-    // Draw the light blue bar representing time.
-    this.ctx.save();
-    this.ctx.beginPath();
-    this.ctx.rect(this.xD, this.y0, this.xF - this.xD, this.ySize);
-    this.ctx.clip();
-    this.ctx.strokeStyle="#000000";
-    this.ctx.fillStyle="#a7b7ff";
-    var beginX = this.timeToPosition(this.span.get('begin'));
-    var endX = this.timeToPosition(this.span.get('end'));
-
-    // If the span is completely off the screen, draw a diamond at either the
-    // beginning or the end of the bar to indicate whether it's too early or too
-    // late to be seen.
-    if (endX < this.x0) {
-      beginX = this.xD;
-      endX = this.xD;
-    }
-    if (beginX > this.xF) {
-      beginX = this.xF;
-      endX = this.xF;
-    }
-
-    var gapY = 2;
-    var epsilon = Math.max(2, Math.floor(this.xSize / 1000));
-    if (endX - beginX < epsilon) {
-      // The time interval is too narrow to see.  Draw a diamond on the point instead.
-      this.ctx.beginPath();
-      this.ctx.moveTo(beginX, this.y0 + gapY);
-      this.ctx.lineTo(beginX + (Math.floor(this.ySize / 2) - gapY),
-          this.y0 + Math.floor(this.ySize / 2));
-      this.ctx.lineTo(beginX, this.yF - gapY);
-      this.ctx.lineTo(beginX - (Math.floor(this.ySize / 2) - gapY),
-          this.y0 + Math.floor(this.ySize / 2));
-      this.ctx.closePath();
-      this.ctx.fill();
-    } else {
-      // Draw a bar from the start time to the end time.
-//      console.log("beginX=" + beginX + ", endX=" + endX +
-//          ", begin=" + this.span.get('begin') + ", end=" + this.span.get('end'));
-      this.ctx.fillRect(beginX, this.y0 + gapY, endX - beginX,
-          this.ySize - (gapY * 2));
-    }
-
-    // Draw description text
-    this.ctx.fillStyle="#000000";
-    this.ctx.font = (this.ySize - gapY) + "px sans-serif";
-    this.ctx.fillText(this.span.get('description'),
-        this.xD + this.xT,
-        this.yF - gapY - 2);
-
-    this.ctx.restore();
-  };
-
-  // Convert a time in milliseconds since the epoch to an x position.
-  this.timeToPosition = function(time) {
-    return this.xD +
-      (((time - this.begin) * (this.xF - this.xD)) /
-        (this.end - this.begin));
-  };
-
-  this.fillSpanDetailsView = function() {
-    var info = {
-      spanID: this.span.get("spanID"),
-      begin: htrace.dateToString(parseInt(this.span.get("begin"), 10)),
-      end: htrace.dateToString(parseInt(this.span.get("end"), 10)),
-    };
-    var explicitOrder = {
-      spanId: -3,
-      begin: -2,
-      end: -1
-    };
-    keys = [];
-    for(k in this.span.attributes) {
-      if (k == "reifiedChildren") {
-        continue;
-      }
-      if (k == "reifiedParents") {
-        continue;
-      }
-      keys.push(k);
-      if (info[k] == null) {
-        info[k] = this.span.get(k);
-      }
-    }
-    // We sort the keys so that the stuff we want at the top appears at the top,
-    // and everything else is in alphabetical order.
-    keys = keys.sort(function(a, b) {
-        var oa = explicitOrder[a] || 0;
-        var ob = explicitOrder[b] || 0;
-        if (oa < ob) {
-          return -1;
-        } else if (oa > ob) {
-          return 1;
-        } else if (a < b) {
-          return -1;
-        } else if (a > b) {
-          return 1;
-        } else {
-          return 0;
-        }
-      });
-    var len = keys.length;
-    var h = '<table style="table-layout:fixed;width:100%;word-wrap:break-word">';
-    for (i = 0; i < len; i++) {
-      // Make every other row grey to improve visibility.
-      var colorString = ((i%2) == 1) ? "#f1f1f1" : "#ffffff";
-      h += _.template('<tr bgcolor="' + colorString + '">' +
-            '<td style="width:30%;word-wrap:break-word"><%- key %></td>' +
-            '<td style="width:70%;word-wrap:break-word"><%- val %></td>' +
-          "</tr>")({key: keys[i], val: info[keys[i]]});
-    }
-    h += '</table>';
-    $("#spanDetails").html(h);
-  };
-
-  this.handle = function(e) {
-    switch (e.type) {
-      case "mouseDown":
-        if (!htrace.inBoundingBox(e.x, e.y,
-              this.x0, this.xF, this.y0, this.yF)) {
-          return true;
-        }
-        this.manager.searchResultsView.applyToAllSpans(function(span) {
-            if (span.get("selected") == true) {
-              span.set("selected", false);
-            }
-          });
-        this.span.set("selected", true);
-        this.fillSpanDetailsView();
-        return true;
-      case "draw":
-        this.draw();
-        return true;
-    }
-  };
-
-  for (var k in params) {
-    this[k]=params[k];
-  }
-  this.xSize = this.xF - this.x0;
-  this.ySize = this.yF - this.y0;
-  this.xDB = this.xD - this.xB;
-  this.manager.register("draw", this);
-
-  var widget = this;
-  if ((this.span.get("reifiedParents") == null) && (this.allowUpButton)) {
-    new htrace.TriangleButton({
-      ctx: this.ctx,
-      manager: this.manager,
-      direction: "up",
-      x0: this.xB + 2,
-      xF: this.xB + (this.xDB / 2) - 2,
-      y0: this.y0 + 2,
-      yF: this.yF - 2,
-      callback: function() {
-        $.when(widget.span.reifyParents()).done(function (result) {
-          console.log("reifyParents: result was '" + result + "'");
-          widget.manager.searchResultsView.render();
-        });
-      },
-    });
-  }
-  if ((this.span.get("reifiedChildren") == null) && (this.allowDownButton)) {
-    new htrace.TriangleButton({
-      ctx: this.ctx,
-      manager: this.manager,
-      direction: "down",
-      x0: this.xB + (this.xDB / 2) + 2,
-      xF: this.xD - 2,
-      y0: this.y0 + 2,
-      yF: this.yF - 2,
-      callback: function() {
-        $.when(widget.span.reifyChildren()).done(function (result) {
-          console.log("reifyChildren: result was '" + result + "'");
-          widget.manager.searchResultsView.render();
-        });
-      },
-    });
-  }
-  this.manager.register("mouseDown", this);
-  return this;
-};

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/string.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/string.js b/htrace-htraced/src/web/app/string.js
deleted file mode 100644
index b0dfb74..0000000
--- a/htrace-htraced/src/web/app/string.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-// Parse an ISO8601 date string into a moment.js object.
-htrace.parseDate = function(val) {
-  if (val.match(/^[0-9]([0-9]*)$/)) {
-    // Treat an all-numeric field as UTC milliseconds since the epoch.
-    return moment.utc(parseInt(val, 10));
-  }
-  // Look for approved date formats.
-  var toTry = [
-    "YYYY-MM-DDTHH:mm:ss,SSS",
-    "YYYY-MM-DDTHH:mm:ss",
-    "YYYY-MM-DDTHH:mm",
-    "YYYY-MM-DD"
-  ];
-  for (var i = 0; i < toTry.length; i++) {
-    var m = moment.utc(val, toTry[i], true);
-    if (m.isValid()) {
-      return m;
-    }
-  }
-  throw "Please enter the date either as YYYY-MM-DDTHH:mm:ss,SSS " +
-      "in UTC, or as the number of milliseconds since the epoch.";
-};
-
-// Convert a moment.js moment into an ISO8601-style date string.
-htrace.dateToString = function(val) {
-  return moment.utc(val).format("YYYY-MM-DDTHH:mm:ss,SSS");
-};
-
-// Normalize a span ID into the format the server expects to see
-// (no leading 0x).
-htrace.normalizeSpanId = function(str) {
-  // Strip off the 0x prefix, if there is one.
-  if (str.indexOf("0x") == 0) {
-    str = str.substring(2);
-  }
-  if (str.length != 16) {
-    throw "The length of '" + str + "' was " + str.length +
-      ", but span IDs must be 16 characters long.";
-  }
-  if (str.search(/[^0-9a-fA-F]/) != -1) {
-    throw "Span IDs must contain only hexadecimal digits, but '" + str +
-      "' contained invalid characters.";
-  }
-  return str;
-};

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/time_cursor.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/time_cursor.js b/htrace-htraced/src/web/app/time_cursor.js
deleted file mode 100644
index 1caaa9a..0000000
--- a/htrace-htraced/src/web/app/time_cursor.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-// Draws a vertical bar selecting a time.
-htrace.TimeCursor = function(params) {
-  this.positionToTime = function(x) {
-    if ((x < this.x0) || (x > this.xF)) {
-      return -1;
-    }
-    return this.begin +
-      (((x - this.x0) * (this.end - this.begin)) / (this.xF - this.x0));
-  };
-
-  this.timeToPosition = function(time) {
-    return this.x0 + (((time - this.begin) *
-        (this.xF - this.x0)) / (this.end - this.begin));
-  };
-
-  this.draw = function() {
-    if (this.selectedTime != -1) {
-      this.ctx.save();
-      this.ctx.beginPath();
-      this.ctx.rect(this.x0, this.y0,
-          this.xF - this.x0, this.yF - this.y0);
-      this.ctx.clip();
-      this.ctx.strokeStyle="#ff0000";
-      var x = this.timeToPosition(this.selectedTime);
-      this.ctx.beginPath();
-      this.ctx.moveTo(x, this.y0);
-      this.ctx.lineTo(x, this.yF);
-      this.ctx.stroke();
-      this.ctx.restore();
-    }
-  };
-
-  this.handle = function(e) {
-    switch (e.type) {
-      case "mouseMove":
-        if (htrace.inBoundingBox(e.x, e.y,
-              this.x0, this.xF, this.y0, this.yF)) {
-          this.selectedTime = this.positionToTime(e.x);
-          if (this.selectedTime < 0) {
-            $(this.el).val("");
-          } else {
-            $(this.el).val(htrace.dateToString(this.selectedTime));
-          }
-          return true;
-        }
-        return true;
-      case "draw":
-        this.draw();
-        return true;
-    }
-  };
-
-  this.selectedTime = -1;
-  for (var k in params) {
-    this[k]=params[k];
-  }
-  this.manager.register("mouseMove", this);
-  this.manager.register("draw", this);
-  return this;
-};

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/tree.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/tree.js b/htrace-htraced/src/web/app/tree.js
deleted file mode 100644
index 046085c..0000000
--- a/htrace-htraced/src/web/app/tree.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-//
-// Get the height of a tree-- that is, the number of edges on the longest
-// downward path between the root and a leaf
-//
-htrace.treeHeight = function(node, getDescendants) {
-  var height = 0;
-  var descendants = getDescendants(node);
-  for (var i = 0; i < descendants.length; i++) {
-    height = Math.max(height,
-        1 + htrace.treeHeight(descendants[i], getDescendants));
-  }
-  return height;
-};
-
-//
-// Perform a depth-first, post-order traversal on the tree, invoking the
-// callback on every node with the node and depth as the arguments.
-//
-// Example:
-//     5
-//    / \
-//   3   4
-//  / \
-// 1   2
-//
-htrace.treeTraverseDepthFirstPost = function(node, getDescendants, depth, cb) {
-  var descendants = getDescendants(node);
-  for (var i = 0; i < descendants.length; i++) {
-    htrace.treeTraverseDepthFirstPost(descendants[i],
-        getDescendants, depth + 1, cb);
-  }
-  cb(node, depth);
-};
-
-//
-// Perform a depth-first, pre-order traversal on the tree, invoking the
-// callback on every node with the node and depth as the arguments.
-//
-// Example:
-//     1
-//    / \
-//   2   5
-//  / \
-// 3   4
-//
-htrace.treeTraverseDepthFirstPre = function(node, getDescendants, depth, cb) {
-  cb(node, depth);
-  var descendants = getDescendants(node);
-  for (var i = 0; i < descendants.length; i++) {
-    htrace.treeTraverseDepthFirstPre(descendants[i],
-        getDescendants, depth + 1, cb);
-  }
-};

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/triangle_button.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/triangle_button.js b/htrace-htraced/src/web/app/triangle_button.js
deleted file mode 100644
index f252476..0000000
--- a/htrace-htraced/src/web/app/triangle_button.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-// Triangle button widget.
-htrace.TriangleButton = function(params) {
-  this.fgColor = "#6600ff";
-  this.bgColor = "#ffffff";
-  this.selected = false;
-  this.direction = "down";
-
-  this.draw = function() {
-    this.ctx.save();
-    var fg = this.selected ? this.bgColor : this.fgColor;
-    var bg = this.selected ? this.fgColor : this.bgColor;
-    this.ctx.beginPath();
-    this.ctx.rect(this.x0, this.y0,
-        this.xF - this.x0, this.yF - this.y0);
-    this.ctx.clip();
-    this.ctx.fillStyle = bg;
-    this.ctx.strokeStyle = fg;
-    this.ctx.fillRect(this.x0, this.y0,
-        this.xF - this.x0, this.yF - this.y0);
-    this.ctx.lineWidth = 3;
-    this.ctx.strokeRect(this.x0, this.y0,
-        this.xF - this.x0, this.yF - this.y0);
-    var xPad = (this.xF - this.x0) / 5;
-    var yPad = (this.yF - this.y0) / 5;
-    this.ctx.fillStyle = fg;
-    this.ctx.strokeStyle = fg;
-    this.ctx.beginPath();
-    this.ctx.strokeStyle = fg;
-    if (this.direction === "up") {
-      this.ctx.moveTo(Math.floor(this.x0 + ((this.xF - this.x0) / 2)),
-          this.y0 + yPad);
-      this.ctx.lineTo(this.xF - xPad, this.yF - yPad);
-      this.ctx.lineTo(this.x0 + xPad, this.yF - yPad);
-    } else if (this.direction === "down") {
-      this.ctx.moveTo(this.x0 + xPad, this.y0 + yPad);
-      this.ctx.lineTo(this.xF - xPad, this.y0 + yPad);
-      this.ctx.lineTo(Math.floor(this.x0 + ((this.xF - this.x0) / 2)),
-          this.yF - yPad);
-    } else {
-      console.log("TriangleButton: unknown direction " + this.direction);
-    }
-    this.ctx.closePath();
-    this.ctx.fill();
-    this.ctx.restore();
-  };
-
-  this.handle = function(e) {
-    switch (e.type) {
-      case "mouseDown":
-        if (!htrace.inBoundingBox(e.x, e.y,
-              this.x0, this.xF, this.y0, this.yF)) {
-          return true;
-        }
-        this.manager.register("mouseUp", this);
-        this.manager.register("mouseMove", this);
-        this.manager.register("mouseOut", this);
-        this.selected = true;
-        return false;
-      case "mouseUp":
-        if (this.selected) {
-          this.callback();
-          this.selected = false;
-        }
-        this.manager.unregister("mouseUp", this);
-        this.manager.unregister("mouseMove", this);
-        this.manager.unregister("mouseOut", this);
-        return true;
-      case "mouseMove":
-        this.selected = htrace.inBoundingBox(e.x, e.y,
-                this.x0, this.xF, this.y0, this.yF);
-        return true;
-      case "mouseOut":
-        this.selected = false;
-        return true;
-      case "draw":
-        this.draw();
-        return true;
-    }
-  };
-
-  for (var k in params) {
-    this[k]=params[k];
-  }
-  this.manager.register("mouseDown", this);
-  this.manager.register("draw", this);
-  return this;
-};

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d0554d53/htrace-htraced/src/web/app/widget_manager.js
----------------------------------------------------------------------
diff --git a/htrace-htraced/src/web/app/widget_manager.js b/htrace-htraced/src/web/app/widget_manager.js
deleted file mode 100644
index 5f393b0..0000000
--- a/htrace-htraced/src/web/app/widget_manager.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var htrace = htrace || {};
-
-// Check if a point is inside a bounding box.
-htrace.inBoundingBox = function(x, y, x0, xF, y0, yF) {
-    return ((x >= x0) && (x <= xF) && (y >= y0) && (y <= yF));
-  }
-
-// Manages a set of widgets on the canvas.
-// Buttons and sliders are both widgets.
-htrace.WidgetManager = function(params) {
-  this.listeners = {
-    "mouseDown": [],
-    "mouseUp": [],
-    "mouseMove": [],
-    "mouseOut": [],
-    "draw": [],
-  };
-
-  this.register = function(type, widget) {
-    this.listeners[type].push(widget);
-  }
-
-  this.unregister = function(type, widget) {
-    this.listeners[type] = _.without(this.listeners[type], widget);
-  }
-
-  this.handle = function(e) {
-    // Make a copy of the listeners, in case the handling functions change the
-    // array.
-    var listeners = this.listeners[e.type].slice();
-    var len = listeners.length;
-    for (var i = 0; i < len; i++) {
-      if (!listeners[i].handle(e)) {
-        break;
-      }
-    }
-  };
-
-  for (var k in params) {
-    this[k]=params[k];
-  }
-  return this;
-};