You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@storm.apache.org by pt...@apache.org on 2014/10/07 21:26:50 UTC

[1/7] git commit: STORM-439: Replace purl.js with jquery url plugin to support special characters in topology names. BugFix: Remove double decoding from the ui server, currently the decoding happens as part of clout.core.clj and ui.core.clj. Removed the

Repository: storm
Updated Branches:
  refs/heads/master 1babd8313 -> 84afd4582


STORM-439: Replace purl.js with jquery url plugin to support special characters in topology names.
BugFix: Remove double decoding from the ui server, currently the decoding happens as part of clout.core.clj and ui.core.clj. Removed the decoding from ui.core.clj.
Encode all url components on server side. Added the encodedId as response param to ensure the url from client side uses encoded component but the user still sees unencoded value.


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

Branch: refs/heads/master
Commit: c0eec64c74a97ff8a1ba28488a5c2775f4f81bfd
Parents: 5ddf308
Author: Parth Brahmbhatt <br...@gmail.com>
Authored: Mon Aug 25 21:12:50 2014 -0700
Committer: Parth Brahmbhatt <br...@gmail.com>
Committed: Mon Aug 25 23:48:04 2014 -0700

----------------------------------------------------------------------
 storm-core/src/clj/backtype/storm/ui/core.clj   | 43 +++++++++++---------
 storm-core/src/ui/public/component.html         |  8 ++--
 storm-core/src/ui/public/js/script.js           |  3 +-
 storm-core/src/ui/public/js/url.min.js          |  1 +
 storm-core/src/ui/public/js/visualization.js    |  2 +-
 .../templates/component-page-template.html      |  6 +--
 .../public/templates/index-page-template.html   |  2 +-
 .../templates/topology-page-template.html       |  8 ++--
 storm-core/src/ui/public/topology.html          |  8 ++--
 storm-dist/binary/LICENSE                       |  7 ++++
 10 files changed, 50 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-core/src/clj/backtype/storm/ui/core.clj
----------------------------------------------------------------------
diff --git a/storm-core/src/clj/backtype/storm/ui/core.clj b/storm-core/src/clj/backtype/storm/ui/core.clj
index 9937607..8e9e0ef 100644
--- a/storm-core/src/clj/backtype/storm/ui/core.clj
+++ b/storm-core/src/clj/backtype/storm/ui/core.clj
@@ -424,7 +424,7 @@
                          (if bolt-summs
                            (mapfn bolt-summs)
                            (mapfn spout-summs)))
