You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ea...@apache.org on 2016/08/19 16:59:16 UTC

[09/11] qpid-dispatch git commit: DISPATCH-316 Hawtio and stand-alone consoles now use common code

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/d98ae37e/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js
----------------------------------------------------------------------
diff --git a/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js b/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js
deleted file mode 100644
index aad0cdf..0000000
--- a/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js
+++ /dev/null
@@ -1,1426 +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.
-*/
-/**
- * @module QDR
- */
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
-  /**
-   * @method OverviewController
-   * @param $scope
-   * @param QDRService
-   * @param QDRChartServer
-   * dialogServer
-   * $location
-   *
-   * Controller that handles the QDR overview page
-   */
-	QDR.module.controller("QDR.OverviewController", ['$scope', 'QDRService', '$location', 'localStorage', '$timeout', function($scope, QDRService, $location, localStorage, $timeout) {
-
-		console.log("QDR.OverviewControll started with location of " + $location.path() + " and connection of  " + QDRService.connected);
-		var columnStateKey = 'QDRColumnKey.';
-		var OverviewExpandedKey = "QDROverviewExpanded"
-		var OverviewActivatedKey = "QDROverviewActivated"
-
-		// we want attributes to be listed first, so add it at index 0
-		$scope.subLevelTabs = [{
-		    content: '<i class="icon-list"></i> Attributes',
-		    title: "View the attribute values on your selection",
-		    isValid: function (workspace) { return true; },
-		    href: function () { return "#/" + QDR.pluginName + "/attributes"; },
-		    index: 0
-		},
-		{
-		    content: '<i class="icon-leaf"></i> Operations',
-		    title: "Execute operations on your selection",
-		    isValid: function (workspace) { return true; },
-		    href: function () { return "#/" + QDR.pluginName + "/operations"; },
-		    index: 1
-		}]
-		$scope.activeTab = $scope.subLevelTabs[0];
-		$scope.setActive = function (nav) {
-			$scope.activeTab = nav;
-		}
-		$scope.isValid = function (nav) {
-			return nav.isValid()
-		}
-		$scope.isActive = function (nav) {
-			return nav == $scope.activeTab;
-		}
-		$scope.linkFields = []
-		$scope.link = null;
-		var refreshInterval = 5000
-	    $scope.modes = [
-	    	{title: 'Overview', name: 'Overview', right: false}
-	    	];
-
-		$scope.templates =
-		[     { name: 'Routers', url: 'routers.html'},
-		      { name: 'Router', url: 'router.html'},
-              { name: 'Addresses', url: 'addresses.html'},
-		      { name: 'Address', url: 'address.html'},
-              { name: 'Links', url: 'links.html'},
-		      { name: 'Link', url: 'link.html'},
-              { name: 'Connections', url: 'connections.html'},
-		      { name: 'Connection', url: 'connection.html'},
-              { name: 'Logs', url: 'logs.html'},
-              { name: 'Log', url: 'log.html'}
-        ];
-		var topLevelChildren = [];
-
-		$scope.allRouterSelected = function (row ) {
-			console.log("row selected" + row)
-		}
-		function afterSelectionChange(rowItem, checkAll) {
-			var nodeId = rowItem.entity.nodeId;
-			$("#overtree").dynatree("getTree").activateKey(nodeId);
-        }
-
-		$scope.allRouterFields = [];
-		$scope.allRouterSelections = [];
-		$scope.allRouters = {
-		    saveKey: 'allRouters',
-			data: 'allRouterFields',
-			columnDefs: [
-                 {
-                     field: 'routerId',
-                     saveKey: 'allRouters',
-                     displayName: 'Router'
-                 },
-                 {
-                     field: 'area',
-                     displayName: 'Area'
-                 },
-                 {
-                     field: 'mode',
-                     displayName: 'Mode'
-                 },
-                 {
-                     field: 'connections',
-                     displayName: 'External connections'
-                 },
-                 {
-                     field: 'addrCount',
-                     displayName: 'Address count'
-                 },
-                 {
-                     field: 'linkCount',
-                     displayName: 'Link count'
-                 }
-            ],
-			enableColumnResize: true,
-			multiSelect: false,
-			selectedItems: $scope.allRouterSelections,
-			afterSelectionChange: function(data) {
-				if (data.selected) {
-					var selItem = $scope.allRouterSelections[0]
-					var nodeId = selItem.nodeId
-					// activate Routers->nodeId in the tree
-					$("#overtree").dynatree("getTree").activateKey(nodeId);
-
-				}
-            }
-		};
-
-		// get info for all routers
-		var allRouterInfo = function () {
-			var nodeIds = QDRService.nodeIdList()
-			var expected = Object.keys(nodeIds).length
-			var received = 0;
-			var allRouterFields = [];
-			var gotNodeInfo = function (nodeName, entity, response) {
-				var results = response.results;
-				var name = QDRService.nameFromId(nodeName)
-				var connections = 0;
-				results.forEach( function (result) {
-					var role = QDRService.valFor(response.attributeNames, result, "role")
-					if (role != 'inter-router') {
-						++connections
-					}
-				})
-				allRouterFields.push({routerId: name, connections: connections, nodeId: nodeName})
-				++received
-				if (expected == received) {
-					allRouterFields.sort ( function (a,b) { return a.routerId < b.routerId ? -1 : a.routerId > b.routerId ? 1 : 0})
-					// now get each router's node info
-					QDRService.getMultipleNodeInfo(nodeIds, "router", [], function (nodeIds, entity, responses) {
-						for(var r in responses) {
-							var result = responses[r]
-							var routerId = QDRService.valFor(result.attributeNames, result.results[0], "routerId")
-							allRouterFields.some( function (connField) {
-								if (routerId === connField.routerId) {
-									result.attributeNames.forEach ( function (attrName) {
-										connField[attrName] = QDRService.valFor(result.attributeNames, result.results[0], attrName)
-									})
-									return true
-								}
-								return false
-							})
-						}
-						$scope.allRouterFields = allRouterFields
-					}, nodeIds[0], false)
-				}
-			}
-			nodeIds.forEach ( function (nodeId, i) {
-				QDRService.getNodeInfo(nodeId, ".connection", ["role"], gotNodeInfo)
-			})
-			loadColState($scope.allRouters)
-			updateRouterTree(nodeIds)
-		}
-
-		$scope.routerFields = []
-        $scope.routerGrid = {
-            saveKey: 'routerGrid',
-            data: 'routerFields',
-            columnDefs: [
-                 {
-                     field: 'attribute',
-                     displayName: 'Attribute',
-                     saveKey: 'routerGrid',
-                     width: '40%'
-                 },
-                 {
-                     field: 'value',
-                     displayName: 'Value',
-                     width: '40%'
-                 }
-            ],
-            enableColumnResize: true,
-            multiSelect: false
-        }
-
-		// get info for a single router
-		var routerInfo = function (node) {
-			$scope.router = node
-
-			$scope.routerFields = [];
-			$scope.allRouterFields.some( function (field) {
-				if (field.routerId === node.data.title) {
-					Object.keys(field).forEach ( function (key) {
-						if (key !== '$$hashKey')
-							$scope.routerFields.push({attribute: key, value: field[key]})
-					})
-					return true
-				}
-			})
-	        loadColState($scope.routerGrid);
-		}
-
-		$scope.addressesData = []
-		$scope.selectedAddresses = []
-		$scope.addressesGrid = {
-			saveKey: 'addressesGrid',
-			data: 'addressesData',
-			columnDefs: [
-                 {
-                     field: 'address',
-                    saveKey: 'addressesGrid',
-                     displayName: 'address'
-                 },
-                 {
-                     field: 'class',
-                     displayName: 'class'
-                 },
-                 {
-                     field: 'phase',
-                     displayName: 'phase',
-                     cellClass: 'grid-align-value'
-                 },
-                 {
-                     field: 'inproc',
-                     displayName: 'in-proc'
-                 },
-                 {
-                     field: 'local',
-                     displayName: 'local',
-                     cellClass: 'grid-align-value'
-                 },
-                 {
-                     field: 'remote',
-                     displayName: 'remote',
-                     cellClass: 'grid-align-value'
-                 },
-                 {
-                     field: 'in',
-                     displayName: 'in',
-                     cellClass: 'grid-align-value'
-                 },
-                 {
-                     field: 'out',
-                     displayName: 'out',
-                     cellClass: 'grid-align-value'
-                 }
-            ],
-			enableColumnResize: true,
-			multiSelect: false,
-			selectedItems: $scope.selectedAddresses,
-			afterSelectionChange: function(data) {
-				if (data.selected) {
-					var selItem = data.entity;
-					var nodeId = selItem.uid
-					$("#overtree").dynatree("getTree").activateKey(nodeId);
-				}
-            }
-		};
-
-		// get info for all addresses
-		var allAddressInfo = function () {
-			var gotAllAddressFields = function ( addressFields ) {
-				// update the grid's data
-				addressFields.sort ( function (a,b) { return a.address < b.address ? -1 : a.address > b.address ? 1 : 0})
-				addressFields[0].title = addressFields[0].address
-				for (var i=1; i<addressFields.length; ++i) {
-					if (addressFields[i].address === addressFields[i-1].address) {
-						addressFields[i-1].title = addressFields[i-1].address + " (" + addressFields[i-1]['class'] + ")"
-						addressFields[i].title = addressFields[i].address + " (" + addressFields[i]['class'] + ")"
-					} else
-						addressFields[i].title = addressFields[i].address
-				}
-				$scope.addressesData = addressFields
-
-				// repopulate the tree's child nodes
-				updateAddressTree(addressFields)
-			}
-			getAllAddressFields(gotAllAddressFields)
-	        loadColState($scope.addressesGrid);
-		}
-
-		var getAllAddressFields = function (callback) {
-			var nodeIds = QDRService.nodeIdList()
-			var addr_class = function (addr) {
-				if (!addr) return "-"
-		        if (addr[0] == 'M')  return "mobile"
-		        if (addr[0] == 'R')  return "router"
-		        if (addr[0] == 'A')  return "area"
-		        if (addr[0] == 'L')  return "local"
-		        if (addr[0] == 'C')  return "link-incoming"
-		        if (addr[0] == 'D')  return "link-outgoing"
-		        return "unknown: " + addr[0]
-			}
-
-			var addr_text = function (addr) {
-		        if (!addr)
-		            return "-"
-		        if (addr[0] == 'M')
-		            return addr.substring(2)
-		        else
-		            return addr.substring(1)
-			}
-
-			var addr_phase = function (addr) {
-		        if (!addr)
-		            return "-"
-		        if (addr[0] == 'M')
-		            return addr[1]
-		        return ''
-			}
-
-			var identity_clean = function (identity) {
-		        if (!identity)
-		            return "-"
-		        var pos = identity.indexOf('/')
-		        if (pos >= 0)
-		            return identity.substring(pos + 1)
-		        return identity
-			}
-
-			var addressFields = []
-			QDRService.getMultipleNodeInfo(nodeIds, "router.address", [], function (nodeIds, entity, response) {
-				response.aggregates.forEach( function (result) {
-					var prettySum = function (field) {
-						var fieldIndex = response.attributeNames.indexOf(field)
-						if (fieldIndex < 0) {
-							return "-"
-						}
-						var val = result[fieldIndex].sum
-						return QDRService.pretty(val)
-					}
-
-					var uid = QDRService.valFor(response.attributeNames, result, "identity").sum
-					var identity = identity_clean(uid)
-
-					addressFields.push({
-						address: addr_text(identity),
-						'class': addr_class(identity),
-						phase:   addr_phase(identity),
-						inproc:  prettySum("inProcess"),
-						local:   prettySum("subscriberCount"),
-						remote:  prettySum("remoteCount"),
-						'in':    prettySum("deliveriesIngress"),
-						out:     prettySum("deliveriesEgress"),
-						thru:    prettySum("deliveriesTransit"),
-						toproc:  prettySum("deliveriesToContainer"),
-						fromproc:prettySum("deliveriesFromContainer"),
-						uid:     uid
-					})
-				})
-				callback(addressFields)
-			}, nodeIds[0])
-		}
-
-		var updateLinkGrid = function ( linkFields ) {
-			$scope.linkFields = linkFields
-			// if we have a selected link
-			if ($scope.link) {
-				// find the selected link in the array of all links
-				var links = $scope.linkFields.filter(function (link) {
-					return link.name === $scope.link.data.fields.name;
-				})
-				if (links.length > 0) {
-					// linkInfo() is the function that is called by dynatree when a link is selected
-					// It is passed a dynatree node. We need to simulate that node type to update the link grid
-					linkInfo({data: {title: links[0].title, fields: links[0]}})
-				}
-			}
-		}
-
-		// get info for a all links
-		$scope.selectedLinks = []
-		$scope.linksGrid = {
-			saveKey: 'linksGrid',
-			data: 'linkFields',
-			columnDefs: [
-                 {
-                     field: 'link',
-                     displayName: 'Link',
-                     groupable:	false,
-                     saveKey: 'linksGrid',
-                     width: '12%'
-                 },
-                 {
-                     field: 'linkType',
-                     displayName: 'Link type',
-                     groupable:	false,
-                     width: '10%'
-                 },
-                 {
-                     field: 'linkDir',
-                     displayName: 'Link dir',
-                     groupable:	false,
-                     width: '8%'
-                 },
-                 {
-                     field: 'adminStatus',
-                     displayName: 'Admin status',
-                     groupable:	false,
-                     width: '10%'
-                 },
-                 {
-                     field: 'operStatus',
-                     displayName: 'Oper status',
-                     groupable:	false,
-                     width: '10%'
-                 },
-                 {
-                     field: 'deliveryCount',
-                     displayName: 'Delivery Count',
-                     groupable:	false,
-                     cellClass: 'grid-align-value',
-                     width: '12%'
-                 },
-                 {
-                     field: 'rate',
-                     displayName: 'Rate',
-                     groupable:	false,
-                     cellClass: 'grid-align-value',
-                     width: '8%'
-                 },
-                 {
-                     field: 'uncounts',
-                     displayName: 'Outstanding',
-                     groupable:	false,
-                     cellClass: 'grid-align-value',
-                     width: '10%'
-                 },
-                 {
-                     field: 'owningAddr',
-                     displayName: 'Address',
-                     groupable:	false,
-                     width: '20%'
-                 }
-            ],
-			enableColumnResize: true,
-			enableColumnReordering: true,
-			showColumnMenu: true,
-			rowTemplate: 'linkRowTemplate.html',
-			// aggregateTemplate: "linkAggTemplate.html",
-	        multiSelect: false,
-			selectedItems: $scope.selectedLinks,
-			afterSelectionChange: function(data) {
-				if (data.selected) {
-					var selItem = data.entity;
-					var nodeId = selItem.uid
-					$("#overtree").dynatree("getTree").activateKey(nodeId);
-				}
-            }
-		};
-
-
-		$scope.$on('ngGridEventColumns', function (e, columns) {
-			var saveInfo = columns.map( function (col) {
-				return [col.width, col.visible]
-			})
-			var saveKey = columns[0].colDef.saveKey
-			if (saveKey)
-                localStorage.setItem(columnStateKey+saveKey, JSON.stringify(saveInfo));
-        })
-
-        var loadColState = function (grid) {
-            if (!grid)
-                return;
-            var columns = localStorage.getItem(columnStateKey+grid.saveKey);
-            if (columns) {
-                var cols = JSON.parse(columns);
-                cols.forEach( function (col, index) {
-                    grid.columnDefs[index].width = col[0];
-                    grid.columnDefs[index].visible = col[1]
-                })
-            }
-        }
-		var allLinkInfo = function () {
-			getAllLinkFields([updateLinkGrid, updateLinkTree])
-	        loadColState($scope.linksGrid);
-		}
-
-		var getAllLinkFields = function (callbacks) {
-			var nodeIds = QDRService.nodeIdList()
-			var linkFields = []
-			var now = Date.now()
-			var rate = function (response, result) {
-				var name = QDRService.valFor(response.attributeNames, result, "linkName").sum
-				var oldname = $scope.linkFields.filter(function (link) {
-					return link.linkName === name
-				})
-				if (oldname.length > 0) {
-					var elapsed = (now - oldname[0].timestamp) / 1000;
-					var delivered = QDRService.valFor(response.attributeNames, result, "deliveryCount").sum - oldname[0].rawDeliveryCount
-					//QDR.log.debug("elapsed " + elapsed + " delivered " + delivered)
-					return elapsed > 0 ? parseFloat(Math.round((delivered/elapsed) * 100) / 100).toFixed(2) : 0;
-				} else {
-					//QDR.log.debug("unable to find old linkName")
-					return 0
-				}
-			}
-			QDRService.getMultipleNodeInfo(nodeIds, "router.link", [], function (nodeIds, entity, response) {
-				response.aggregates.forEach( function (result) {
-					var prettySum = function (field) {
-						var fieldIndex = response.attributeNames.indexOf(field)
-						if (fieldIndex < 0) {
-							return "-"
-						}
-						var val = result[fieldIndex].sum
-						return QDRService.pretty(val)
-					}
-					var uncounts = function () {
-						var und = QDRService.valFor(response.attributeNames, result, "undeliveredCount").sum
-						var uns = QDRService.valFor(response.attributeNames, result, "unsettledCount").sum
-						return und + uns
-					}
-					var nameIndex = response.attributeNames.indexOf('name')
-					var linkName = function () {
-						var details = result[nameIndex].detail
-						var names = []
-						details.forEach( function (detail) {
-							if (detail.node.endsWith(':'))
-								names.push(detail.node.slice(0, -1))
-							else
-								names.push(detail.node)
-						})
-						//var namestr = names.join('-')
-						var namestr = names.length > 0 ? names[0] : ""
-						return namestr + ':' + QDRService.valFor(response.attributeNames, result, "identity").sum
-					}
-					var fixAddress = function () {
-						var owningAddr = QDRService.valFor(response.attributeNames, result, "owningAddr").sum || ""
-						/*
-						     - "L*"  =>  "* (local)"
-						     - "M0*" =>  "* (direct)"
-						     - "M1*" =>  "* (dequeue)"
-						     - "MX*" =>  "* (phase X)"
-						*/
-						var address = undefined;
-						var starts = {'L': '(local)', 'M0': '(direct)', 'M1': '(dequeue)'}
-						for (var start in starts) {
-							if (owningAddr.startsWith(start)) {
-								var ends = owningAddr.substr(start.length)
-								address = ends + " " + starts[start]
-								break;
-							}
-						}
-						if (!address) {
-							// check for MX*
-							if (owningAddr.length > 3) {
-								if (owningAddr[0] === 'M') {
-									var phase = parseInt(owningAddress.substr(1))
-									if (phase && !isNaN(phase)) {
-										var phaseStr = phase + "";
-										var star = owningAddress.substr(2 + phaseStr.length)
-										address = star + " " + "(phase " + phaseStr + ")"
-									}
-								}
-							}
-						}
-						return address || owningAddr;
-					}
-
-					var adminStatus = QDRService.valFor(response.attributeNames, result, "adminStatus").sum
-					var operStatus = QDRService.valFor(response.attributeNames, result, "operStatus").sum
-					var linkName = linkName()
-					var linkType = QDRService.valFor(response.attributeNames, result, "linkType").sum
-					if ($scope.currentLinkFilter === "" || $scope.currentLinkFilter === linkType) {
-						linkFields.push({
-							link:       linkName,
-							title:      linkName,
-							uncounts:   uncounts(),
-							operStatus: operStatus,
-							adminStatus:adminStatus,
-							owningAddr: fixAddress(),
-							deliveryCount:prettySum("deliveryCount") + " ",
-							rawDeliveryCount: QDRService.valFor(response.attributeNames, result, "deliveryCount").sum,
-							name: QDRService.valFor(response.attributeNames, result, "name").sum,
-							linkName: QDRService.valFor(response.attributeNames, result, "linkName").sum,
-							capacity: QDRService.valFor(response.attributeNames, result, "capacity").sum,
-							connectionId: QDRService.valFor(response.attributeNames, result, "connectionId").sum,
-							linkDir: QDRService.valFor(response.attributeNames, result, "linkDir").sum,
-							linkType: linkType,
-							peer: QDRService.valFor(response.attributeNames, result, "peer").sum,
-							type: QDRService.valFor(response.attributeNames, result, "type").sum,
-							undeliveredCount: QDRService.valFor(response.attributeNames, result, "undeliveredCount").sum,
-							unsettledCount: QDRService.valFor(response.attributeNames, result, "unsettledCount").sum,
-							uid:     linkName,
-							timestamp: now,
-							rate: rate(response, result)
-						})
-					}
-				})
-				callbacks.forEach( function (cb) {
-					cb(linkFields)
-				})
-			}, nodeIds[0])
-		}
-
-		$scope.allConnectionFields = []
-		$scope.allConnectionSelections = [];
-		$scope.allConnectionGrid = {
-			saveKey: 'allConnGrid',
-            data: 'allConnectionFields',
-            columnDefs: [
-                 {
-                     field: 'host',
-                    saveKey: 'allConnGrid',
-                     displayName: 'host'
-                 },
-                 {
-                     field: 'container',
-                     displayName: 'container'
-                 },
-                 {
-                     field: 'role',
-                     displayName: 'role'
-                 },
-                 {
-                     field: 'dir',
-                     displayName: 'dir'
-                 },
-                 {
-                     field: 'security',
-                     displayName: 'security'
-                 },
-                 {
-                     field: 'authentication',
-                     displayName: 'authentication'
-                 }
-            ],
-            enableColumnResize: true,
-            multiSelect: false,
-            selectedItems: $scope.allConnectionSelections,
-            afterSelectionChange: function(data) {
-                if (data.selected) {
-                    var selItem = $scope.allConnectionSelections[0]
-                    var nodeId = selItem.host
-                    // activate Routers->nodeId in the tree
-                    $("#overtree").dynatree("getTree").activateKey(nodeId);
-                }
-            }
-        };
-		// get info for a all connections
-		var allConnectionInfo = function () {
-			var nodeIds = QDRService.nodeIdList()
-			updateConnectionTree(nodeIds)
-			$scope.allConnectionFields = [];;
-            var connectionNodes = $("#overtree").dynatree("getTree").getNodeByKey('Connections').getChildren()
-			connectionNodes.forEach( function (connection) {
-				$scope.allConnectionFields.push(connection.data.fields)
-			})
-	        loadColState($scope.allConnectionGrid);
-		}
-
-		$scope.addressFields = []
-		$scope.addressGrid = {
-			saveKey: 'addGrid',
-			data: 'addressFields',
-			columnDefs: [
-                 {
-                     field: 'attribute',
-                     displayName: 'Attribute',
-                     saveKey: 'addGrid',
-                     width: '40%'
-                 },
-                 {
-                     field: 'value',
-                     displayName: 'Value',
-                     width: '40%'
-                 }
-            ],
-			enableColumnResize: true,
-			multiSelect: false
-		}
-
-		// get info for a single address
-		var addressInfo = function (address) {
-			if (!address)
-				return;
-			$scope.address = address
-			$scope.addressFields = [];
-
-			var fields = Object.keys(address.data.fields)
-			fields.forEach( function (field) {
-				if (field != "title" && field != "uid")
-					$scope.addressFields.push({attribute: field, value: address.data.fields[field]})
-			})
-	        loadColState($scope.addressGrid);
-		}
-
-		$scope.singleLinkFields = []
-		$scope.linkGrid = {
-		    saveKey: 'linkGrid',
-			data: 'singleLinkFields',
-			columnDefs: [
-                 {
-                    field: 'attribute',
-                    displayName: 'Attribute',
-                     width: '40%'
-                 },
-                 {
-                    field: 'value',
-                    displayName: 'Value',
-                    width: '40%'
-                 }
-            ],
-			enableColumnResize: true,
-			multiSelect: false
-		}
-
-		// display the grid detail info for a single link
-		var linkInfo = function (link) {
-			if (!link)
-				return;
-			$scope.link = link
-
-			$scope.singleLinkFields = [];
-			var fields = Object.keys(link.data.fields)
-			var excludeFields = ["title", "uid", "uncounts", "rawDeliveryCount", "timestamp"]
-			fields.forEach( function (field) {
-				if (excludeFields.indexOf(field) == -1)
-					$scope.singleLinkFields.push({attribute: field, value: link.data.fields[field]})
-			})
-	        loadColState($scope.linkGrid);
-		}
-
-		// get info for a single connection
-		$scope.connectionModes = [{
-	        content: '<a><i class="icon-list"></i> Attriutes</a>',
-			id: 'attributes',
-			title: "View connection attributes",
-	        isValid: function () { return true; }
-	    },
-	    {
-	        content: '<a><i class="icon-link"></i> Links</a>',
-	        id: 'links',
-	        title: "Show links",
-	        isValid: function () { return true }
-	    }
-	    ];
-        $scope.currentMode = $scope.connectionModes[0];
-		$scope.isModeSelected = function (mode) {
-			return mode === $scope.currentMode;
-		}
-		$scope.connectionLinks = [];
-		var updateConnectionLinks = function () {
-			var n = $scope.connection.data.fields
-			var key = n.routerId
-			var nodeInfo = QDRService.topology.nodeInfo();
-			var links = nodeInfo[key]['.router.link'];
-			var linkTypeIndex = links.attributeNames.indexOf('linkType');
-			var connectionIdIndex = links.attributeNames.indexOf('connectionId');
-			$scope.connectionLinks = [];
-			links.results.forEach( function (link) {
-				if (link[linkTypeIndex] === 'endpoint' && link[connectionIdIndex] === n.identity) {
-					var l = {};
-					l.owningAddr = QDRService.valFor(links.attributeNames, link, 'owningAddr');
-					l.dir = QDRService.valFor(links.attributeNames, link, 'linkDir');
-					if (l.owningAddr && l.owningAddr.length > 2)
-						if (l.owningAddr[0] === 'M')
-							l.owningAddr = l.owningAddr.substr(2)
-						else
-							l.owningAddr = l.owningAddr.substr(1)
-
-					l.adminStatus = QDRService.valFor(links.attributeNames, link, 'adminStatus');
-					l.operStatus = QDRService.valFor(links.attributeNames, link, 'operStatus');
-					l.identity = QDRService.valFor(links.attributeNames, link, 'identity')
-					l.connectionId = QDRService.valFor(links.attributeNames, link, 'connectionId')
-/*
-						l.deliveryCount = QDRService.pretty(QDRService.valFor(links.attributeNames, link, 'deliveryCount'));
-						l.undeliveredCount = QDRService.pretty(QDRService.valFor(links.attributeNames, link, 'undeliveredCount'));
-						l.unsettledCount = QDRService.pretty(QDRService.valFor(links.attributeNames, link, 'unsettledCount'));
-*/
-					// ---------------------------------------------
-					// TODO: remove this fake quiescing/reviving logic when the routers do the work
-					if ($scope.quiesceState.linkStates[l.identity])
-						l.adminStatus = $scope.quiesceState.linkStates[l.identity];
-					if ($scope.quiesceState.operStates[l.identity])
-						l.operStatus = $scope.quiesceState.operStates[l.identity];
-					if ($scope.quiesceState.state == 'quiescing') {
-						if (l.adminStatus === 'enabled') {
-							var chance = Math.floor(Math.random() * 2);
-							if (chance == 1) {
-								l.adminStatus = 'disabled';
-								$scope.quiesceState.linkStates[l.identity] = 'disabled';
-								$scope.quiesceState.operStates[l.identity] = 'idle';
-							}
-						}
-					}
-					if ($scope.quiesceState.state == 'reviving') {
-						if (l.adminStatus === 'disabled') {
-							var chance = Math.floor(Math.random() * 2);
-							if (chance == 1) {
-								l.adminStatus = 'enabled';
-								$scope.quiesceState.linkStates[l.identity] = 'enabled';
-								$scope.quiesceState.operStates[l.identity] = 'up';
-							}
-						}
-					}
-					if ($scope.quiesceState.linkStates[l.identity] === 'disabled') {
-						l.unsettledCount = 0;
-						l.undeliveredCount = 0;
-						l.operState = 'idle'
-						$scope.quiesceState.operStates[l.identity] = l.operState
-					} else {
-						l.deliveryCount = QDRService.pretty(QDRService.valFor(links.attributeNames, link, 'deliveryCount'));
-						l.undeliveredCount = QDRService.pretty(QDRService.valFor(links.attributeNames, link, 'undeliveredCount'));
-						l.unsettledCount = QDRService.pretty(QDRService.valFor(links.attributeNames, link, 'unsettledCount'));
-						l.operState = 'up'
-						$scope.quiesceState.operStates[l.identity] = l.operState
-					}
-					// ---------------------------------------------
-
-					$scope.connectionLinks.push(l)
-				}
-			})
-			$scope.connectionLinksGrid.updateState()
-		}
-
-		$scope.selectMode = function (mode) {
-			$scope.currentMode = mode;
-			if (mode.id === 'links') {
-		        QDRService.addUpdatedAction("connectionLinks", updateConnectionLinks)
-				updateConnectionLinks();
-			} else {
-				QDRService.delUpdatedAction("connectionLinks");
-			}
-		}
-		$scope.isValid = function (mode) {
-			return mode.isValid()
-		}
-		$scope.quiesceState = {
-			state: 'enabled',
-			buttonText: 'Quiesce',
-			buttonDisabled: false,
-			linkStates: {},
-			operStates: {}
-		}
-		$scope.quiesceAllClicked = function () {
-			var state = $scope.quiesceState.state;
-			if (state === 'enabled') {
-				// start quiescing all links
-				$scope.quiesceState.state = 'quiescing';
-			} else if (state === 'quiesced') {
-				// start reviving all links
-				$scope.quiesceState.state = 'reviving';
-			}
-			$scope.connectionLinksGrid.updateState();
-		}
-		$scope.quiesceClass = function (row) {
-			var stateClassMap = {
-				enabled: 'btn-primary',
-				quiescing: 'btn-warning',
-				reviving: 'btn-warning',
-				quiesced: 'btn-danger'
-			}
-			return stateClassMap[$scope.quiesceState.state];
-		}
-		$scope.quiesceLinkClass = function (row) {
-			var stateClassMap = {
-				enabled: 'btn-primary',
-				disabled: 'btn-danger'
-			}
-			return stateClassMap[row.entity.adminStatus]
-		}
-		$scope.quiesceLink = function (row) {
-			var state = row.entity.adminStatus === 'enabled' ? 'disabled' : 'enabled';
-			var operState = state === 'enabled' ? 'up' : 'idle';
-			$scope.quiesceState.linkStates[row.entity.identity] = state;
-			$scope.quiesceState.operStates[row.entity.identity] = operState;
-		}
-		$scope.quiesceLinkDisabled = function (row) {
-			return false;
-		}
-		$scope.quiesceLinkText = function (row) {
-			return row.entity.adminStatus === 'disabled' ? "Revive" : "Quiesce";
-		}
-		$scope.quiesceHide = function () {
-			return $scope.connectionLinks.length == 0;
-		}
-		$scope.connectionLinksGrid = {
-		    saveKey: 'connLinksGrid',
-
-			data: 'connectionLinks',
-			updateState: function () {
-				var state = $scope.quiesceState.state;
-
-				// count enabled and disabled links for this connection
-				var enabled = 0, disabled = 0;
-				$scope.connectionLinks.forEach ( function (link) {
-					if (link.adminStatus === 'enabled')
-						++enabled;
-					if (link.adminStatus === 'disabled')
-						++disabled;
-				})
-
-				var linkCount = $scope.connectionLinks.length;
-				if (linkCount == 0) {
-					$scope.quiesceState.buttonText = 'Quiesce';
-					$scope.quiesceState.buttonDisabled = false;
-					$scope.quiesceState.state = 'enabled'
-					return;
-				}
-				// if state is quiescing and any links are enabled, button should say 'Quiescing' and be disabled
-				if (state === 'quiescing' && (enabled > 0)) {
-					$scope.quiesceState.buttonText = 'Quiescing';
-					$scope.quiesceState.buttonDisabled = true;
-				} else
-				// if state is enabled and all links are disabled, button should say Revive and be enabled. set state to quisced
-				// if state is quiescing and all links are disabled, button should say 'Revive' and be enabled. set state to quiesced
-				if ((state === 'quiescing' || state === 'enabled') && (disabled === linkCount)) {
-					$scope.quiesceState.buttonText = 'Revive';
-					$scope.quiesceState.buttonDisabled = false;
-					$scope.quiesceState.state = 'quiesced'
-				} else
-				// if state is reviving and any links are disabled, button should say 'Reviving' and be disabled
-				if (state === 'reviving' && (disabled > 0)) {
-					$scope.quiesceState.buttonText = 'Reviving';
-					$scope.quiesceState.buttonDisabled = true;
-				} else
-				// if state is reviving or quiesced and all links are enabled, button should say 'Quiesce' and be enabled. set state to enabled
-				if ((state === 'reviving' || state === 'quiesced') && (enabled === linkCount)) {
-					$scope.quiesceState.buttonText = 'Quiesce';
-					$scope.quiesceState.buttonDisabled = false;
-					$scope.quiesceState.state = 'enabled'
-				}
-
-				if ($scope.quiesceState.state === 'quiesced') {
-					d3.selectAll('.external.connection.dynatree-active')
-						.classed('quiesced', true)
-				} else {
-					d3.selectAll('.external.connection.dynatree-active.quiesced')
-						.classed('quiesced', false)
-				}
-			},
-            columnDefs: [
-			{
-				field: 'adminStatus',
-                cellTemplate: "titleCellTemplate.html",
-				headerCellTemplate: 'titleHeaderCellTemplate.html',
-			    saveKey: 'connLinksGrid',
-				displayName: 'Admin state'
-			},
-			{
-				field: 'operStatus',
-                cellTemplate: "titleCellTemplate.html",
-				headerCellTemplate: 'titleHeaderCellTemplate.html',
-				displayName: 'Oper state'
-			},
-			{
-				field: 'dir',
-                cellTemplate: "titleCellTemplate.html",
-				headerCellTemplate: 'titleHeaderCellTemplate.html',
-				displayName: 'dir'
-			},
-			{
-				field: 'owningAddr',
-                cellTemplate: "titleCellTemplate.html",
-				headerCellTemplate: 'titleHeaderCellTemplate.html',
-				displayName: 'Address'
-			},
-			{
-				field: 'deliveryCount',
-				displayName: 'Delivered',
-				headerCellTemplate: 'titleHeaderCellTemplate.html',
-				cellClass: 'grid-values'
-
-			},
-			{
-				field: 'undeliveredCount',
-				displayName: 'Undelivered',
-				headerCellTemplate: 'titleHeaderCellTemplate.html',
-				cellClass: 'grid-values'
-			},
-			{
-				field: 'unsettledCount',
-				displayName: 'Unsettled',
-				headerCellTemplate: 'titleHeaderCellTemplate.html',
-				cellClass: 'grid-values'
-			}/*,
-			{
-				cellClass: 'gridCellButton',
-				cellTemplate: '<button title="{{quiesceLinkText(row)}} this link" type="button" ng-class="quiesceLinkClass(row)" class="btn" ng-click="quiesceLink(row)" ng-disabled="quiesceLinkDisabled(row)">{{quiesceLinkText(row)}}</button>'
-			}*/
-			]
-		}
-
-		$scope.connectionFields = []
-		$scope.connectionGrid = {
-		    saveKey: 'connGrid',
-			data: 'connectionFields',
-			columnDefs: [
-                 {
-                     field: 'attribute',
-                     displayName: 'Attribute',
-                    saveKey: 'connGrid',
-                     width: '40%'
-                 },
-                 {
-                     field: 'value',
-                     displayName: 'Value',
-                     width: '40%'
-                 }
-            ],
-			enableColumnResize: true,
-			multiSelect: false
-		}
-
-		var connectionInfo = function (connection) {
-			$scope.connection = connection
-
-			$scope.connectionFields = [];
-			var fields = Object.keys(connection.data.fields)
-			fields.forEach( function (field) {
-				$scope.connectionFields.push({attribute: field, value: connection.data.fields[field]})
-			})
-			$scope.selectMode($scope.currentMode)
-	        loadColState($scope.connectionGrid);
-		}
-
-		// get info for a all logs
-		var allLogInfo = function () {
-		}
-
-		// get info for a single log
-		var logInfo = function (node) {
-			$scope.log = node
-		}
-
-		var getExpandedList = function () {
-			var list = [];
-			var tree = $("#overtree").dynatree("getRoot");
-			if (tree.length !== 0) {
-				tree.visit(function(node){
-	                if (node.isExpanded()) {
-	                    list.push(node.data.parent)
-	                }
-	            });
-			}
-			return list;
-		}
-
-		var updateExpanded = function () {
-			var tree = $("#overtree").dynatree("getRoot");
-			if (tree.length !== 0) {
-				tree.visit(function(node){
-	                if (node.isExpanded() || node.isActive()) {
-	                    node.data.info(node)
-	                }
-	            });
-			}
-		}
-
-		// loads the tree node name that was last selected
-		var loadActivatedNode = function () {
-			return localStorage[OverviewActivatedKey] || 'Routers'
-		}
-		// saved the tree node name that is currently selected
-		var saveActivated = function (key) {
-			localStorage[OverviewActivatedKey] = key;
-			lastKey = key;
-		}
-		// loads list that was saved
-		var loadExpandedNodeList = function () {
-			return angular.fromJson(localStorage[OverviewExpandedKey]) || [];
-		}
-		// called when a node is expanded
-		// here we save the expanded node so it can be restored when the page reloads
-		var saveExpanded = function () {
-			var list = getExpandedList();
-			localStorage[OverviewExpandedKey] = JSON.stringify(list)
-		}
-
-		// activated is called each time a tree node is clicked
-		// based on which node is clicked, load the correct data grid template and start getting the data
-		var activated = function (node) {
-			//QDR.log.debug("node activated: " + node.data.title)
-			var type = node.data.type;
-			saveExpanded()
-			saveActivated(node.data.key)
-
-			var template = $scope.templates.filter( function (tpl) {
-				return tpl.name == type;
-			})
-			$scope.template = template[0];
-			// the nodes info function will fetch the grids data
-			if (node.data.info) {
-				$timeout(function () {node.data.info(node)})
-			}
-
-		}
-        $scope.template = {url: ''};
-
-		if (!QDRService.connected) {
-			QDRService.redirectWhenConnected("overview")
-			return;
-		}
-
-		// we are currently connected. setup a handler to get notified if we are ever disconnected
-		QDRService.addDisconnectAction( function () {
-			QDRService.redirectWhenConnected("overview")
-			$scope.$apply();
-		})
-
-	/* --------------------------------------------------
-	 *
-     * setup the tree on the left
-     *
-     * -------------------------------------------------
-     */
-		// utility function called by each top level tree node when it needs to populate its child nodes
-		var updateLeaves = function (leaves, parentKey, parentFolder, worker) {
-			var scrollTree = $('.qdr-overview.pane.left .pane-viewport')
-			var scrollTop = scrollTree.scrollTop();
-			var tree = $("#overtree").dynatree("getTree")
-			var parentNode = tree.count ? tree.getNodeByKey(parentKey) : null;
-			// if we were called after the tree is created, replace the existing nodes
-			var activeNode;
-			if (parentNode) {
-				activeNode = tree.getActiveNode();
-				parentNode.removeChildren();
-			}
-			leaves.forEach( function (leaf) {
-				var childFolder = worker(leaf)
-				if (parentNode)
-					parentNode.addChild(childFolder)
-				else
-					parentFolder.children.push(childFolder)
-			})
-			scrollTree.scrollTop(scrollTop)
-			if (activeNode) {
-				var newNode = tree.getNodeByKey(activeNode.data.key)
-				newNode.activateSilently()
-			}
-		}
-
-		// get saved tree state
-        var lastKey = loadActivatedNode();
-		var expandedNodeList = loadExpandedNodeList();
-
-		// create a routers tree branch
-		var routers = new Folder("Routers")
-		routers.type = "Routers"
-		routers.info = allRouterInfo
-		routers.activate = lastKey === 'Routers'
-		routers.expand = (expandedNodeList.indexOf("Routers") > -1)
-		routers.clickFolderMode = 1
-		routers.key = "Routers"
-		routers.parent = "Routers"
-	    routers.addClass = "routers"
-		topLevelChildren.push(routers)
-		// called when the list of routers changes
-		var updateRouterTree = function (nodes) {
-			var worker = function (node) {
-				var name = QDRService.nameFromId(node)
-				var router = new Folder(name)
-				router.type = "Router"
-				router.info = routerInfo
-				router.nodeId = node
-				router.key = node
-				router.addClass = "router"
-				router.parent = "Routers"
-				router.activate = lastKey === node
-				return router;
-			}
-			updateLeaves(nodes, "Routers", routers, worker)
-		}
-		updateRouterTree(QDRService.nodeIdList());
-
-		// create an addresses tree branch
-		var addresses = new Folder("Addresses")
-		addresses.type = "Addresses"
-		addresses.info = allAddressInfo
-		addresses.activate = lastKey === 'Addresses'
-		addresses.expand = (expandedNodeList.indexOf("Addresses") > -1)
-		addresses.clickFolderMode = 1
-		addresses.key = "Addresses"
-		addresses.parent = "Addresses"
-	    addresses.addClass = "addresses"
-		topLevelChildren.push(addresses)
-		var updateAddressTree = function (addressFields) {
-			var worker = function (address) {
-				var a = new Folder(address.title)
-				a.info = addressInfo
-				a.key = address.uid
-				a.fields = address
-				a.type = "Address"
-				a.addClass = "address"
-				a.activate = lastKey === address.uid
-				a.parent = "Addresses"
-				return a;
-			}
-			updateLeaves(addressFields, "Addresses", addresses, worker)
-		}
-		allAddressInfo();
-
-		$scope.setLinkFilter = function (cur) {
-			// filter out non-matching links from the tree and the grid
-			getAllLinkFields([updateLinkGrid, updateLinkTree])
-		}
-		$scope.filterClose = function () {
-			var filter = $('#linkFilter')
-			filter.hide();
-		}
-		$scope.currentLinkFilter = "endpoint"
-		var filterHtml = "<button type='button' class='btn btn-secondary btn-filter'><span class='filter-icon'><i class='icon-filter'> Filter</span></button>";
-		var links = new Folder("Links " + filterHtml)
-		links.type = "Links"
-		links.info = allLinkInfo
-		links.activate = lastKey === 'Links'
-		links.expand = (expandedNodeList.indexOf("Links") > -1)
-		links.clickFolderMode = 1
-		links.key = "Links"
-		links.parent = "Links"
-	    links.addClass = "links"
-		topLevelChildren.push(links)
-
-		// called both before the tree is created and whenever a background update is done
-		var updateLinkTree = function (linkFields) {
-			var worker = function (link) {
-				var l = new Folder(link.title)
-				l.info = linkInfo
-				l.key = link.uid
-				l.fields = link
-				l.type = "Link"
-				l.parent = "Links"
-				l.activate = lastKey === link.uid
-				l.addClass = "link"
-				return l;
-			}
-			linkFields.sort ( function (a,b) { return a.link < b.link ? -1 : a.link > b.link ? 1 : 0})
-			updateLeaves(linkFields, "Links", links, worker)
-		}
-		allLinkInfo();
-
-		var connections = new Folder("Connections")
-		connections.type = "Connections"
-		connections.info = allConnectionInfo
-		connections.activate = lastKey === 'Connections'
-		connections.expand = (expandedNodeList.indexOf("Connections") > -1)
-		connections.clickFolderMode = 1
-		connections.key = "Connections"
-		connections.parent = "Connections"
-	    connections.addClass = "connections"
-		topLevelChildren.push(connections)
-
-		updateConnectionTree = function (nodes) {
-			var connectionsObj = {}
-			var expected = nodes.length;
-			var connreceived = 0;
-			nodes.forEach( function (nodeId) {
-				QDRService.getNodeInfo(nodeId, ".connection", [], function (nodeName, entity, response) {
-					response.results.forEach( function (result) {
-
-						var auth = "no_auth"
-						var sasl = QDRService.valFor(response.attributeNames, result, "sasl")
-						if (QDRService.valFor(response.attributeNames, result, "isAuthenticated")) {
-							auth = sasl
-							if (sasl === "ANONYMOUS")
-								auth = "anonymous-user"
-							else {
-								if (sasl === "GSSAPI")
-									sasl = "Kerberos"
-								if (sasl === "EXTERNAL")
-									sasl = "x.509"
-								auth = QDRService.valFor(response.attributeNames, result, "user") + "(" +
-										QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
-								}
-						}
-
-						var sec = "no-security"
-						if (QDRService.valFor(response.attributeNames, result, "isEncrypted")) {
-							if (sasl === "GSSAPI")
-								sec = "Kerberos"
-							else
-								sec = QDRService.valFor(response.attributeNames, result, "sslProto") + "(" +
-										QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
-						}
-
-						var host = QDRService.valFor(response.attributeNames, result, "host")
-						connectionsObj[host] = {}
-						response.attributeNames.forEach( function (attribute, i) {
-							connectionsObj[host][attribute] = result[i]
-						})
-						connectionsObj[host].security = sec
-						connectionsObj[host].authentication = auth
-						connectionsObj[host].routerId = nodeName
-
-					})
-					++connreceived;
-					if (connreceived == expected) {
-						var worker = function (connection) {
-							var c = new Folder(connection)
-							c.type = "Connection"
-							c.info = connectionInfo
-							c.key = connection
-							c.fields = connectionsObj[connection]
-							c.tooltip = connectionsObj[connection].role === "inter-router" ? "inter-router connection" : "external connection"
-							c.addClass = c.tooltip
-							c.parent = "Connections"
-							c.activate = lastKey === connection
-							return c
-						}
-						var allConnections = Object.keys(connectionsObj).sort()
-						updateLeaves(allConnections, "Connections", connections, worker)
-					}
-				})
-			})
-		}
-		updateConnectionTree(QDRService.nodeIdList())
-
-		var logsreceived = 0;
-		var logObj = {}
-		var logs = new Folder("Logs")
-		logs.type = "Logs"
-		logs.info = allLogInfo
-		logs.activate = lastKey === 'Logs'
-		logs.expand = (expandedNodeList.indexOf("Logs") > -1)
-		logs.clickFolderMode = 1
-		logs.key = "Logs"
-		logs.parent = "Logs"
-		//topLevelChildren.push(logs)
-		var nodeIds = QDRService.nodeIdList()
-		var expected = nodeIds.length;
-		nodeIds.forEach( function (nodeId) {
-			QDRService.getNodeInfo(nodeId, ".log", ["name"], function (nodeName, entity, response) {
-				response.results.forEach( function (result) {
-					logObj[result[0]] = 1    // use object to collapse duplicates
-				})
-				++logsreceived;
-				if (logsreceived == expected) {
-					var allLogs = Object.keys(logObj).sort()
-					allLogs.forEach(function (log) {
-						var l = new Folder(log)
-						l.type = "Log"
-						l.info = logInfo
-						l.key = log
-						l.parent = "Logs"
-						l.activate = lastKey === log
-						logs.children.push(l)
-					})
-					$('#overtree').dynatree({
-						onActivate: activated,
-						onExpand: saveExpanded,
-						onClick: function (n, e) {
-							if (e.target.className.indexOf('-filter') > -1) {
-								//QDR.log.debug("overtree on click called")
-								e.preventDefault();
-								e.stopPropagation()
-								var filter = $('#linkFilter')
-								var treeLink = $('span.links')
-								filter.css({
-                                              top: treeLink.offset().top + treeLink.height(),
-                                              left: treeLink.offset().left,
-                                              zIndex:5000
-                                            });
-								filter.toggle()
-								$("#overtree").dynatree("getTree").getNodeByKey('Links').activate()
-								return false;
-							}
-						},
-						selectMode: 1,
-						activeVisible: false,
-						children: topLevelChildren
-					})
-					// simulate a click on the previous active node
-					var active = $("#overtree").dynatree("getActiveNode");
-					if (!active) {
-						active = $("#overtree").dynatree("getTree").getNodeByKey("Routers")
-					}
-					activated(active);
-
-					// populate the data for each expanded node
-					updateExpanded();
-					QDRService.addUpdatedAction( "overview", function () {
-						$timeout(updateExpanded);
-					})
-					// update the node list
-					QDRService.startUpdating()
-
-			        loadColState($scope.allRouters);
-			        loadColState($scope.routerGrid);
-			        loadColState($scope.addressesGrid);
-			        loadColState($scope.addressGrid);
-			        loadColState($scope.linksGrid);
-			        loadColState($scope.linkGrid);
-			        loadColState($scope.allConnectionGrid);
-			        loadColState($scope.connectionGrid);
-
-				}
-			})
-		})
-
-        $scope.$on("$destroy", function( event ) {
-			QDRService.stopUpdating()
-			QDRService.delUpdatedAction("overview")
-        });
-
-    }]);
-
-  return QDR;
-
-}(QDR || {}));
-
diff --git a/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js b/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js
new file mode 120000
index 0000000..de6a7a1
--- /dev/null
+++ b/console/hawtio/src/main/webapp/plugin/js/qdrOverview.js
@@ -0,0 +1 @@
+../../../../../../stand-alone/plugin/js/qdrOverview.js
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/d98ae37e/console/hawtio/src/main/webapp/plugin/js/qdrSchema.js
----------------------------------------------------------------------
diff --git a/console/hawtio/src/main/webapp/plugin/js/qdrSchema.js b/console/hawtio/src/main/webapp/plugin/js/qdrSchema.js
deleted file mode 100644
index 656b159..0000000
--- a/console/hawtio/src/main/webapp/plugin/js/qdrSchema.js
+++ /dev/null
@@ -1,72 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-
-    QDR.module.controller("QDR.SchemaController", ['$scope', '$location', 'QDRService', function($scope, $location, QDRService) {
-		if (!QDRService.connected) {
-			QDRService.redirectWhenConnected("schema")
-			return;
-		}
-		// we are currently connected. setup a handler to get notified if we are ever disconnected
-		QDRService.addDisconnectAction( function () {
-			QDRService.redirectWhenConnected("schema")
-			$scope.$apply();
-		})
-
-        var keys2kids = function (tree, obj) {
-
-			if (obj === Object(obj)) {
-				tree.children = []
-	            for (var key in obj) {
-	                var kid = {title: key}
-	                if (obj[key] === Object(obj[key])) {
-	                    kid.isFolder = true
-	                    keys2kids(kid, obj[key])
-	                } else {
-						kid.title += (': ' + JSON.stringify(obj[key],null,2))
-	                }
-	                tree.children.push(kid)
-	            }
-			}
-        }
-
-		var tree = []
-		for (var key in QDRService.schema) {
-			var kid = {title: key}
-			var val = QDRService.schema[key]
-			if (val === Object(val))
-				keys2kids(kid, val)
-			else
-				kid.title += (': ' + JSON.stringify(val,null,2))
-
-			tree.push(kid);
-		}
-        $('#schema').dynatree({
-			minExpandLevel: 2,
-            children: tree
-        })
-
-
-    }]);
-
-    return QDR;
-}(QDR || {}));
diff --git a/console/hawtio/src/main/webapp/plugin/js/qdrSchema.js b/console/hawtio/src/main/webapp/plugin/js/qdrSchema.js
new file mode 120000
index 0000000..5010e61
--- /dev/null
+++ b/console/hawtio/src/main/webapp/plugin/js/qdrSchema.js
@@ -0,0 +1 @@
+../../../../../../stand-alone/plugin/js/qdrSchema.js
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/d98ae37e/console/hawtio/src/main/webapp/plugin/js/qdrService.js
----------------------------------------------------------------------
diff --git a/console/hawtio/src/main/webapp/plugin/js/qdrService.js b/console/hawtio/src/main/webapp/plugin/js/qdrService.js
deleted file mode 100644
index 09c3b92..0000000
--- a/console/hawtio/src/main/webapp/plugin/js/qdrService.js
+++ /dev/null
@@ -1,888 +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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
-  // The QDR service handles the connection to
-  // the server in the background
-  QDR.module.factory("QDRService", ['$rootScope', '$http', '$timeout', '$resource', '$location', function($rootScope, $http, $timeout, $resource, $location) {
-    var self = {
-
-	  rhea: require("rhea"),
-
-      timeout: 10,
-      connectActions: [],
-      disconnectActions: [],
-      updatedActions: {},
-      stop: undefined,  // update interval handle
-
-      addConnectAction: function(action) {
-        if (angular.isFunction(action)) {
-          self.connectActions.push(action);
-        }
-      },
-      addDisconnectAction: function(action) {
-        if (angular.isFunction(action)) {
-          self.disconnectActions.push(action);
-        }
-      },
-      addUpdatedAction: function(key, action) {
-        if (angular.isFunction(action)) {
-            self.updatedActions[key] = action;
-        }
-      },
-      delUpdatedAction: function(key) {
-        if (key in self.updatedActions)
-            delete self.updatedActions[key];
-      },
-
-      executeConnectActions: function() {
-        self.connectActions.forEach(function(action) {
-          //QDR.log.debug("executing connect action " + action);
-			try {
-                action.apply();
-            } catch (e) {
-                // in case the page that registered the handler has been unloaded
-            }
-        });
-        self.connectActions = [];
-		if ($location.path().startsWith(QDR.pluginRoot)) {
-	        $timeout( function () {
-
-	            var searchObject = $location.search();
-	            var goto = "overview";
-	            if (searchObject.org) {
-	                goto = searchObject.org;
-	            }
-	            $location.search('org', null)
-	            $location.path(QDR.pluginRoot +"/" + goto);
-	        })
-		}
-
-      },
-      executeDisconnectActions: function() {
-        self.disconnectActions.forEach(function(action) {
-			try {
-                action.apply();
-            } catch (e) {
-                // in case the page that registered the handler has been unloaded
-            }
-        });
-        self.disconnectActions = [];
-      },
-      executeUpdatedActions: function() {
-        for (action in self.updatedActions) {
-			try {
-                self.updatedActions[action].apply();
-            } catch (e) {
-                delete self.updatedActions[action]
-            }
-        }
-      },
-	redirectWhenConnected: function (org) {
-		$location.path("/" + QDR.pluginName + "/connect")
-		$location.search('org', org);
-	},
-
-      notifyTopologyDone: function() {
-        //QDR.log.debug("got Toplogy done notice");
-
-        if (!angular.isDefined(self.schema))
-            return;
-        else if (self.topology._gettingTopo)
-            return;
-        if (!self.gotTopology) {
-            QDR.log.debug("topology was just initialized");
-            self.gotTopology = true;
-            self.executeConnectActions();
-            $rootScope.$apply();
-        } else {
-            QDR.log.debug("topology model was just updated");
-            self.executeUpdatedActions();
-        }
-
-      },
-      /**
-       * @property options
-       * Holds a reference to the connection options when
-       * a connection is started
-       */
-      options: undefined,
-
-      /*
-       * @property message
-       * The proton message that is used to send commands
-       * and receive responses
-       */
-		sender: undefined,
-		receiver: undefined,
-		sendable: false,
-
-      schema: undefined,
-
-      toAddress: undefined,
-      connected: false,
-      gotTopology: false,
-      errorText: undefined,
-	  connectionError: undefined,
-
-      isConnected: function() {
-        return self.connected;
-      },
-
-    correlator: {
-        _objects: {},
-        _corremationID: 0,
-
-        corr: function () {
-            var id = ++this._corremationID + "";
-			this._objects[id] = {resolver: null}
-            return id;
-        },
-        request: function() {
-            //QDR.log.debug("correlator:request");
-            return this;
-        },
-        then: function(id, resolver, error) {
-            //QDR.log.debug("registered then resolver for correlationID: " + id);
-			if (error) {
-	            delete this._objects[id];
-				return;
-			}
-            this._objects[id].resolver = resolver;
-        },
-        // called by receiver's on('message') handler when a response arrives
-        resolve: function(context) {
-			var correlationID = context.message.properties.correlation_id;
-            this._objects[correlationID].resolver(context.message.body, context);
-            delete this._objects[correlationID];
-        }
-    },
-    
-    onSubscription: function() {
-        self.getSchema();
-     },
-
-    startUpdating: function () {
-        self.stopUpdating();
-        QDR.log.info("startUpdating called")
-        self.topology.get();
-        self.stop = setInterval(function() {
-            self.topology.get();
-        }, 2000);
-    },
-    stopUpdating: function () {
-        if (angular.isDefined(self.stop)) {
-            QDR.log.info("stopUpdating called")
-            clearInterval(self.stop);
-            self.stop = undefined;
-        }
-    },
-
-      initProton: function() {
-        //QDR.log.debug("*************QDR init proton called ************");
-      },
-      cleanUp: function() {
-      },
-      error: function(line) {
-        if (line.num) {
-          QDR.log.debug("error - num: ", line.num, " message: ", line.message);
-        } else {
-          QDR.log.debug("error - message: ", line.message);
-        }
-      },
-      disconnected: function(line) {
-        QDR.log.debug("Disconnected from QDR server");
-        self.executeDisconnectActions();
-      },
-
-      nameFromId: function (id) {
-		return id.split('/')[3];
-      },
-
-      humanify: function (s) {
-          var t = s.charAt(0).toUpperCase() + s.substr(1).replace(/[A-Z]/g, ' $&');
-          return t.replace(".", " ");
-      },
-	  pretty: function(v) {
-    	var formatComma = d3.format(",");
-		if (!isNaN(parseFloat(v)) && isFinite(v))
-			return formatComma(v);
-		return v;
-	  },
-
-      nodeNameList: function() {
-        var nl = [];
-        // if we are in the middel of updating the topology
-        // then use the last known node info
-        var ni = self.topology._nodeInfo;
-        if (self.topology._gettingTopo)
-            ni = self.topology._lastNodeInfo;
-		for (var id in ni) {
-            nl.push(self.nameFromId(id));
-        }
-        return nl.sort();
-      },
-
-      nodeIdList: function() {
-        var nl = [];
-        // if we are in the middel of updating the topology
-        // then use the last known node info
-        var ni = self.topology._nodeInfo;
-        if (self.topology._gettingTopo)
-            ni = self.topology._lastNodeInfo;
-		for (var id in ni) {
-            nl.push(id);
-        }
-        return nl.sort();
-      },
-
-      nodeList: function () {
-        var nl = [];
-        var ni = self.topology._nodeInfo;
-        if (self.topology._gettingTopo)
-            ni = self.topology._lastNodeInfo;
-		for (var id in ni) {
-            nl.push({name: self.nameFromId(id), id: id});
-        }
-        return nl;
-      },
-
-      // given an attribute name array, find the value at the same index in the values array
-      valFor: function (aAr, vAr, key) {
-          var idx = aAr.indexOf(key);
-          if ((idx > -1) && (idx < vAr.length)) {
-              return vAr[idx];
-          }
-          return null;
-      },
-
-		isArtemis: function (d) {
-			return d.nodeType ==='on-demand' && !d.properties.product;
-		},
-
-		isQpid: function (d) {
-			return d.nodeType ==='on-demand' && (d.properties && d.properties.product === 'qpid-cpp');
-		},
-
-		isAConsole: function (properties, connectionId, nodeType, key) {
-			return self.isConsole({properties: properties, connectionId: connectionId, nodeType: nodeType, key: key})
-		},
-		isConsole: function (d) {
-			// TODO: use connection properties when available
-			if (d.properties.console_identifier == 'Dispatch console')
-				return true;
-			// until connection properties can difinitively identify consoles:
-			var connid = d.connectionId;
-			if (connid && d.nodeType === 'normal') {
-				// find all the endpoint links for this router that have this connid
-				var linkInfo = self.topology.nodeInfo()[d.key]['.router.link']
-				var outs = 0, ins = 0;
-				var outaddr, inaddr;
-				linkInfo.results.forEach( function (link) {
-					if (self.valFor(linkInfo.attributeNames, link, 'connectionId') == connid &&
-						self.valFor(linkInfo.attributeNames, link, 'linkType') == 'endpoint') {
-						if (self.valFor(linkInfo.attributeNames, link, 'linkDir') == 'in') {
-							++ins;
-							inaddr = self.valFor(linkInfo.attributeNames, link, 'owningAddr')
-						}
-						if (self.valFor(linkInfo.attributeNames, link, 'linkDir') == 'out') {
-							++outs;
-							outaddr = self.valFor(linkInfo.attributeNames, link, 'owningAddr')
-						}
-						return true;
-					}
-				})
-				// consoles have 1 out link with an address that starts with Ltemp. and
-				// 1 in link with no address
-				if (outs == 1 && ins == 1 &&
-					inaddr == null && outaddr.startsWith('Ltemp.')) {
-					return true;
-				}
-			}
-			return false;
-		},
-
-      /*
-       * send the management messages that build up the topology
-       *
-       *
-       */
-      topology: {
-        _gettingTopo: false,
-        _nodeInfo: {},
-        _lastNodeInfo: {},
-        _expected: {},
-        _timerHandle: null,
-
-        nodeInfo: function () {
-            return this._gettingTopo ? this._lastNodeInfo : this._nodeInfo;
-        },
-
-        get: function () {
-            if (this._gettingTopo)
-                return;
-            if (!self.connected) {
-				QDR.log.debug("topology get failed because !self.connected")
-                return;
-            }
-            this._lastNodeInfo = angular.copy(this._nodeInfo);
-            this._gettingTopo = true;
-
-            self.errorText = undefined;
-            this.cleanUp(this._nodeInfo);
-            this._nodeInfo = {};
-            this._expected = {};
-
-            // get the list of nodes to query.
-            // once this completes, we will get the info for each node returned
-            self.getRemoteNodeInfo( function (response, context) {
-                //QDR.log.debug("got remote node list of ");
-                //console.dump(response);
-                if( Object.prototype.toString.call( response ) === '[object Array]' ) {
-					if (response.length === 0) {
-						// there is only one router, get its node id from the reeciiver
-						//"amqp:/_topo/0/Router.A/temp.aSO3+WGaoNUgGVx"
-						var address = context.receiver.remote.attach.source.address;
-						var addrParts = address.split('/')
-						addrParts.splice(addrParts.length-1, 1, '$management')
-						response = [addrParts.join('/')]
-					}
-                    // we expect a response for each of these nodes
-                    self.topology.wait(self.timeout);
-                    for (var i=0; i<response.length; ++i) {
-                        self.makeMgmtCalls(response[i]);
-                    }
-                };
-            });
-        },
-
-        cleanUp: function (obj) {
-/*
-            for (var o in obj) {
-                QDR.log.debug("cleaning up");
-                console.dump(obj[o]);
-                if (isNaN(parseInt(o)))
-                    this.cleanUp(obj[o]);
-            }
-*/
-            if (obj)
-                delete obj;
-        },
-        wait: function (timeout) {
-            this.timerHandle = setTimeout(this.timedOut, timeout * 1000);
-         },
-        timedOut: function () {
-        // a node dropped out. this happens when the get-mgmt-nodex
-        // results contains more nodes than actually respond within
-        // the timeout. However, if the responses we get don't contain
-        // the missing node, assume we are done.
-            QDR.log.info("timed out waiting for management responses");
-            // note: can't use 'this' in a timeout handler
-            self.topology.miniDump("state at timeout");
-            // check if _nodeInfo is consistent
-            if (self.topology.isConsistent()) {
-                //TODO: notify controllers which node was dropped
-                // so they can keep an event log
-                self.topology.ondone();
-                return;
-            }
-            self.topology.onerror(Error("Timed out waiting for management responses"));
-        },
-        isConsistent: function () {
-            // see if the responses we have so far reference any nodes
-            // for which we don't have a response
-            var gotKeys = {};
-            for (var id in this._nodeInfo) {
-                var onode = this._nodeInfo[id];
-                var conn = onode['.connection'];
-                // get list of node names in the connection data
-                if (conn) {
-                    var containerIndex = conn.attributeNames.indexOf('container');
-                    var connectionResults = conn.results;
-                    if (containerIndex >= 0)
-                        for (var j=0; j < connectionResults.length; ++j) {
-                            // inter-router connection to a valid dispatch connection name
-                            gotKeys[connectionResults[j][containerIndex]] = ""; // just add the key
-                        }
-                }
-            }
-            // gotKeys now contains all the container names that we have received
-            // Are any of the keys that are still expected in the gotKeys list?
-            var keys = Object.keys(gotKeys);
-            for (var id in this._expected) {
-                var key = self.nameFromId(id);
-                if (key in keys)
-                    return false;
-            }
-            return true;
-        },
-            
-        addNodeInfo: function (id, entity, values) {
-            // save the results in the nodeInfo object
-            if (id) {
-                if (!(id in self.topology._nodeInfo)) {
-                    self.topology._nodeInfo[id] = {};
-                }
-                self.topology._nodeInfo[id][entity] = values;
-            }
-  
-            // remove the id / entity from _expected
-            if (id in self.topology._expected) {
-                var entities = self.topology._expected[id];
-                var idx = entities.indexOf(entity);
-                if (idx > -1) {
-                    entities.splice(idx, 1);
-                    if (entities.length == 0)
-                        delete self.topology._expected[id];
-                }
-            }
-            // see if the expected obj is empty
-            if (Object.getOwnPropertyNames(self.topology._expected).length == 0)
-                self.topology.ondone();
-            self.topology.cleanUp(values);
-        },
-        expect: function (id, key) {
-            if (!key || !id)
-                return;
-            if (!(id in this._expected))
-                this._expected[id] = [];
-            if (this._expected[id].indexOf(key) == -1)
-                this._expected[id].push(key);
-        },
-        ondone: function () {
-            clearTimeout(this.timerHandle);
-            this._gettingTopo = false;
-            //this.miniDump();
-            //this.dump();
-            self.notifyTopologyDone();
-         },
-         dump: function (prefix) {
-            if (prefix)
-                QDR.log.info(prefix);
-            QDR.log.info("---");
-            for (var key in this._nodeInfo) {
-                QDR.log.info(key);
-                console.dump(this._nodeInfo[key]);
-                QDR.log.info("---");
-            }
-            QDR.log.debug("was still expecting:");
-            console.dump(this._expected);
-        },
-         miniDump: function (prefix) {
-            if (prefix)
-                QDR.log.info(prefix);
-            QDR.log.info("---");
-            console.dump(Object.keys(this._nodeInfo));
-            QDR.log.info("---");
-        },
-        onerror: function (err) {
-            this._gettingTopo = false;
-            QDR.log.debug("Err:" + err);
-            self.executeDisconnectActions();
-
-        }
-
-      },
-
-      getRemoteNodeInfo: function (callback) {
-	 	//QDR.log.debug("getRemoteNodeInfo called");
-        var ret;
-        // first get the list of remote node names
-	 	self.correlator.request(
-                ret = self.sendMgmtQuery('GET-MGMT-NODES')
-            ).then(ret.id, function(response, context) {
-                callback(response, context);
-                self.topology.cleanUp(response);
-            }, ret.error);
-      },
-
-      makeMgmtCalls: function (id) {
-            var keys = [".router", ".connection", ".container", ".router.node", ".listener", ".router.link"];
-            $.each(keys, function (i, key) {
-                self.topology.expect(id, key);
-                self.getNodeInfo(id, key, [], self.topology.addNodeInfo);
-            });
-      },
-
-      getNodeInfo: function (nodeName, entity, attrs, callback) {
-        //QDR.log.debug("getNodeInfo called with nodeName: " + nodeName + " and entity " + entity);
-        var ret;
-        self.correlator.request(
-            ret = self.sendQuery(nodeName, entity, attrs)
-        ).then(ret.id, function(response) {
-            callback(nodeName, entity, response);
-            //self.topology.addNodeInfo(nodeName, entity, response);
-            //self.topology.cleanUp(response);
-        }, ret.error);
-      },
-
-		getMultipleNodeInfo: function (nodeNames, entity, attrs, callback, selectedNodeId, aggregate) {
-			if (!angular.isDefined(aggregate))
-				aggregate = true;
-			var responses = {};
-			var gotNodesResult = function (nodeName, dotentity, response) {
-				responses[nodeName] = response;
-				if (Object.keys(responses).length == nodeNames.length) {
-					if (aggregate)
-						self.aggregateNodeInfo(nodeNames, entity, selectedNodeId, responses, callback);
-					else {
-						callback(nodeNames, entity, responses)
-					}
-				}
-			}
-
-			nodeNames.forEach( function (id) {
-	            self.getNodeInfo(id, '.'+entity, attrs, gotNodesResult);
-	        })
-			//TODO: implement a timeout in case not all requests complete
-		},
-
-		aggregateNodeInfo: function (nodeNames, entity, selectedNodeId, responses, callback) {
-			//QDR.log.debug("got all results for  " + entity);
-			// aggregate the responses
-			var newResponse = {};
-			var thisNode = responses[selectedNodeId];
-			newResponse['attributeNames'] = thisNode.attributeNames;
-			newResponse['results'] = thisNode.results;
-			newResponse['aggregates'] = [];
-			for (var i=0; i<thisNode.results.length; ++i) {
-				var result = thisNode.results[i];
-				var vals = [];
-				result.forEach( function (val) {
-					vals.push({sum: val, detail: []})
-				})
-				newResponse.aggregates.push(vals);
-			}
-			var nameIndex = thisNode.attributeNames.indexOf("name");
-			var ent = self.schema.entityTypes[entity];
-			var ids = Object.keys(responses);
-			ids.sort();
-			ids.forEach( function (id) {
-				var response = responses[id];
-				var results = response.results;
-				results.forEach( function (result) {
-					// find the matching result in the aggregates
-					var found = newResponse.aggregates.some( function (aggregate, j) {
-						if (aggregate[nameIndex].sum === result[nameIndex]) {
-							// result and aggregate are now the same record, add the graphable values
-							newResponse.attributeNames.forEach( function (key, i) {
-								if (ent.attributes[key] && ent.attributes[key].graph) {
-									if (id != selectedNodeId)
-										aggregate[i].sum += result[i];
-								}
-								aggregate[i].detail.push({node: self.nameFromId(id)+':', val: result[i]})
-							})
-							return true; // stop looping
-						}
-						return false; // continute looking for the aggregate record
-					})
-					if (!found) {
-						// this attribute was not found in the aggregates yet
-						// because it was not in the selectedNodeId's results
-						var vals = [];
-						result.forEach( function (val) {
-							vals.push({sum: val, detail: [{node: self.nameFromId(id), val: val}]})
-						})
-						newResponse.aggregates.push(vals)
-					}
-				})
-			})
-			callback(nodeNames, entity, newResponse);
-		},
-
-
-      getSchema: function () {
-        //QDR.log.debug("getting schema");
-        var ret;
-        self.correlator.request(
-            ret = self.sendMgmtQuery('GET-SCHEMA')
-        ).then(ret.id, function(response) {
-            //QDR.log.debug("Got schema response");
-			// remove deprecated
-			for (var entityName in response.entityTypes) {
-				var entity = response.entityTypes[entityName]
-				if (entity.deprecated) {
-					// deprecated entity
-				    delete response.entityTypes[entityName]
-				} else {
-					for (var attributeName in entity.attributes) {
-						var attribute = entity.attributes[attributeName]
-						if (attribute.deprecated) {
-							// deprecated attribute
-							delete response.entityTypes[entityName].attributes[attributeName]
-						}
-					}
-				}
-			}
-			self.schema = response;
-	        self.topology.get();
-        }, ret.error);
-      },
-
-      getNodeInfo: function (nodeName, entity, attrs, callback) {
-        //QDR.log.debug("getNodeInfo called with nodeName: " + nodeName + " and entity " + entity);
-        var ret;
-        self.correlator.request(
-            ret = self.sendQuery(nodeName, entity, attrs)
-        ).then(ret.id, function(response) {
-            callback(nodeName, entity, response);
-            //self.topology.addNodeInfo(nodeName, entity, response);
-            //self.topology.cleanUp(response);
-        }, ret.error);
-      },
-
-	sendMethod: function (nodeId, entity, attrs, operation, callback) {
-		var ret;
-		self.correlator.request(
-			ret = self._sendMethod(nodeId, entity, attrs, operation)
-		).then(ret.id, function (response, context) {
-				callback(nodeId, entity, response, context);
-		}, ret.error);
-	},
-
-	_fullAddr: function (toAddr) {
-        var toAddrParts = toAddr.split('/');
-        if (toAddrParts.shift() != "amqp:") {
-            self.topology.error(Error("unexpected format for router address: " + toAddr));
-            return;
-        }
-        //var fullAddr =  self.toAddress + "/" + toAddrParts.join('/');
-        var fullAddr =  toAddrParts.join('/');
-		return fullAddr;
-	},
-
-	_sendMethod: function (toAddr, entity, attrs, operation) {
-		var fullAddr = self._fullAddr(toAddr);
-		var ret = {id: self.correlator.corr()};
-		if (!self.sender || !self.sendable) {
-			ret.error = "no sender"
-			return ret;
-		}
-		try {
-			var application_properties = {
-				operation:  operation
-			}
-			var ent = self.schema.entityTypes[entity];
-			var fullyQualifiedType = ent.fullyQualifiedType;
-			if (fullyQualifiedType) {
-				application_properties.type = fullyQualifiedType
-			}
-			else
-				application_properties.type = entity;
-			if (attrs.name)
-				application_properties.name = attrs.name;
-			var msg = {
-	                body: attrs,
-	                properties: {
-	                    to:                     fullAddr,
-                        reply_to:               self.receiver.remote.attach.source.address,
-	                    correlation_id:         ret.id
-	                },
-	                application_properties: application_properties
-            }
-            self.sender.send( msg );
-			console.dump("------- method called -------")
-            console.dump (msg)
-		}
-		catch (e) {
-			error = "error sending: " + e;
-			QDR.log.error(error)
-			ret.error = error;
-		}
-		return ret;
-	},
-
-    sendQuery: function(toAddr, entity, attrs, operation) {
-        operation = operation || "QUERY"
-		var fullAddr = self._fullAddr(toAddr);
-
-		var body;
-        if (attrs)
-            body = {
-                    "attributeNames": attrs,
-            }
-        else
-            body = {
-                "attributeNames": [],
-            }
-		if (entity[0] === '.')
-			entity = entity.substr(1, entity.length-1)
-		var prefix = "org.apache.qpid.dispatch."
-		var configs = ["address", "autoLink", "linkRoute"]
-		if (configs.indexOf(entity) > -1)
-			prefix += "router.config."
-		return self._send(body, fullAddr, operation, prefix + entity);
-    },
-
-    sendMgmtQuery: function (operation) {
-		return self._send([], "/$management", operation);
-    },
-
-	_send: function (body, to, operation, entityType) {
-		var ret = {id: self.correlator.corr()};
-		if (!self.sender || !self.sendable) {
-			ret.error = "no sender"
-			return ret;
-		}
-		try {
-			var application_properties = {
-				operation:  operation,
-                type:       "org.amqp.management",
-                name:       "self"
-            };
-			if (entityType)
-                application_properties.entityType = entityType;
-
-	        self.sender.send({
-	                body: body,
-	                properties: {
-	                    to:                     to,
-                        reply_to:               self.receiver.remote.attach.source.address,
-	                    correlation_id:         ret.id
-	                },
-	                application_properties: application_properties
-            })
-		}
-		catch (e) {
-			error = "error sending: " + e;
-			QDR.log.error(error)
-			ret.error = error;
-		}
-		return ret;
-	},
-
-      disconnect: function() {
-        self.connection.close();
-		self.errorText = "Disconnected."
-      },
-
-      connect: function(options) {
-        self.options = options;
-        self.topologyInitialized = false;
-		if (!self.connected) {
-			var okay = {connection: false, sender: false, receiver: false}
-            var port = options.port || 5673;
-            var baseAddress = options.address + ':' + port;
-			var ws = self.rhea.websocket_connect(WebSocket);
-			self.toAddress = "amqp://" + baseAddress;
-			self.connectionError = undefined;
-
-			var stop = function (context) {
-				//self.stopUpdating();
-				okay.sender = false;
-				okay.receiver = false;
-				okay.connected = false;
-				self.connected = false;
-				self.sender = null;
-				self.receiver = null;
-				self.sendable = false;
-				self.gotTopology = false;
-			}
-			var maybeStart = function () {
-				if (okay.connection && okay.sender && okay.receiver && self.sendable && !self.connected) {
-					QDR.log.info("okay to start")
-					self.connected = true;
-					self.connection = connection;
-					self.sender = sender;
-					self.receiver = receiver;
-					self.onSubscription();
-					self.gotTopology = false;
-				}
-			}
-			var onDisconnect = function () {
-				//QDR.log.warn("Disconnected");
-				self.connectionError = true;
-				stop();
-				self.executeDisconnectActions();
-			}
-
-			QDR.log.debug("****** calling rhea.connect ********")
-			var connection;
-			try {
-                connection = self.rhea.connect({
-                    connection_details:ws('ws://' + baseAddress, ["binary", "AMQWSB10"]),
-                    reconnect:true,
-                    properties: {console_identifier: 'Dispatch console'}
-	            });
-			}
-			catch (e) {
-				QDR.log.debug("exception caught on connect")
-				self.errorText = "Connection failed"
-				onDisconnect();
-			}
-			if (!self.connectionError) {
-				connection.on('connection_open', function (context) {
-					QDR.log.debug("connection_opened")
-					okay.connection = true;
-					okay.receiver = false;
-					okay.sender = false;
-				})
-				connection.on('disconnected', function (context) {
-					QDR.log.debug("connection disconnected")
-					self.errorText = "Unable to connect"
-					onDisconnect();
-				})
-				connection.on('connection_close', function (context) {
-					QDR.log.debug("connection closed")
-					self.errorText = "Disconnected"
-					onDisconnect();
-				})
-
-				var sender = connection.open_sender();
-				sender.on('sender_open', function (context) {
-					QDR.log.debug("sender_opened")
-					okay.sender = true
-					maybeStart()
-				})
-				sender.on('sendable', function (context) {
-					//QDR.log.debug("sendable")
-					self.sendable = true;
-					maybeStart();
-				})
-
-				var receiver = connection.open_receiver({source: {dynamic: true}});
-				receiver.on('receiver_open', function (context) {
-					QDR.log.debug("receiver_opened")
-					okay.receiver = true;
-					maybeStart()
-				})
-				receiver.on("message", function (context) {
-					self.correlator.resolve(context);
-				});
-			}
-		}
-      }
-    }
-      return self;
-  }]);
-
-  return QDR;
-}(QDR || {}));
-
-(function() {
-    console.dump = function(object) {
-        if (window.JSON && window.JSON.stringify)
-            QDR.log.info(JSON.stringify(object,undefined,2));
-        else
-            console.log(object);
-    };
-})();
diff --git a/console/hawtio/src/main/webapp/plugin/js/qdrService.js b/console/hawtio/src/main/webapp/plugin/js/qdrService.js
new file mode 120000
index 0000000..2d2a672
--- /dev/null
+++ b/console/hawtio/src/main/webapp/plugin/js/qdrService.js
@@ -0,0 +1 @@
+../../../../../../stand-alone/plugin/js/qdrService.js
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org