-                :link (url-format "/component.html?id=%s&topology_id=%s" id storm-id)
+                :link (url-format "/component.html?id=%s&topology_id=%s" (url-encode id) (url-encode storm-id))
                 :inputs (for [[global-stream-id group] inputs]
                           {:component (.get_componentId global-stream-id)
                            :stream (.get_streamId global-stream-id)
@@ -518,7 +518,9 @@
   ([summs]
    {"topologies"
     (for [^TopologySummary t summs]
-      {"id" (.get_id t)
+      {
+       "id" (.get_id t)
+       "encodedId" (url-encode (.get_id t))
        "name" (.get_name t)
        "status" (.get_status t)
        "uptime" (pretty-uptime-sec (.get_uptime_secs t))
@@ -550,6 +552,7 @@
               error-host (get-error-host last-error)
               error-port (get-error-port last-error error-host top-id) ]]
     {"spoutId" id
+     "encodedSpoutId" (url-encode id)
      "executors" (count summs)
      "tasks" (sum-tasks summs)
      "emitted" (get-in stats [:emitted window])
@@ -573,6 +576,7 @@
               error-host (get-error-host last-error)
               error-port (get-error-port last-error error-host top-id) ]]
     {"boltId" id
+     "encodedBoltId" (url-encode id)
      "executors" (count summs)
      "tasks" (sum-tasks summs)
      "emitted" (get-in stats [:emitted window])
@@ -594,6 +598,7 @@
         workers (set (for [^ExecutorSummary e executors]
                        [(.get_host e) (.get_port e)]))]
       {"id" (.get_id summ)
+       "encodedId" (url-encode (.get_id summ))
        "name" (.get_name summ)
        "status" (.get_status summ)
        "uptime" (pretty-uptime-sec (.get_uptime_secs summ))
@@ -671,6 +676,7 @@
                           swap-map-order
                           (get window)))]]
     {"id" (pretty-executor-info (.get_executor_info e))
+     "encodedId" (url-encode (pretty-executor-info (.get_executor_info e)))
      "uptime" (pretty-uptime-sec (.get_uptime_secs e))
      "host" (.get_host e)
      "port" (.get_port e)
@@ -747,6 +753,7 @@
             swap-map-order)]
     (for [[^GlobalStreamId s stats] stream-summary]
       {"component" (.get_componentId s)
+       "encodedComponent" (url-encode (.get_componentId s))
        "stream" (.get_streamId s)
        "executeLatency" (float-str (:execute-latencies stats))
        "processLatency" (float-str (:execute-latencies stats))
@@ -765,6 +772,7 @@
                           swap-map-order
                           (get window)))]]
     {"id" (pretty-executor-info (.get_executor_info e))
+     "encodedId" (url-encode (pretty-executor-info (.get_executor_info e)))
      "uptime" (pretty-uptime-sec (.get_uptime_secs e))
      "host" (.get_host e)
      "port" (.get_port e)
@@ -802,11 +810,13 @@
                      (= type :bolt) (bolt-stats window summ component summs include-sys?))
           errors (component-errors (get (.get_errors summ) component) topology-id)]
       (merge
-       {"id" component
+       { "id" component
+         "encodedId" (url-encode component)
          "name" (.get_name summ)
          "executors" (count summs)
          "tasks" (sum-tasks summs)
          "topologyId" topology-id
+         "encodedTopologyId" (url-encode topology-id)
          "window" window
          "componentType" (name type)
          "windowHint" (window-hint window)}
@@ -839,51 +849,44 @@
   (GET "/api/v1/topology/summary" [& m]
        (json-response (all-topologies-summary) (:callback m)))
   (GET  "/api/v1/topology/:id" [id & m]
-        (let [id (url-decode id)]
-          (json-response (topology-page id (:window m) (check-include-sys? (:sys m))) (:callback m))))
+          (json-response (topology-page id (:window m) (check-include-sys? (:sys m))) (:callback m)))
   (GET "/api/v1/topology/:id/visualization" [:as {:keys [cookies servlet-request]} id & m]
        (json-response (mk-visualization-data id (:window m) (check-include-sys? (:sys m))) (:callback m)))
   (GET "/api/v1/topology/:id/component/:component" [id component & m]
-       (let [id (url-decode id)
-             component (url-decode component)]
-         (json-response (component-page id component (:window m) (check-include-sys? (:sys m))) (:callback m))))
+        (json-response (component-page id component (:window m) (check-include-sys? (:sys m))) (:callback m)))
   (POST "/api/v1/topology/:id/activate" [id]
     (with-nimbus nimbus
-      (let [id (url-decode id)
-            tplg (.getTopologyInfo ^Nimbus$Client nimbus id)
+      (let [tplg (.getTopologyInfo ^Nimbus$Client nimbus id)
             name (.get_name tplg)]
         (.activate nimbus name)
         (log-message "Activating topology '" name "'")))
-    (resp/redirect (str "/api/v1/topology/" id)))
+    (resp/redirect (str "/api/v1/topology/" (url-encode id))))
 
   (POST "/api/v1/topology/:id/deactivate" [id]
     (with-nimbus nimbus
-      (let [id (url-decode id)
-            tplg (.getTopologyInfo ^Nimbus$Client nimbus id)
+      (let [tplg (.getTopologyInfo ^Nimbus$Client nimbus id)
             name (.get_name tplg)]
         (.deactivate nimbus name)
         (log-message "Deactivating topology '" name "'")))
-    (resp/redirect (str "/api/v1/topology/" id)))
+    (resp/redirect (str "/api/v1/topology/" (url-encode id))))
   (POST "/api/v1/topology/:id/rebalance/:wait-time" [id wait-time]
     (with-nimbus nimbus
-      (let [id (url-decode id)
-            tplg (.getTopologyInfo ^Nimbus$Client nimbus id)
+      (let [tplg (.getTopologyInfo ^Nimbus$Client nimbus id)
             name (.get_name tplg)
             options (RebalanceOptions.)]
         (.set_wait_secs options (Integer/parseInt wait-time))
         (.rebalance nimbus name options)
         (log-message "Rebalancing topology '" name "' with wait time: " wait-time " secs")))
-    (resp/redirect (str "/api/v1/topology/" id)))
+    (resp/redirect (str "/api/v1/topology/" (url-encode id))))
   (POST "/api/v1/topology/:id/kill/:wait-time" [id wait-time]
     (with-nimbus nimbus
-      (let [id (url-decode id)
-            tplg (.getTopologyInfo ^Nimbus$Client nimbus id)
+      (let [tplg (.getTopologyInfo ^Nimbus$Client nimbus id)
             name (.get_name tplg)
             options (KillOptions.)]
         (.set_wait_secs options (Integer/parseInt wait-time))
         (.killTopologyWithOpts nimbus name options)
         (log-message "Killing topology '" name "' with wait time: " wait-time " secs")))
-    (resp/redirect (str "/api/v1/topology/" id)))
+    (resp/redirect (str "/api/v1/topology/" (url-encode id))))
 
   (GET "/" [:as {cookies :cookies}]
        (resp/redirect "/index.html"))

http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-core/src/ui/public/component.html
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/component.html b/storm-core/src/ui/public/component.html
index c51806b..21a5e76 100644
--- a/storm-core/src/ui/public/component.html
+++ b/storm-core/src/ui/public/component.html
@@ -23,7 +23,7 @@
 <script src="/js/jquery.tablesorter.min.js" type="text/javascript"></script>
 <script src="/js/jquery.cookies.2.2.0.min.js" type="text/javascript"></script>
 <script src="/js/jquery.mustache.js" type="text/javascript"></script>
-<script src="/js/purl.js" type="text/javascript"></script>
+<script src="/js/url.min.js" type="text/javascript"></script>
 <script src="/js/bootstrap-twipsy.js" type="text/javascript"></script>
 <script src="/js/script.js" type="text/javascript"></script>
 <script src="/js/moment.min.js" type="text/javascript"></script>
@@ -47,9 +47,9 @@
 <p id="toggle-switch" style="display: block;" class="js-only"></p>
 <script>
 $(document).ready(function() {
-    var componentId = $.url().param("id");
-    var topologyId = $.url().param("topology_id");
-    var window = $.url().param("window");
+    var componentId = $.url("?id");
+    var topologyId = $.url("?topology_id");
+    var window = $.url("?window");
     var sys = $.cookies.get("sys") || "false";
     var url = "/api/v1/topology/"+topologyId+"/component/"+componentId+"?sys="+sys;
     if(window) url += "&window="+window;

http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-core/src/ui/public/js/script.js
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/js/script.js b/storm-core/src/ui/public/js/script.js
index 81c6c3a..5dd73f7 100644
--- a/storm-core/src/ui/public/js/script.js
+++ b/storm-core/src/ui/public/js/script.js
@@ -140,9 +140,10 @@ function renderToggleSys(div) {
     }
 }
 
-function topologyActionJson(id,name,status,msgTimeout) {
+function topologyActionJson(id, encodedId, name,status,msgTimeout) {
     var jsonData = {};
     jsonData["id"] = id;
+    jsonData["encodedId"] = encodedId;
     jsonData["name"] = name;
     jsonData["msgTimeout"] = msgTimeout;
     jsonData["activateStatus"] = (status === "ACTIVE") ? "disabled" : "enabled";

http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-core/src/ui/public/js/url.min.js
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/js/url.min.js b/storm-core/src/ui/public/js/url.min.js
new file mode 100755
index 0000000..8057e0a
--- /dev/null
+++ b/storm-core/src/ui/public/js/url.min.js
@@ -0,0 +1 @@
+/*! url - v1.8.6 - 2013-11-22 */window.url=function(){function a(a){return!isNaN(parseFloat(a))&&isFinite(a)}return function(b,c){var d=c||window.location.toString();if(!b)return d;b=b.toString(),"//"===d.substring(0,2)?d="http:"+d:1===d.split("://").length&&(d="http://"+d),c=d.split("/");var e={auth:""},f=c[2].split("@");1===f.length?f=f[0].split(":"):(e.auth=f[0],f=f[1].split(":")),e.protocol=c[0],e.hostname=f[0],e.port=f[1]||("https"===e.protocol.split(":")[0].toLowerCase()?"443":"80"),e.pathname=(c.length>3?"/":"")+c.slice(3,c.length).join("/").split("?")[0].split("#")[0];var g=e.pathname;"/"===g.charAt(g.length-1)&&(g=g.substring(0,g.length-1));var h=e.hostname,i=h.split("."),j=g.split("/");if("hostname"===b)return h;if("domain"===b)return/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/.test(h)?h:i.slice(-2).join(".");if("sub"===b)return i.slice(0,i.length-2).join(".");if("port"===b)return e.port;if("protocol"===b)retur
 n e.protocol.split(":")[0];if("auth"===b)return e.auth;if("user"===b)return e.auth.split(":")[0];if("pass"===b)return e.auth.split(":")[1]||"";if("path"===b)return e.pathname;if("."===b.charAt(0)){if(b=b.substring(1),a(b))return b=parseInt(b,10),i[0>b?i.length+b:b-1]||""}else{if(a(b))return b=parseInt(b,10),j[0>b?j.length+b:b]||"";if("file"===b)return j.slice(-1)[0];if("filename"===b)return j.slice(-1)[0].split(".")[0];if("fileext"===b)return j.slice(-1)[0].split(".")[1]||"";if("?"===b.charAt(0)||"#"===b.charAt(0)){var k=d,l=null;if("?"===b.charAt(0)?k=(k.split("?")[1]||"").split("#")[0]:"#"===b.charAt(0)&&(k=k.split("#")[1]||""),!b.charAt(1))return k;b=b.substring(1),k=k.split("&");for(var m=0,n=k.length;n>m;m++)if(l=k[m].split("="),l[0]===b)return l[1]||"";return null}}return""}}(),"undefined"!=typeof jQuery&&jQuery.extend({url:function(a,b){return window.url(a,b)}});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-core/src/ui/public/js/visualization.js
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/js/visualization.js b/storm-core/src/ui/public/js/visualization.js
index 357ff3c..6d00901 100644
--- a/storm-core/src/ui/public/js/visualization.js
+++ b/storm-core/src/ui/public/js/visualization.js
@@ -391,7 +391,7 @@ function show_visualization(sys) {
     var update_freq_ms = 10000;
     var update = function(should_rechoose){
         $.ajax({
-            url: "/api/v1/topology/"+$.url().param("id")+"/visualization",
+            url: "/api/v1/topology/"+$.url("?id")+"/visualization",
             success: function(data, status, jqXHR) {
                 topology_data = data;
                 update_data(topology_data, sys);

http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-core/src/ui/public/templates/component-page-template.html
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/templates/component-page-template.html b/storm-core/src/ui/public/templates/component-page-template.html
index b787eb7..f912bd3 100644
--- a/storm-core/src/ui/public/templates/component-page-template.html
+++ b/storm-core/src/ui/public/templates/component-page-template.html
@@ -20,7 +20,7 @@
 <tbody>
 <tr>
 <td>{{id}}</td>
-<td><a href="/topology.html?id={{topologyId}}">{{name}}</a></td>
+<td><a href="/topology.html?id={{encodedTopologyId}}">{{name}}</a></td>
 <td>{{executors}}</td>
 <td>{{tasks}}</td>
 </tbody>
@@ -32,7 +32,7 @@
 <tbody>
 {{#spoutSummary}}
 <tr>
-<td><a href="/component.html?id={{id}}&topology_id={{topologyId}}&window={{window}}">{{windowPretty}}</a></td>
+<td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
 <td>{{transferred}}</td>
 <td>{{emitted}}</td>
 <td>{{completeLatency}}</td>
@@ -86,7 +86,7 @@
 <tbody>
 {{#boltStats}}
 <tr>
-<td><a href="/component.html?id={{id}}&topology_id={{topologyId}}&window={{window}}">{{windowPretty}}</a></td>
+<td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
 <td>{{emitted}}</td>
 <td>{{transferred}}</td>
 <td>{{executeLatency}}</td>

http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-core/src/ui/public/templates/index-page-template.html
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/templates/index-page-template.html b/storm-core/src/ui/public/templates/index-page-template.html
index 45906e5..d0db1bf 100644
--- a/storm-core/src/ui/public/templates/index-page-template.html
+++ b/storm-core/src/ui/public/templates/index-page-template.html
@@ -36,7 +36,7 @@
 <tbody>
 {{#topologies}}
 <tr>
-  <td><a href="/topology.html?id={{id}}">{{name}}</a></td>
+  <td><a href="/topology.html?id={{encodedId}}">{{name}}</a></td>
   <td>{{id}}</td>
   <td>{{status}}</td>
   <td>{{uptime}}</td>

http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-core/src/ui/public/templates/topology-page-template.html
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/templates/topology-page-template.html b/storm-core/src/ui/public/templates/topology-page-template.html
index 2b93ed6..c5b3db0 100644
--- a/storm-core/src/ui/public/templates/topology-page-template.html
+++ b/storm-core/src/ui/public/templates/topology-page-template.html
@@ -37,7 +37,7 @@
     <tbody>
       {{#topologyStats}}
       <tr>
-        <td><a href="/topology.html?id={{id}}&window={{window}}">{{windowPretty}}</td>
+        <td><a href="/topology.html?id={{encodedId}}&window={{window}}">{{windowPretty}}</td>
         <td>{{emitted}}</td>
         <td>{{transferred}}</td>
         <td>{{completeLatency}}</td>
@@ -102,7 +102,7 @@
     <tbody>
       {{#spouts}}
       <tr>
-        <td><a href="/component.html?id={{spoutId}}&topology_id={{id}}">{{spoutId}}</a></td>
+        <td><a href="/component.html?id={{encodedSpoutId}}&topology_id={{encodedId}}">{{spoutId}}</a></td>
         <td>{{executors}}</td>
         <td>{{tasks}}</td>
         <td>{{emitted}}</td>
@@ -127,7 +127,7 @@
     <tbody>
       {{#bolts}}
       <tr>
-        <td><a href="/component.html?id={{boltId}}&topology_id={{id}}">{{boltId}}</a></td>
+        <td><a href="/component.html?id={{encodedBoltId}}&topology_id={{encodedId}}">{{boltId}}</a></td>
         <td>{{executors}}</td>
         <td>{{tasks}}</td>
         <td>{{emitted}}</td>
@@ -148,5 +148,5 @@
 </script>
 
 <script id="topology-actions-template" type="text/html">
-  <input {{activateStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'activate', false, 0)" type="button" value="Activate"><input {{deactivateStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'deactivate', false, 0)" type="button" value="Deactivate"><input {{rebalanceStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'rebalance', true, {{msgTimeout}})" type="button" value="Rebalance"><input {{killStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'kill', true, 30)" type="button" value="Kill">
+  <input {{activateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'activate', false, 0)" type="button" value="Activate"><input {{deactivateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'deactivate', false, 0)" type="button" value="Deactivate"><input {{rebalanceStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'rebalance', true, {{msgTimeout}})" type="button" value="Rebalance"><input {{killStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'kill', true, 30)" type="button" value="Kill">
 </script>

http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-core/src/ui/public/topology.html
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/topology.html b/storm-core/src/ui/public/topology.html
index 551e39f..e4da3c5 100644
--- a/storm-core/src/ui/public/topology.html
+++ b/storm-core/src/ui/public/topology.html
@@ -24,7 +24,7 @@
 <script src="/js/jquery.tablesorter.min.js" type="text/javascript"></script>
 <script src="/js/jquery.cookies.2.2.0.min.js" type="text/javascript"></script>
 <script src="/js/jquery.mustache.js" type="text/javascript"></script>
-<script src="/js/purl.js" type="text/javascript"></script>
+<script src="/js/url.min.js" type="text/javascript"></script>
 <script src="/js/bootstrap-twipsy.js" type="text/javascript"></script>
 <script src="/js/script.js" type="text/javascript"></script>
 <script src="/js/visualization.js" type="text/javascript"></script>
@@ -56,8 +56,8 @@
 </body>
 <script>
 $(document).ready(function() {
-    var topologyId = $.url().param("id");
-    var window = $.url().param("window");
+    var topologyId = $.url("?id");
+    var window = $.url("?window");
     var sys = $.cookies.get("sys") || "false";
     var url = "/api/v1/topology/"+topologyId+"?sys="+sys;
     if(window) url += "&window="+window;
@@ -80,7 +80,7 @@ $(document).ready(function() {
         var topologyActions = $("#topology-actions");
         var topologyVisualization = $("#topology-visualization")
         var formattedConfig = formatConfigData(response["configuration"]);
-        var buttonJsonData = topologyActionJson(response["id"],response["name"],response["status"],response["msgTimeout"]);
+        var buttonJsonData = topologyActionJson(response["id"],response["encodedId"],response["name"],response["status"],response["msgTimeout"]);
         $.get("/templates/topology-page-template.html", function(template) {
             topologySummary.append(Mustache.render($(template).filter("#topology-summary-template").html(),response));
             topologyActions.append(Mustache.render($(template).filter("#topology-actions-template").html(),buttonJsonData));

http://git-wip-us.apache.org/repos/asf/storm/blob/c0eec64c/storm-dist/binary/LICENSE
----------------------------------------------------------------------
diff --git a/storm-dist/binary/LICENSE b/storm-dist/binary/LICENSE
index f6dde01..4c8cc9a 100644
--- a/storm-dist/binary/LICENSE
+++ b/storm-dist/binary/LICENSE
@@ -420,6 +420,13 @@ Developed and maintanined by Mark Perkins, mark@allmarkedup.com
 Source repository: https://github.com/allmarkedup/jQuery-URL-Parser
 Licensed under an MIT-style license. See https://github.com/allmarkedup/jQuery-URL-Parser/blob/master/LICENSE for details.
 
+-----------------------------------------------------------------------
+
+For Jquery url plugin (storm-core/src/ui/public/js/url.min.js)
+
+Jquery Url (A Jquery plugin for URL parser) v1.8.6
+Source repository: https://github.com/websanova/js-url
+Licensed under an MIT-style license. Seehttps://github.com/websanova/js-url#license for details.
 
 -----------------------------------------------------------------------
 


[2/7] git commit: STORM-439: Replace purl.js with jquery url plugin to support special characters in topology names. BugFix: Remove double decoding from the ui server, currently the decoding happens as part of clout.core.clj and ui.core.clj. Removed the

Posted by pt...@apache.org.
STORM-439: Replace purl.js with jquery url plugin to support special characters in topology names.
BugFix: Remove double decoding from the ui server, currently the decoding happens as part of clout.core.clj and ui.core.clj. Removed the decoding from ui.core.clj.
Encode all url components on server side. Added the encodedId as response param to ensure the url from client side uses encoded component but the user still sees unencoded value.


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

Branch: refs/heads/master
Commit: cccd4a5336c230ef1fca3a6f23aa55aabc9428fe
Parents: c0eec64
Author: Parth Brahmbhatt <br...@gmail.com>
Authored: Mon Aug 25 21:12:50 2014 -0700
Committer: Parth Brahmbhatt <br...@gmail.com>
Committed: Tue Aug 26 10:18:58 2014 -0700

----------------------------------------------------------------------
 storm-core/src/clj/backtype/storm/ui/core.clj |   2 +-
 storm-core/src/ui/public/js/purl.js           | 267 ---------------------
 storm-dist/binary/LICENSE                     |   9 -
 3 files changed, 1 insertion(+), 277 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/cccd4a53/storm-core/src/clj/backtype/storm/ui/core.clj
----------------------------------------------------------------------
diff --git a/storm-core/src/clj/backtype/storm/ui/core.clj b/storm-core/src/clj/backtype/storm/ui/core.clj
index 8e9e0ef..6d0adfa 100644
--- a/storm-core/src/clj/backtype/storm/ui/core.clj
+++ b/storm-core/src/clj/backtype/storm/ui/core.clj
@@ -424,7 +424,7 @@
                          (if bolt-summs
                            (mapfn bolt-summs)
                            (mapfn spout-summs)))
-                :link (url-format "/component.html?id=%s&topology_id=%s" (url-encode id) (url-encode storm-id))
+                :link (url-format "/component.html?id=%s&topology_id=%s" id storm-id)
                 :inputs (for [[global-stream-id group] inputs]
                           {:component (.get_componentId global-stream-id)
                            :stream (.get_streamId global-stream-id)

http://git-wip-us.apache.org/repos/asf/storm/blob/cccd4a53/storm-core/src/ui/public/js/purl.js
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/js/purl.js b/storm-core/src/ui/public/js/purl.js
deleted file mode 100644
index b5799c6..0000000
--- a/storm-core/src/ui/public/js/purl.js
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Purl (A JavaScript URL parser) v2.3.1
- * Developed and maintanined by Mark Perkins, mark@allmarkedup.com
- * Source repository: https://github.com/allmarkedup/jQuery-URL-Parser
- * Licensed under an MIT-style license. See https://github.com/allmarkedup/jQuery-URL-Parser/blob/master/LICENSE for details.
- */
-
-;(function(factory) {
-    if (typeof define === 'function' && define.amd) {
-        define(factory);
-    } else {
-        window.purl = factory();
-    }
-})(function() {
-
-    var tag2attr = {
-            a       : 'href',
-            img     : 'src',
-            form    : 'action',
-            base    : 'href',
-            script  : 'src',
-            iframe  : 'src',
-            link    : 'href',
-            embed   : 'src',
-            object  : 'data'
-        },
-
-        key = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'fragment'], // keys available to query
-
-        aliases = { 'anchor' : 'fragment' }, // aliases for backwards compatability
-
-        parser = {
-            strict : /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,  //less intuitive, more accurate to the specs
-            loose :  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // more intuitive, fails on relative paths and deviates from specs
-        },
-
-        isint = /^[0-9]+$/;
-
-    function parseUri( url, strictMode ) {
-        var str = decodeURI( url ),
-        res   = parser[ strictMode || false ? 'strict' : 'loose' ].exec( str ),
-        uri = { attr : {}, param : {}, seg : {} },
-        i   = 14;
-
-        while ( i-- ) {
-            uri.attr[ key[i] ] = res[i] || '';
-        }
-
-        // build query and fragment parameters
-        uri.param['query'] = parseString(uri.attr['query']);
-        uri.param['fragment'] = parseString(uri.attr['fragment']);
-
-        // split path and fragement into segments
-        uri.seg['path'] = uri.attr.path.replace(/^\/+|\/+$/g,'').split('/');
-        uri.seg['fragment'] = uri.attr.fragment.replace(/^\/+|\/+$/g,'').split('/');
-
-        // compile a 'base' domain attribute
-        uri.attr['base'] = uri.attr.host ? (uri.attr.protocol ?  uri.attr.protocol+'://'+uri.attr.host : uri.attr.host) + (uri.attr.port ? ':'+uri.attr.port : '') : '';
-
-        return uri;
-    }
-
-    function getAttrName( elm ) {
-        var tn = elm.tagName;
-        if ( typeof tn !== 'undefined' ) return tag2attr[tn.toLowerCase()];
-        return tn;
-    }
-
-    function promote(parent, key) {
-        if (parent[key].length === 0) return parent[key] = {};
-        var t = {};
-        for (var i in parent[key]) t[i] = parent[key][i];
-        parent[key] = t;
-        return t;
-    }
-
-    function parse(parts, parent, key, val) {
-        var part = parts.shift();
-        if (!part) {
-            if (isArray(parent[key])) {
-                parent[key].push(val);
-            } else if ('object' == typeof parent[key]) {
-                parent[key] = val;
-            } else if ('undefined' == typeof parent[key]) {
-                parent[key] = val;
-            } else {
-                parent[key] = [parent[key], val];
-            }
-        } else {
-            var obj = parent[key] = parent[key] || [];
-            if (']' == part) {
-                if (isArray(obj)) {
-                    if ('' !== val) obj.push(val);
-                } else if ('object' == typeof obj) {
-                    obj[keys(obj).length] = val;
-                } else {
-                    obj = parent[key] = [parent[key], val];
-                }
-            } else if (~part.indexOf(']')) {
-                part = part.substr(0, part.length - 1);
-                if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
-                parse(parts, obj, part, val);
-                // key
-            } else {
-                if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
-                parse(parts, obj, part, val);
-            }
-        }
-    }
-
-    function merge(parent, key, val) {
-        if (~key.indexOf(']')) {
-            var parts = key.split('[');
-            parse(parts, parent, 'base', val);
-        } else {
-            if (!isint.test(key) && isArray(parent.base)) {
-                var t = {};
-                for (var k in parent.base) t[k] = parent.base[k];
-                parent.base = t;
-            }
-            if (key !== '') {
-                set(parent.base, key, val);
-            }
-        }
-        return parent;
-    }
-
-    function parseString(str) {
-        return reduce(String(str).split(/&|;/), function(ret, pair) {
-            try {
-                pair = decodeURIComponent(pair.replace(/\+/g, ' '));
-            } catch(e) {
-                // ignore
-            }
-            var eql = pair.indexOf('='),
-                brace = lastBraceInKey(pair),
-                key = pair.substr(0, brace || eql),
-                val = pair.substr(brace || eql, pair.length);
-
-            val = val.substr(val.indexOf('=') + 1, val.length);
-
-            if (key === '') {
-                key = pair;
-                val = '';
-            }
-
-            return merge(ret, key, val);
-        }, { base: {} }).base;
-    }
-
-    function set(obj, key, val) {
-        var v = obj[key];
-        if (typeof v === 'undefined') {
-            obj[key] = val;
-        } else if (isArray(v)) {
-            v.push(val);
-        } else {
-            obj[key] = [v, val];
-        }
-    }
-
-    function lastBraceInKey(str) {
-        var len = str.length,
-            brace,
-            c;
-        for (var i = 0; i < len; ++i) {
-            c = str[i];
-            if (']' == c) brace = false;
-            if ('[' == c) brace = true;
-            if ('=' == c && !brace) return i;
-        }
-    }
-
-    function reduce(obj, accumulator){
-        var i = 0,
-            l = obj.length >> 0,
-            curr = arguments[2];
-        while (i < l) {
-            if (i in obj) curr = accumulator.call(undefined, curr, obj[i], i, obj);
-            ++i;
-        }
-        return curr;
-    }
-
-    function isArray(vArg) {
-        return Object.prototype.toString.call(vArg) === "[object Array]";
-    }
-
-    function keys(obj) {
-        var key_array = [];
-        for ( var prop in obj ) {
-            if ( obj.hasOwnProperty(prop) ) key_array.push(prop);
-        }
-        return key_array;
-    }
-
-    function purl( url, strictMode ) {
-        if ( arguments.length === 1 && url === true ) {
-            strictMode = true;
-            url = undefined;
-        }
-        strictMode = strictMode || false;
-        url = url || window.location.toString();
-
-        return {
-
-            data : parseUri(url, strictMode),
-
-            // get various attributes from the URI
-            attr : function( attr ) {
-                attr = aliases[attr] || attr;
-                return typeof attr !== 'undefined' ? this.data.attr[attr] : this.data.attr;
-            },
-
-            // return query string parameters
-            param : function( param ) {
-                return typeof param !== 'undefined' ? this.data.param.query[param] : this.data.param.query;
-            },
-
-            // return fragment parameters
-            fparam : function( param ) {
-                return typeof param !== 'undefined' ? this.data.param.fragment[param] : this.data.param.fragment;
-            },
-
-            // return path segments
-            segment : function( seg ) {
-                if ( typeof seg === 'undefined' ) {
-                    return this.data.seg.path;
-                } else {
-                    seg = seg < 0 ? this.data.seg.path.length + seg : seg - 1; // negative segments count from the end
-                    return this.data.seg.path[seg];
-                }
-            },
-
-            // return fragment segments
-            fsegment : function( seg ) {
-                if ( typeof seg === 'undefined' ) {
-                    return this.data.seg.fragment;
-                } else {
-                    seg = seg < 0 ? this.data.seg.fragment.length + seg : seg - 1; // negative segments count from the end
-                    return this.data.seg.fragment[seg];
-                }
-            }
-
-        };
-
-    }
-    
-    purl.jQuery = function($){
-        if ($ != null) {
-            $.fn.url = function( strictMode ) {
-                var url = '';
-                if ( this.length ) {
-                    url = $(this).attr( getAttrName(this[0]) ) || '';
-                }
-                return purl( url, strictMode );
-            };
-
-            $.url = purl;
-        }
-    };
-
-    purl.jQuery(window.jQuery);
-
-    return purl;
-
-});

http://git-wip-us.apache.org/repos/asf/storm/blob/cccd4a53/storm-dist/binary/LICENSE
----------------------------------------------------------------------
diff --git a/storm-dist/binary/LICENSE b/storm-dist/binary/LICENSE
index 4c8cc9a..5ad9e5d 100644
--- a/storm-dist/binary/LICENSE
+++ b/storm-dist/binary/LICENSE
@@ -413,15 +413,6 @@ For Arbor Tween (storm-core/src/ui/public/js/arbor-tween.js)
 
 -----------------------------------------------------------------------
 
-For Purl (storm-core/src/ui/public/js/purl.js)
-
-Purl (A JavaScript URL parser) v2.3.1
-Developed and maintanined by Mark Perkins, mark@allmarkedup.com
-Source repository: https://github.com/allmarkedup/jQuery-URL-Parser
-Licensed under an MIT-style license. See https://github.com/allmarkedup/jQuery-URL-Parser/blob/master/LICENSE for details.
-
------------------------------------------------------------------------
-
 For Jquery url plugin (storm-core/src/ui/public/js/url.min.js)
 
 Jquery Url (A Jquery plugin for URL parser) v1.8.6


[4/7] git commit: Merge branch 'STORM-439' of github.com:Parth-Brahmbhatt/incubator-storm

Posted by pt...@apache.org.
Merge branch 'STORM-439' of github.com:Parth-Brahmbhatt/incubator-storm


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

Branch: refs/heads/master
Commit: dbd431f35e660631afee5f82b15f980e4216c7fd
Parents: 1babd83 55231b2
Author: P. Taylor Goetz <pt...@gmail.com>
Authored: Tue Oct 7 15:20:44 2014 -0400
Committer: P. Taylor Goetz <pt...@gmail.com>
Committed: Tue Oct 7 15:20:44 2014 -0400

----------------------------------------------------------------------
 storm-core/src/clj/backtype/storm/ui/core.clj   |  41 +--
 storm-core/src/ui/public/component.html         |   8 +-
 storm-core/src/ui/public/js/purl.js             | 267 -------------------
 storm-core/src/ui/public/js/script.js           |   3 +-
 storm-core/src/ui/public/js/url.min.js          |   1 +
 storm-core/src/ui/public/js/visualization.js    |   2 +-
 .../templates/component-page-template.html      |   6 +-
 .../public/templates/index-page-template.html   |   2 +-
 .../templates/topology-page-template.html       |  14 +-
 storm-core/src/ui/public/topology.html          |   8 +-
 storm-dist/binary/LICENSE                       |  10 +-
 11 files changed, 49 insertions(+), 313 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/dbd431f3/storm-core/src/ui/public/topology.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/topology.html
index 477d3b0,6940df4..a6598ef
--- a/storm-core/src/ui/public/topology.html
+++ b/storm-core/src/ui/public/topology.html
@@@ -59,13 -59,11 +59,13 @@@
  <script>
  $(document).ajaxStop($.unblockUI);
  $(document).ajaxStart(function(){
 -    $.blockUI({ message: '<img src="images/spinner.gif" /> <h3>Loading topology summary...</h3>'});
 +    if ($("#topology-visualization").children().size() == 0) {
 +        $.blockUI({ message: '<img src="images/spinner.gif" /> <h3>Loading topology summary...</h3>'});
 +    }
  });
  $(document).ready(function() {
-     var topologyId = $.url().param("id");
-     var window = $.url().param("window");
+     var topologyId = $.url("?id");
+     var window = $.url("?window");
      var sys = $.cookies.get("sys") || "false";
      var url = "/api/v1/topology/"+topologyId+"?sys="+sys;
      if(window) url += "&window="+window;


[5/7] git commit: update LICENSE to reflect removal of purl.js

Posted by pt...@apache.org.
update LICENSE to reflect removal of purl.js


Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/53245c25
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/53245c25
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/53245c25

Branch: refs/heads/master
Commit: 53245c25ffb7a41de76ebf5c0558286a04a47d35
Parents: dbd431f
Author: P. Taylor Goetz <pt...@gmail.com>
Authored: Tue Oct 7 15:24:09 2014 -0400
Committer: P. Taylor Goetz <pt...@gmail.com>
Committed: Tue Oct 7 15:24:09 2014 -0400

----------------------------------------------------------------------
 LICENSE | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/53245c25/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
index d15be6c..e30786b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -371,16 +371,6 @@ For Arbor Tween (storm-core/src/ui/public/js/arbor-tween.js)
 
 -----------------------------------------------------------------------
 
-For Purl (storm-core/src/ui/public/js/purl.js)
-
-Purl (A JavaScript URL parser) v2.3.1
-Developed and maintanined by Mark Perkins, mark@allmarkedup.com
-Source repository: https://github.com/allmarkedup/jQuery-URL-Parser
-Licensed under an MIT-style license. See https://github.com/allmarkedup/jQuery-URL-Parser/blob/master/LICENSE for details.
-
-
------------------------------------------------------------------------
-
 For mustache.js (storm-core/src/ui/public/js/jquery.mustache.js)
 
 The MIT License
@@ -433,8 +423,18 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
 
+
 -----------------------------------------------------------------------
 
+For Jquery url plugin (storm-core/src/ui/public/js/url.min.js)
+
+Jquery Url (A Jquery plugin for URL parser) v1.8.6
+Source repository: https://github.com/websanova/js-url
+Licensed under an MIT-style license. Seehttps://github.com/websanova/js-url#license for details.
+
+-----------------------------------------------------------------------
+
+
 For jquery.blockUI.min.js (storm-core/src/ui/public/js/jquery.blockUI.min.js)
 
 jQuery BlockUI; v20131009


[6/7] git commit: update changelog for STORM-439

Posted by pt...@apache.org.
update changelog for STORM-439


Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/88b85e63
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/88b85e63
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/88b85e63

Branch: refs/heads/master
Commit: 88b85e63913ff7b5a63533dd9fa7bedbe8df7f2a
Parents: 53245c2
Author: P. Taylor Goetz <pt...@gmail.com>
Authored: Tue Oct 7 15:25:44 2014 -0400
Committer: P. Taylor Goetz <pt...@gmail.com>
Committed: Tue Oct 7 15:25:44 2014 -0400

----------------------------------------------------------------------
 CHANGELOG.md | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/88b85e63/CHANGELOG.md
----------------------------------------------------------------------
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c2a9a70..8e46c64 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,5 @@
 ## 0.9.3-incubating
+ * STORM-439: Replace purl.js qith jquery URL plugin
  * STORM-499: Document and clean up shaded dependncy resolution with maven
  * STORM-210: Add storm-hbase module
  * STORM-507: Topology visualization should not block ui


[3/7] git commit: Merge remote-tracking branch 'upstream/master' into STORM-439

Posted by pt...@apache.org.
Merge remote-tracking branch 'upstream/master' into STORM-439

Conflicts:
	storm-core/src/ui/public/js/visualization.js
	storm-core/src/ui/public/templates/component-page-template.html
	storm-core/src/ui/public/templates/index-page-template.html
	storm-core/src/ui/public/templates/topology-page-template.html


Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/55231b27
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/55231b27
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/55231b27

Branch: refs/heads/master
Commit: 55231b27922a7cccf7592ebc82de37791a097a07
Parents: cccd4a5 b0974a3
Author: Parth Brahmbhatt <br...@gmail.com>
Authored: Wed Sep 24 13:43:09 2014 -0700
Committer: Parth Brahmbhatt <br...@gmail.com>
Committed: Wed Sep 24 13:43:09 2014 -0700

----------------------------------------------------------------------
 CHANGELOG.md                                    |  17 +
 DEVELOPER.md                                    |   2 +-
 LICENSE                                         |  25 +
 README.markdown                                 |   7 +-
 STORM-UI-REST-API.md                            |   4 +-
 dev-tools/jira-github-join.py                   |   2 +-
 .../multilang/resources/asyncSplitsentence.js   |  32 +
 .../multilang/resources/randomsentence.js       |  75 +++
 .../multilang/resources/splitsentence.js        |  26 +
 .../storm-starter/multilang/resources/storm.js  | 349 +++++++++++
 .../storm/starter/WordCountTopologyNode.java    | 121 ++++
 .../src/jvm/storm/kafka/KafkaUtils.java         |   5 +-
 .../src/jvm/storm/kafka/PartitionManager.java   |   5 +-
 pom.xml                                         |   2 +-
 storm-core/pom.xml                              |  53 +-
 .../src/clj/backtype/storm/daemon/common.clj    |   3 +
 .../src/clj/backtype/storm/daemon/nimbus.clj    |   4 +-
 storm-core/src/clj/backtype/storm/event.clj     |   3 +
 .../backtype/storm/scheduler/EvenScheduler.clj  |   2 +-
 storm-core/src/clj/backtype/storm/testing.clj   |   2 +-
 storm-core/src/clj/backtype/storm/util.clj      |   2 +-
 storm-core/src/dev/resources/storm.js           | 349 +++++++++++
 storm-core/src/dev/resources/tester_bolt.js     |  27 +
 storm-core/src/dev/resources/tester_spout.js    |  58 ++
 .../src/jvm/backtype/storm/StormSubmitter.java  |  16 +
 .../backtype/storm/messaging/netty/Client.java  |  27 +-
 .../StormBoundedExponentialBackoffRetry.java    |  74 +++
 .../src/jvm/backtype/storm/utils/Utils.java     |  30 +-
 storm-core/src/ui/public/component.html         |   6 +
 storm-core/src/ui/public/images/spinner.gif     | Bin 0 -> 23470 bytes
 storm-core/src/ui/public/index.html             |   6 +
 .../src/ui/public/js/jquery.blockUI.min.js      |   6 +
 storm-core/src/ui/public/js/script.js           |  11 +
 storm-core/src/ui/public/js/visualization.js    |  14 +-
 .../templates/component-page-template.html      | 593 ++++++++++++++-----
 .../public/templates/index-page-template.html   | 219 +++++--
 .../templates/topology-page-template.html       | 195 +++++-
 storm-core/src/ui/public/topology.html          |   6 +
 .../test/clj/backtype/storm/multilang_test.clj  |  55 +-
 .../test/clj/backtype/storm/scheduler_test.clj  |  21 +
 .../test/clj/backtype/storm/utils_test.clj      |   3 +-
 ...StormBoundedExponentialBackoffRetryTest.java | 101 ++++
 42 files changed, 2265 insertions(+), 293 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/component.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/component.html
index 21a5e76,6fa998f..fddb9ef
--- a/storm-core/src/ui/public/component.html
+++ b/storm-core/src/ui/public/component.html
@@@ -23,8 -24,9 +24,9 @@@
  <script src="/js/jquery.tablesorter.min.js" type="text/javascript"></script>
  <script src="/js/jquery.cookies.2.2.0.min.js" type="text/javascript"></script>
  <script src="/js/jquery.mustache.js" type="text/javascript"></script>
 -<script src="/js/purl.js" type="text/javascript"></script>
 +<script src="/js/url.min.js" type="text/javascript"></script>
  <script src="/js/bootstrap-twipsy.js" type="text/javascript"></script>
+ <script src="/js/jquery.blockUI.min.js" type="text/javascript"></script>
  <script src="/js/script.js" type="text/javascript"></script>
  <script src="/js/moment.min.js" type="text/javascript"></script>
  </head>
@@@ -46,10 -48,14 +48,14 @@@
  </div>
  <p id="toggle-switch" style="display: block;" class="js-only"></p>
  <script>
+ $(document).ajaxStop($.unblockUI);
+ $(document).ajaxStart(function(){
+     $.blockUI({ message: '<img src="images/spinner.gif" /> <h3>Loading component summary...</h3>'});
+ });
  $(document).ready(function() {
 -    var componentId = $.url().param("id");
 -    var topologyId = $.url().param("topology_id");
 -    var window = $.url().param("window");
 +    var componentId = $.url("?id");
 +    var topologyId = $.url("?topology_id");
 +    var window = $.url("?window");
      var sys = $.cookies.get("sys") || "false";
      var url = "/api/v1/topology/"+topologyId+"/component/"+componentId+"?sys="+sys;
      if(window) url += "&window="+window;

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/js/script.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/js/visualization.js
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/js/visualization.js
index 6d00901,7cec697..1e1c4d6
--- a/storm-core/src/ui/public/js/visualization.js
+++ b/storm-core/src/ui/public/js/visualization.js
@@@ -389,10 -389,11 +389,11 @@@ function show_visualization(sys) 
  
      should_update = true;
      var update_freq_ms = 10000;
-     var update = function(should_rechoose){
+     var update = function(should_rechoose) {
+       if(should_update) {
          $.ajax({
 -            url: "/api/v1/topology/" + $.url().param("id") + "/visualization",
 +            url: "/api/v1/topology/"+$.url("?id")+"/visualization",
-             success: function(data, status, jqXHR) {
+             success: function (data, status, jqXHR) {
                  topology_data = data;
                  update_data(topology_data, sys);
                  sys.renderer.signal_update();

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/templates/component-page-template.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/templates/component-page-template.html
index f912bd3,f718967..1e916e3
--- a/storm-core/src/ui/public/templates/component-page-template.html
+++ b/storm-core/src/ui/public/templates/component-page-template.html
@@@ -15,159 -15,474 +15,474 @@@
   limitations under the License.
  -->
  <script id="component-summary-template" type="text/html">
- <h2>Component summary</h2>
- <table><thead><tr><th><span class="tip right" title="The ID assigned to a the Component by the Topology.">Id</span></th><th><span class="tip above" title="The name given to the topology by when it was submitted. Click the name to view the Topology's information.">Topology</span></th><th><span class="tip above" title="Executors are threads in a Worker process.">Executors</span></th><th><span class="tip above" title="A Task is an instance of a Bolt or Spout. The number of Tasks is almost always equal to the number of Executors.">Tasks</span></th></tr></thead>
- <tbody>
- <tr>
- <td>{{id}}</td>
- <td><a href="/topology.html?id={{encodedTopologyId}}">{{name}}</a></td>
- <td>{{executors}}</td>
- <td>{{tasks}}</td>
- </tbody>
- </table>
+   <h2>Component summary</h2>
+   <table>
+     <thead>
+       <tr>
+         <th>
+           <span class="tip right" title="The ID assigned to a the Component by the Topology.">
+             Id
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="The name given to the topology by when it was submitted. Click the name to view the Topology's information.">
+             Topology
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="Executors are threads in a Worker process.">
+             Executors
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="A Task is an instance of a Bolt or Spout. The number of Tasks is almost always equal to the number of Executors.">
+             Tasks
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       <tr>
+         <td>{{id}}</td>
 -        <td><a href="/topology.html?id={{topologyId}}">{{name}}</a></td>
++        <td><a href="/topology.html?id={{encodedTopologyId}}">{{name}}</a></td>
+         <td>{{executors}}</td>
+         <td>{{tasks}}</td>
+     </tbody>
+   </table>
  </script>
  <script id="spout-stats-detail-template" type="text/html">
- <h2>Spout stats</h2>
- <table class="zebra-striped" id="spout-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The past period of time for which the statistics apply. Click on a value to set the window for this page.">Window</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span data-original-title="The number of Tuples emitted that sent to one or more bolts." class="tip above">Transferred</span></th><th class="header"><span class="tip above" title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done.">Complete latency (ms)</span></th><th class="header"><span class="tip above" title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done.">Acked</span></th><th class="header"><span data-original-title="The number of Tuple &quot;trees&quot; that were 
 explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#spoutSummary}}
- <tr>
- <td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
- <td>{{transferred}}</td>
- <td>{{emitted}}</td>
- <td>{{completeLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/spoutSummary}}
- </tbody>
- </table>
+   <h2>Spout stats</h2>
+   <table class="zebra-striped" id="spout-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The past period of time for which the statistics apply. Click on a value to set the window for this page.">
+             Window
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples emitted that sent to one or more bolts." class="tip above">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done.">
+             Complete latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done.">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuple &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#spoutSummary}}
+       <tr>
 -        <td><a href="/component.html?id={{id}}&topology_id={{topologyId}}&window={{window}}">{{windowPretty}}</a></td>
++        <td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
+         <td>{{transferred}}</td>
+         <td>{{emitted}}</td>
+         <td>{{completeLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/spoutSummary}}
+     </tbody>
+   </table>
  </script>
  <script id="output-stats-template" type="text/html">
- <h2>Output stats ({{windowHint}})</h2>
- <table class="zebra-striped" id="output-stats-table"><thead><tr><th class="header headerSortDown"><span data-original-title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given." class="tip right">Stream</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span data-original-title="The number of Tuples emitted that sent to one or more bolts." class="tip above">Transferred</span></th><th class="header"><span data-original-title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done." class="tip above">Complete latency (ms)</span></th><th class="header"><span data-original-title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done." class="tip above">Acked</span></th><th class="header"><span data-original-title="The number of Tupl
 e &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#outputStats}}
- <tr>
- <td>{{stream}}</td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- <td>{{completeLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/outputStats}}
- </tbody>
- </table>
+   <h2>Output stats ({{windowHint}})</h2>
+   <table class="zebra-striped" id="output-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span data-original-title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given." class="tip right">
+             Stream
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples emitted that sent to one or more bolts." class="tip above">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done." class="tip above">
+             Complete latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done." class="tip above">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuple &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#outputStats}}
+       <tr>
+         <td>{{stream}}</td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+         <td>{{completeLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/outputStats}}
+     </tbody>
+   </table>
  </script>
  <script id="executor-stats-template" type="text/html">
- <h2>Executors ({{windowHint}})</h2>
- <table class="zebra-striped" id="executor-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The unique executor ID.">Id</span></th><th class="header"><span class="tip right" title="The length of time an Executor (thread) has been alive.">Uptime</span></th><th class="header"><span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">Host</span></th><th class="header"><span data-original-title="The port number used by the Worker to which an Executor is assigned. Click on the port number to open the logviewer page for this Worker." class="tip above">Port</span></th><th class="header"><span data-original-title="The number of Tuples emitted." class="tip above">Emitted</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">Transferred</span></th><th class="header"><span class="tip abov
 e" title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done.">Complete latency (ms)</span></th><th class="header"><span class="tip above" title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done.">Acked</span></th><th class="header"><span data-original-title="The number of Tuple &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#executorStats}}
- <tr>
- <td>{{id}}</td>
- <td>{{uptime}}</td>
- <td>{{host}}</td>
- <td><a href="{{workerLogLink}}">{{port}}</a></td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- <td>{{completeLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/executorStats}}
- </tbody>
- </table>
+   <h2>Executors ({{windowHint}})</h2>
+   <table class="zebra-striped" id="executor-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The unique executor ID.">
+             Id
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip right" title="The length of time an Executor (thread) has been alive.">
+             Uptime
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">
+             Host
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The port number used by the Worker to which an Executor is assigned. Click on the port number to open the logviewer page for this Worker." class="tip above">
+             Port
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples emitted." class="tip above">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The average time a Tuple &quot;tree&quot; takes to be completely processed by the Topology. A value of 0 is expected if no acking is done.">
+             Complete latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuple &quot;trees&quot; successfully processed. A value of 0 is expected if no acking is done.">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuple &quot;trees&quot; that were explicitly failed or timed out before acking was completed. A value of 0 is expected if no acking is done." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#executorStats}}
+       <tr>
+         <td>{{id}}</td>
+         <td>{{uptime}}</td>
+         <td>{{host}}</td>
+         <td><a href="{{workerLogLink}}">{{port}}</a></td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+         <td>{{completeLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/executorStats}}
+     </tbody>
+   </table>
  </script>
  <script id="bolt-stats-template" type="text/html">
- <h2>Bolt stats</h2>
- <table class="zebra-striped" id="bolt-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The past period of time for which the statistics apply. Click on a value to set the window for this page.">Window</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">Transferred</span></th><th class="header"><span data-original-title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple." class="tip above">Execute latency (ms)</span></th><th class="header"><span class="tip above" title="The number of incoming Tuples processed.">Executed</span></th><th class="header"><span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple unt
 il a number of other Tuples have been received." class="tip above">Process latency (ms)</span></th><th class="header"><span data-original-title="The number of Tuples acknowledged by this Bolt." class="tip above">Acked</span></th><th class="header"><span data-original-title="The number of tuples Failed by this Bolt." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#boltStats}}
- <tr>
- <td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- <td>{{executeLatency}}</td>
- <td>{{executed}}</td>
- <td>{{processLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/boltStats}}
- </tbody>
- </table>
+   <h2>Bolt stats</h2>
+   <table class="zebra-striped" id="bolt-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The past period of time for which the statistics apply. Click on a value to set the window for this page.">
+             Window
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple." class="tip above">
+             Execute latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of incoming Tuples processed.">
+             Executed
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">
+             Process latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples acknowledged by this Bolt." class="tip above">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of tuples Failed by this Bolt." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#boltStats}}
+       <tr>
 -        <td><a href="/component.html?id={{id}}&topology_id={{topologyId}}&window={{window}}">{{windowPretty}}</a></td>
++        <td><a href="/component.html?id={{encodedId}}&topology_id={{encodedTopologyId}}&window={{window}}">{{windowPretty}}</a></td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+         <td>{{executeLatency}}</td>
+         <td>{{executed}}</td>
+         <td>{{processLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/boltStats}}
+     </tbody>
+   </table>
  </script>
  <script id="bolt-input-stats-template" type="text/html">
- <h2>Input stats ({{windowHint}})</h2>
- <table class="zebra-striped" id="bolt-input-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The ID assigned to a the Component by the Topology.">Component</span></th><th class="header"><span class="tip right" title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given.">Stream</span></th><th class="header"><span class="tip above" title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple.">Execute latency (ms)</span></th><th class="header"><span class="tip above" title="The number of incoming Tuples processed.">Executed</span></th><th class="header"><span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">Process latency (ms)</span></th><th class="header"><span class="t
 ip above" title="The number of Tuples acknowledged by this Bolt.">Acked</span></th><th class="header"><span data-original-title="The number of tuples Failed by this Bolt." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#inputStats}}
- <tr>
- <td>{{component}}</td>
- <td>{{stream}}</td>
- <td>{{executeLatency}}</td>
- <td>{{executed}}</td>
- <td>{{processLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/inputStats}}
- </tbody>
- </table>
+   <h2>Input stats ({{windowHint}})</h2>
+   <table class="zebra-striped" id="bolt-input-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The ID assigned to a the Component by the Topology.">
+             Component
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip right" title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given.">
+             Stream
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple.">
+             Execute latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of incoming Tuples processed.">
+             Executed
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">
+             Process latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples acknowledged by this Bolt.">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of tuples Failed by this Bolt." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#inputStats}}
+       <tr>
+         <td>{{component}}</td>
+         <td>{{stream}}</td>
+         <td>{{executeLatency}}</td>
+         <td>{{executed}}</td>
+         <td>{{processLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/inputStats}}
+     </tbody>
+   </table>
  </script>
  <script id="bolt-output-stats-template" type="text/html">
- <h2>Output stats ({{windowHint}})</h2>
- <table class="zebra-striped" id="bolt-output-stats-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given.">Stream</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">Transferred</span></th></tr></thead>
- <tbody>
- {{#outputStats}}
- <tr>
- <td>{{stream}}</td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- </tr>
- {{/outputStats}}
- </tbody>
- </table>
+   <h2>Output stats ({{windowHint}})</h2>
+   <table class="zebra-striped" id="bolt-output-stats-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The name of the Tuple stream given in the Topolgy, or &quot;default&quot; if none was given.">
+             Stream
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">
+             Transferred
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#outputStats}}
+       <tr>
+         <td>{{stream}}</td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+       </tr>
+       {{/outputStats}}
+     </tbody>
+   </table>
  </script>
  <script id="bolt-executor-template" type="text/html">
- <h2>Executors</h2>
- <table class="zebra-striped" id="bolt-executor-table"><thead><tr><th class="header headerSortDown"><span class="tip right" title="The unique executor ID.">Id</span></th><th class="header"><span data-original-title="The length of time an Executor (thread) has been alive." class="tip right">Uptime</span></th><th class="header"><span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">Host</span></th><th class="header"><span class="tip above" title="The port number used by the Worker to which an Executor is assigned. Click on the port number to open the logviewer page for this Worker.">Port</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted.">Emitted</span></th><th class="header"><span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">Transferred</span></th><th class="header"><span class="tip above" title="If th
 is is around 1.0, the corresponding Bolt is running as fast as it can, so you may want to increase the Bolt's parallelism. This is (number executed * average execute latency) / measurement time.">Capacity (last 10m)</span></th><th class="header"><span data-original-title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple." class="tip above">Execute latency (ms)</span></th><th class="header"><span class="tip above" title="The number of incoming Tuples processed.">Executed</span></th><th class="header"><span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">Process latency (ms)</span></th><th class="header"><span data-original-title="The number of Tuples acknowledged by this Bolt." class="tip above">Acked</span></th><th class="header"><span data-or
 iginal-title="The number of tuples Failed by this Bolt." class="tip left">Failed</span></th></tr></thead>
- <tbody>
- {{#executorStats}}
- <tr>
- <td>{{id}}}</td>
- <td>{{uptime}}</td>
- <td>{{host}}</td>
- <td><a href="{{workerLogLink}}">{{port}}</a></td>
- <td>{{emitted}}</td>
- <td>{{transferred}}</td>
- <td>{{capacity}}</td>
- <td>{{executeLatency}}</td>
- <td>{{executed}}</td>
- <td>{{processLatency}}</td>
- <td>{{acked}}</td>
- <td>{{failed}}</td>
- </tr>
- {{/executorStats}}
- </tbody>
- </table>
+   <h2>Executors</h2>
+   <table class="zebra-striped" id="bolt-executor-table">
+     <thead>
+       <tr>
+         <th class="header headerSortDown">
+           <span class="tip right" title="The unique executor ID.">
+             Id
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The length of time an Executor (thread) has been alive." class="tip right">
+             Uptime
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">
+             Host
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The port number used by the Worker to which an Executor is assigned. Click on the port number to open the logviewer page for this Worker.">
+             Port
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted.">
+             Emitted
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of Tuples emitted that sent to one or more bolts.">
+             Transferred
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="If this is around 1.0, the corresponding Bolt is running as fast as it can, so you may want to increase the Bolt's parallelism. This is (number executed * average execute latency) / measurement time.">
+             Capacity (last 10m)
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time a Tuple spends in the execute method. The execute method may complete without sending an Ack for the tuple." class="tip above">
+             Execute latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span class="tip above" title="The number of incoming Tuples processed.">
+             Executed
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The average time it takes to Ack a Tuple after it is first received.  Bolts that join, aggregate or batch may not Ack a tuple until a number of other Tuples have been received." class="tip above">
+             Process latency (ms)
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of Tuples acknowledged by this Bolt." class="tip above">
+             Acked
+           </span>
+         </th>
+         <th class="header">
+           <span data-original-title="The number of tuples Failed by this Bolt." class="tip left">
+             Failed
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#executorStats}}
+       <tr>
+         <td>{{id}}}</td>
+         <td>{{uptime}}</td>
+         <td>{{host}}</td>
+         <td><a href="{{workerLogLink}}">{{port}}</a></td>
+         <td>{{emitted}}</td>
+         <td>{{transferred}}</td>
+         <td>{{capacity}}</td>
+         <td>{{executeLatency}}</td>
+         <td>{{executed}}</td>
+         <td>{{processLatency}}</td>
+         <td>{{acked}}</td>
+         <td>{{failed}}</td>
+       </tr>
+       {{/executorStats}}
+     </tbody>
+   </table>
  </script>
  <script id="component-errors-template" type="text/html">
- <h2>Errors</h2>
- <table class="zebra-striped" id="component-errors-table"><thead><tr><th>Time</th><th>Error Host</th><th>Error Port</th><th>Error</th></tr></thead>
- <tbody>
- {{#componentErrors}}
- <tr>
- <td>{{time}}</td>
- <td>{{errorHost}}</td>
- <td><a href="{{errorWorkerLogLink}}">{{errorPort}}</a></td>
- <td>
-   <span id="{{errorLapsedSecs}}" class="errorSpan">{{error}}</span>
- </td>
- </tr>
- {{/componentErrors}}
- </tbody>
- </table>
+   <h2>Errors</h2>
+   <table class="zebra-striped" id="component-errors-table">
+     <thead>
+       <tr>
+         <th>Time</th>
+         <th>Error Host</th>
+         <th>Error Port</th>
+         <th>Error</th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#componentErrors}}
+       <tr>
+         <td>{{time}}</td>
+         <td>{{errorHost}}</td>
+         <td><a href="{{errorWorkerLogLink}}">{{errorPort}}</a></td>
+         <td>
+           <span id="{{errorLapsedSecs}}" class="errorSpan">{{error}}</span>
+         </td>
+       </tr>
+       {{/componentErrors}}
+     </tbody>
+   </table>
  </script>

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/templates/index-page-template.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/templates/index-page-template.html
index d0db1bf,d249fac..e3aab5e
--- a/storm-core/src/ui/public/templates/index-page-template.html
+++ b/storm-core/src/ui/public/templates/index-page-template.html
@@@ -31,36 -75,103 +75,103 @@@
  </table>
  </script>
  <script id="topology-summary-template" type="text/html">
- <table class="zebra-striped" id="topology-summary-table">
- <thead><tr><th><span class="tip right" title="The name given to the topology by when it was submitted. Click the name to view the Topology's information.">Name</span></th><th><span class="tip right" title="The unique ID given to a Topology each time it is launched.">Id</span></th><th><span class="tip above" title="The status can be one of ACTIVE, INACTIVE, KILLED, or REBALANCING.">Status</span></th><th><span class="tip above" title="The time since the Topology was submitted.">Uptime</span></th><th><span class="tip above" title="The number of Workers (processes).">Num workers</span></th><th><span class="tip above" title="Executors are threads in a Worker process.">Num executors</span></th><th><span class="tip above" title="A Task is an instance of a Bolt or Spout. The number of Tasks is almost always equal to the number of Executors.">Num tasks</span></th></tr></thead>
- <tbody>
- {{#topologies}}
- <tr>
-   <td><a href="/topology.html?id={{encodedId}}">{{name}}</a></td>
-   <td>{{id}}</td>
-   <td>{{status}}</td>
-   <td>{{uptime}}</td>
-   <td>{{workersTotal}}</td>
-   <td>{{executorsTotal}}</td>
-   <td>{{tasksTotal}}</td>
- </tr>
- {{/topologies}}
- </tbody>
- </table>
+   <table class="zebra-striped" id="topology-summary-table">
+     <thead>
+       <tr>
+         <th>
+           <span class="tip right" title="The name given to the topology by when it was submitted. Click the name to view the Topology's information.">
+             Name
+           </span>
+         </th>
+         <th>
+           <span class="tip right" title="The unique ID given to a Topology each time it is launched.">
+             Id
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="The status can be one of ACTIVE, INACTIVE, KILLED, or REBALANCING.">
+             Status
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="The time since the Topology was submitted.">
+             Uptime
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="The number of Workers (processes).">
+             Num workers
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="Executors are threads in a Worker process.">
+             Num executors
+           </span>
+         </th>
+         <th>
+           <span class="tip above" title="A Task is an instance of a Bolt or Spout. The number of Tasks is almost always equal to the number of Executors.">
+             Num tasks
+           </span>
+         </th>
+       </tr>
+     </thead>
+     <tbody>
+       {{#topologies}}
+       <tr>
 -        <td><a href="/topology.html?id={{id}}">{{name}}</a></td>
++        <td><a href="/topology.html?id={{encodedId}}">{{name}}</a></td>
+         <td>{{id}}</td>
+         <td>{{status}}</td>
+         <td>{{uptime}}</td>
+         <td>{{workersTotal}}</td>
+         <td>{{executorsTotal}}</td>
+         <td>{{tasksTotal}}</td>
+       </tr>
+       {{/topologies}}
+     </tbody>
+   </table>
  </script>
  <script id="supervisor-summary-template" type="text/html">
- <table class="zebra-striped" id="supervisor-summary-table"><thead><tr><th><span class="tip right" title="A unique identifier given to a Supervisor when it joins the cluster.">Id</span></th><th><span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">Host</span></th><th><span class="tip above" title="The length of time a Supervisor has been registered to the cluster.">Uptime</span></th><th><span class="tip above" title="Slots are Workers (processes).">Slots</span></th><th><span class="tip left" title="Slots are Workers (processes).">Used slots</span></th></tr></thead>
- <tbody>
- {{#supervisors}}
- <tr>
-   <td>{{id}}</td>
-   <td>{{host}}</td>
-   <td>{{uptime}}</td>
-   <td>{{slotsTotal}}</td>
-   <td>{{slotsUsed}}</td>
- </tr>
- {{/supervisors}}
- </tbody>
+ <table class="zebra-striped" id="supervisor-summary-table">
+   <thead>
+     <tr>
+       <th>
+         <span class="tip right" title="A unique identifier given to a Supervisor when it joins the cluster.">
+           Id
+         </span>
+       </th>
+       <th>
+         <span class="tip above" title="The hostname reported by the remote host. (Note that this hostname is not the result of a reverse lookup at the Nimbus node.)">
+           Host
+         </span>
+       </th>
+       <th>
+         <span class="tip above" title="The length of time a Supervisor has been registered to the cluster.">
+           Uptime
+         </span>
+       </th>
+       <th>
+         <span class="tip above" title="Slots are Workers (processes).">
+           Slots
+         </span>
+       </th>
+       <th>
+         <span class="tip left" title="Slots are Workers (processes).">
+           Used slots
+         </span>
+       </th>
+     </tr>
+   </thead>
+   <tbody>
+     {{#supervisors}}
+     <tr>
+       <td>{{id}}</td>
+       <td>{{host}}</td>
+       <td>{{uptime}}</td>
+       <td>{{slotsTotal}}</td>
+       <td>{{slotsUsed}}</td>
+     </tr>
+     {{/supervisors}}
+   </tbody>
  </table>
  </script>
  

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/templates/topology-page-template.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/templates/topology-page-template.html
index c5b3db0,b977071..3479fc1
--- a/storm-core/src/ui/public/templates/topology-page-template.html
+++ b/storm-core/src/ui/public/templates/topology-page-template.html
@@@ -148,5 -326,8 +326,8 @@@
  </script>
  
  <script id="topology-actions-template" type="text/html">
-   <input {{activateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'activate', false, 0)" type="button" value="Activate"><input {{deactivateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'deactivate', false, 0)" type="button" value="Deactivate"><input {{rebalanceStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'rebalance', true, {{msgTimeout}})" type="button" value="Rebalance"><input {{killStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'kill', true, 30)" type="button" value="Kill">
 -  <input {{activateStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'activate', false, 0)" type="button" value="Activate">
 -  <input {{deactivateStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'deactivate', false, 0)" type="button" value="Deactivate">
 -  <input {{rebalanceStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'rebalance', true, {{msgTimeout}})" type="button" value="Rebalance">
 -  <input {{killStatus}} onclick="confirmAction('{{id}}', '{{name}}', 'kill', true, 30)" type="button" value="Kill">
++  <input {{activateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'activate', false, 0)" type="button" value="Activate">
++  <input {{deactivateStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'deactivate', false, 0)" type="button" value="Deactivate">
++  <input {{rebalanceStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'rebalance', true, {{msgTimeout}})" type="button" value="Rebalance">
++  <input {{killStatus}} onclick="confirmAction('{{encodedId}}', '{{name}}', 'kill', true, 30)" type="button" value="Kill">
  </script>

http://git-wip-us.apache.org/repos/asf/storm/blob/55231b27/storm-core/src/ui/public/topology.html
----------------------------------------------------------------------
diff --cc storm-core/src/ui/public/topology.html
index e4da3c5,9d53144..6940df4
--- a/storm-core/src/ui/public/topology.html
+++ b/storm-core/src/ui/public/topology.html
@@@ -24,8 -25,9 +25,9 @@@
  <script src="/js/jquery.tablesorter.min.js" type="text/javascript"></script>
  <script src="/js/jquery.cookies.2.2.0.min.js" type="text/javascript"></script>
  <script src="/js/jquery.mustache.js" type="text/javascript"></script>
 -<script src="/js/purl.js" type="text/javascript"></script>
 +<script src="/js/url.min.js" type="text/javascript"></script>
  <script src="/js/bootstrap-twipsy.js" type="text/javascript"></script>
+ <script src="/js/jquery.blockUI.min.js" type="text/javascript"></script>
  <script src="/js/script.js" type="text/javascript"></script>
  <script src="/js/visualization.js" type="text/javascript"></script>
  <script src="/js/arbor.js" type="text/javascript"></script>
@@@ -55,9 -57,13 +57,13 @@@
  </div>
  </body>
  <script>
+ $(document).ajaxStop($.unblockUI);
+ $(document).ajaxStart(function(){
+     $.blockUI({ message: '<img src="images/spinner.gif" /> <h3>Loading topology summary...</h3>'});
+ });
  $(document).ready(function() {
 -    var topologyId = $.url().param("id");
 -    var window = $.url().param("window");
 +    var topologyId = $.url("?id");
 +    var window = $.url("?window");
      var sys = $.cookies.get("sys") || "false";
      var url = "/api/v1/topology/"+topologyId+"?sys="+sys;
      if(window) url += "&window="+window;


[7/7] git commit: remove 'incubating' from 0.9.3 release

Posted by pt...@apache.org.
remove 'incubating' from 0.9.3 release


Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/84afd458
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/84afd458
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/84afd458

Branch: refs/heads/master
Commit: 84afd4582bdf538975c40bd5f36c6b4f02c605c4
Parents: 88b85e6
Author: P. Taylor Goetz <pt...@gmail.com>
Authored: Tue Oct 7 15:26:35 2014 -0400
Committer: P. Taylor Goetz <pt...@gmail.com>
Committed: Tue Oct 7 15:26:35 2014 -0400

----------------------------------------------------------------------
 CHANGELOG.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/84afd458/CHANGELOG.md
----------------------------------------------------------------------
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8e46c64..9830e89 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-## 0.9.3-incubating
+## 0.9.3
  * STORM-439: Replace purl.js qith jquery URL plugin
  * STORM-499: Document and clean up shaded dependncy resolution with maven
  * STORM-210: Add storm-hbase module