You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2017/08/01 20:18:06 UTC

[1/6] activemq-artemis git commit: ARTEMIS-1270 Management Console - Hawtio Solution

Repository: activemq-artemis
Updated Branches:
  refs/heads/master 2b64ce4a3 -> bc2670a54


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/brokerDiagram.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/brokerDiagram.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/brokerDiagram.js
new file mode 100644
index 0000000..3faa093
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/brokerDiagram.js
@@ -0,0 +1,665 @@
+/*
+ * 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 ARTEMIS
+ */
+var ARTEMIS = (function(ARTEMIS) {
+   ARTEMIS.BrokerDiagramController = function ($scope, $compile, $location, localStorage, ARTEMISService, jolokia, workspace, $routeParams) {
+
+      Fabric.initScope($scope, $location, jolokia, workspace);
+      var artemisJmxDomain = localStorage['artemisJmxDomain'] || "org.apache.activemq.artemis";
+
+      $scope.selectedNode = null;
+      var defaultFlags = {
+         panel: true,
+         popup: false,
+         label: true,
+         group: false,
+         profile: false,
+         slave: false,
+         broker: true,
+         network: true,
+         container: false,
+         address: true,
+         queue: true,
+         consumer: true,
+         producer: true
+      };
+      $scope.viewSettings = {};
+      $scope.shapeSize = {
+         broker: 20,
+         queue: 14,
+         address: 14
+      };
+      var redrawGraph = Core.throttled(doRedrawGraph, 1000);
+      var graphBuilder = new ForceGraph.GraphBuilder();
+      Core.bindModelToSearchParam($scope, $location, "searchFilter", "q", "");
+      angular.forEach(defaultFlags, function (defaultValue, key) {
+         var modelName = "viewSettings." + key;
+         // bind model values to search params...
+         function currentValue() {
+            var answer = $location.search()[paramName] || defaultValue;
+            return answer === "false" ? false : answer;
+         }
+
+         var paramName = key;
+         var value = currentValue();
+         Core.pathSet($scope, modelName, value);
+         $scope.$watch(modelName, function () {
+            var current = Core.pathGet($scope, modelName);
+            var old = currentValue();
+            if (current !== old) {
+               var defaultValue = defaultFlags[key];
+               if (current !== defaultValue) {
+                  if (!current) {
+                     current = "false";
+                  }
+                  $location.search(paramName, current);
+               }
+               else {
+                  $location.search(paramName, null);
+               }
+            }
+            redrawGraph();
+         });
+      });
+      $scope.connectToBroker = function () {
+         var selectedNode = $scope.selectedNode;
+         if (selectedNode) {
+            var container = selectedNode["brokerContainer"] || selectedNode;
+            connectToBroker(container, selectedNode["brokerName"]);
+         }
+      };
+      function connectToBroker(container, brokerName, postfix) {
+         if (postfix === void 0) {
+            postfix = null;
+         }
+
+         var view = "/jmx/attributes?tab=artemis";
+         if (!postfix) {
+            if (brokerName) {
+               // lets default to the broker view
+               postfix = "nid=root-" + artemisJmxDomain + "-Broker-" + brokerName;
+            }
+         }
+         if (postfix) {
+            view += "&" + postfix;
+         }
+         var path = Core.url("/#" + view);
+         window.open(path, '_destination');
+         window.focus();
+      }
+
+      $scope.connectToDestination = function () {
+         var selectedNode = $scope.selectedNode;
+         if (selectedNode) {
+            var container = selectedNode["brokerContainer"] || selectedNode;
+            var brokerName = selectedNode["brokerName"];
+            var destinationType = selectedNode["destinationType"] || selectedNode["typeLabel"];
+            var destinationName = selectedNode["destinationName"];
+            var postfix = null;
+            if (brokerName && destinationType && destinationName) {
+               postfix = "nid=root-" + artemisJmxDomain + "-Broker-" + brokerName + "-" + destinationType + "-" + destinationName;
+            }
+            connectToBroker(container, brokerName, postfix);
+         }
+      };
+      $scope.$on('$destroy', function (event) {
+         stopOldJolokia();
+      });
+      function stopOldJolokia() {
+         var oldJolokia = $scope.selectedNodeJolokia;
+         if (oldJolokia && oldJolokia !== jolokia) {
+            oldJolokia.stop();
+         }
+      }
+
+      $scope.$watch("selectedNode", function (newValue, oldValue) {
+         // lets cancel any previously registered thingy
+         if ($scope.unregisterFn) {
+            $scope.unregisterFn();
+            $scope.unregisterFn = null;
+         }
+         var node = $scope.selectedNode;
+         if (node) {
+            var mbean = node.objectName;
+            var brokerContainer = node.brokerContainer || {};
+            var nodeJolokia = node.jolokia || brokerContainer.jolokia || jolokia;
+            if (nodeJolokia !== $scope.selectedNodeJolokia) {
+               stopOldJolokia();
+               $scope.selectedNodeJolokia = nodeJolokia;
+               if (nodeJolokia !== jolokia) {
+                  var rate = Core.parseIntValue(localStorage['updateRate'] || "2000", "update rate");
+                  if (rate) {
+                     nodeJolokia.start(rate);
+                  }
+               }
+            }
+            var dummyResponse = {value: node.panelProperties || {}};
+            if (mbean && nodeJolokia) {
+               ARTEMIS.log.debug("reading ", mbean, " on remote container");
+               $scope.unregisterFn = Core.register(nodeJolokia, $scope, {
+                  type: 'read',
+                  mbean: mbean
+               }, onSuccess(renderNodeAttributes, {
+                  error: function (response) {
+                     // probably we've got a wrong mbean name?
+                     // so lets render at least
+                     renderNodeAttributes(dummyResponse);
+                     Core.defaultJolokiaErrorHandler(response);
+                  }
+               }));
+            }
+            else {
+               ARTEMIS.log.debug("no mbean or jolokia available, using dummy response");
+               renderNodeAttributes(dummyResponse);
+            }
+         }
+      });
+      function getDestinationTypeName(attributes) {
+         var prefix = attributes["DestinationTemporary"] ? "Temporary " : "";
+         return prefix + (attributes["DestinationTopic"] ? "Topic" : "Queue");
+      }
+
+      var ignoreNodeAttributes = ["Broker", "BrokerId", "BrokerName", "Connection", "DestinationName", "DestinationQueue", "DestinationTemporary", "DestinationTopic",];
+      var ignoreNodeAttributesByType = {
+         producer: ["Producer", "ProducerId"],
+         queue: ["Name", "MessageGroups", "MessageGroupType", "Subscriptions"],
+         topic: ["Name", "Subscriptions"],
+         broker: ["DataDirectory", "DurableTopicSubscriptions", "DynamicDestinationProducers", "InactiveDurableToppicSubscribers"]
+      };
+      var brokerShowProperties = ["Version", "Started"];
+      var onlyShowAttributesByType = {
+         broker: brokerShowProperties,
+         brokerSlave: brokerShowProperties
+      };
+
+      function renderNodeAttributes(response) {
+         var properties = [];
+         if (response) {
+            var value = response.value || {};
+            $scope.selectedNodeAttributes = value;
+            var selectedNode = $scope.selectedNode || {};
+            var brokerContainer = selectedNode['brokerContainer'] || {};
+            var nodeType = selectedNode["type"];
+            var brokerName = selectedNode["brokerName"];
+            var containerId = selectedNode["container"] || brokerContainer["container"];
+            var group = selectedNode["group"] || brokerContainer["group"];
+            var jolokiaUrl = selectedNode["jolokiaUrl"] || brokerContainer["jolokiaUrl"];
+            var profile = selectedNode["profile"] || brokerContainer["profile"];
+            var version = selectedNode["version"] || brokerContainer["version"];
+            var isBroker = nodeType && nodeType.startsWith("broker");
+            var ignoreKeys = ignoreNodeAttributes.concat(ignoreNodeAttributesByType[nodeType] || []);
+            var onlyShowKeys = onlyShowAttributesByType[nodeType];
+            angular.forEach(value, function (v, k) {
+               if (onlyShowKeys ? onlyShowKeys.indexOf(k) >= 0 : ignoreKeys.indexOf(k) < 0) {
+                  var formattedValue = Core.humanizeValueHtml(v);
+                  properties.push({key: Core.humanizeValue(k), value: formattedValue});
+               }
+            });
+            properties = properties.sortBy("key");
+            var brokerProperty = null;
+            if (brokerName) {
+               var brokerHtml = '<a target="broker" ng-click="connectToBroker()">' + '<img title="Apache Artemis" src="img/icons/messagebroker.svg"> ' + brokerName + '</a>';
+               if (version && profile) {
+                  var brokerLink = Fabric.brokerConfigLink(workspace, jolokia, localStorage, version, profile, brokerName);
+                  if (brokerLink) {
+                     brokerHtml += ' <a title="configuration settings" target="brokerConfig" href="' + brokerLink + '"><i class="icon-tasks"></i></a>';
+                  }
+               }
+               var html = $compile(brokerHtml)($scope);
+               brokerProperty = {key: "Broker", value: html};
+               if (!isBroker) {
+                  properties.splice(0, 0, brokerProperty);
+               }
+            }
+            if (containerId) {
+               //var containerModel = "selectedNode" + (selectedNode['brokerContainer'] ? ".brokerContainer" : "");
+               properties.splice(0, 0, {
+                  key: "Container",
+                  value: $compile('<div fabric-container-link="' + selectedNode['container'] + '"></div>')($scope)
+               });
+            }
+            var destinationName = value["DestinationName"] || selectedNode["destinationName"];
+            if (destinationName && (nodeType !== "queue" && nodeType !== "topic")) {
+               var destinationTypeName = getDestinationTypeName(value);
+               var html = createDestinationLink(destinationName, destinationTypeName);
+               properties.splice(0, 0, {key: destinationTypeName, value: html});
+            }
+            var typeLabel = selectedNode["typeLabel"];
+            var name = selectedNode["name"] || selectedNode["id"] || selectedNode['objectName'];
+            if (typeLabel) {
+               var html = name;
+               if (nodeType === "queue" || nodeType === "topic") {
+                  html = createDestinationLink(name, nodeType);
+               }
+               var typeProperty = {key: typeLabel, value: html};
+               if (isBroker && brokerProperty) {
+                  typeProperty = brokerProperty;
+               }
+               properties.splice(0, 0, typeProperty);
+            }
+         }
+         $scope.selectedNodeProperties = properties;
+         Core.$apply($scope);
+      }
+
+      /**
+       * Generates the HTML for a link to the destination
+       */
+      function createDestinationLink(destinationName, destinationType) {
+         if (destinationType === void 0) {
+            destinationType = "queue";
+         }
+         return $compile('<a target="destination" title="' + destinationName + '" ng-click="connectToDestination()">' + destinationName + '</a>')($scope);
+      }
+
+      $scope.$watch("searchFilter", function (newValue, oldValue) {
+         redrawGraph();
+      });
+      // lets just use the current stuff from the workspace
+      $scope.$watch('workspace.tree', function () {
+         redrawGraph();
+      });
+      $scope.$on('jmxTreeUpdated', function () {
+         redrawGraph();
+      });
+
+      function onBrokerData(response) {
+         if (response) {
+            var responseJson = angular.toJson(response.value);
+            if ($scope.responseJson === responseJson) {
+               return;
+            }
+            $scope.responseJson = responseJson;
+            $scope.brokers = response.value;
+            doRedrawGraph();
+         }
+      }
+
+      function redrawLocalBroker() {
+         var container = {
+            jolokia: jolokia
+         };
+         var containerId = "local";
+         $scope.activeContainers = {
+            containerId: container
+         };
+         var brokers = [];
+         jolokia.search(artemisJmxDomain + ":broker=*", onSuccess(function (response) {
+            angular.forEach(response, function (objectName) {
+               var atts = ARTEMISService.artemisConsole.getServerAttributes(jolokia, objectName);
+               var val = atts.value;
+               var details = Core.parseMBean(objectName);
+               if (details) {
+                  var properties = details['attributes'];
+                  ARTEMIS.log.info("Got broker: " + objectName + " on container: " + containerId + " properties: " + angular.toJson(properties, true));
+                  if (properties) {
+                     var master = true;
+                     var brokerId = properties["broker"] || "unknown";
+                     var nodeId = val["NodeID"];
+                     var theBroker = {
+                        brokerId: brokerId,
+                        nodeId: nodeId
+                     };
+                     brokers.push(theBroker);
+                     if ($scope.viewSettings.broker) {
+                        var broker = getOrAddBroker(master, brokerId, nodeId, containerId, container, properties);
+                     }
+                  }
+               }
+            });
+
+            redrawActiveContainers(brokers);
+         }));
+      }
+
+      function redrawActiveContainers(brokers) {
+         // TODO delete any nodes from dead containers in containersToDelete
+         angular.forEach($scope.activeContainers, function (container, id) {
+            var containerJolokia = container.jolokia;
+            if (containerJolokia) {
+               onContainerJolokia(containerJolokia, container, id, brokers);
+            }
+            else {
+               Fabric.containerJolokia(jolokia, id, function (containerJolokia) {
+                  return onContainerJolokia(containerJolokia, container, id, brokers);
+               });
+            }
+         });
+         $scope.graph = graphBuilder.buildGraph();
+         Core.$apply($scope);
+      }
+
+      function doRedrawGraph() {
+         graphBuilder = new ForceGraph.GraphBuilder();
+         redrawLocalBroker();
+      }
+
+      function brokerNameMarkup(brokerName) {
+         return brokerName ? "<p></p>broker: " + brokerName + "</p>" : "";
+      }
+
+      function onContainerJolokia(containerJolokia, container, id, brokers) {
+         function createQueues(brokers) {
+            if ($scope.viewSettings.queue) {
+               containerJolokia.search(artemisJmxDomain + ":*,subcomponent=queues", onSuccess(function (response) {
+                  angular.forEach(response, function (objectName) {
+                     var details = Core.parseMBean(objectName);
+                     if (details) {
+                        var properties = details['attributes'];
+                        if (properties) {
+                           configureDestinationProperties(properties);
+                           var brokerName = properties.broker;
+                           var addressName = properties.address;
+                           var typeName = "queue";
+                           var queueName = properties.queue;
+                           var routingType = properties["routing-type"];
+                           var destination = getOrAddQueue(properties, typeName, routingType, queueName, addressName, brokerName);
+                        }
+                     }
+                  });
+                  graphModelUpdated();
+                  createConsumersAndNetwork(brokers);
+               }));
+            } else {
+               createConsumersAndNetwork(brokers);
+            }
+         }
+
+         function createAddresses(brokers) {
+            if ($scope.viewSettings.address) {
+               containerJolokia.search(artemisJmxDomain + ":*,component=addresses", onSuccess(function (response) {
+                  angular.forEach(response, function (objectName) {
+                     var details = Core.parseMBean(objectName);
+                     if (details) {
+                        var properties = details['attributes'];
+                        if (properties) {
+                           var brokerName = properties.broker;
+                           var typeName = "address";
+                           var addressName = properties.address;
+                           var destination = getOrAddAddress(properties, typeName, addressName, brokerName);
+                        }
+                     }
+                  });
+                  createQueues(brokers);
+                  graphModelUpdated();
+               }));
+            } else {
+               createQueues(brokers);
+            }
+         }
+
+         function createConsumersAndNetwork(brokers) {
+            angular.forEach(brokers, function (broker) {
+               mBean = artemisJmxDomain + ":broker=" + broker.brokerId;
+               // find consumers
+               if ($scope.viewSettings.consumer) {
+                  ARTEMISService.artemisConsole.getConsumers(mBean, containerJolokia, onSuccess(function (properties) {
+                     consumers = properties.value;
+                     ARTEMIS.log.info(consumers);
+                     angular.forEach(angular.fromJson(consumers), function (consumer) {
+                        if (consumer) {
+
+                           configureDestinationProperties(consumer);
+                           var consumerId = consumer.sessionID + "-" + consumer.consumerID;
+                           if (consumerId) {
+                              var queueName = consumer.queueName;
+                              var consumerNode = getOrAddNode("consumer", consumerId, consumer, function () {
+                                 return {
+                                    typeLabel: "Consumer",
+                                    brokerContainer: container,
+                                    //objectName: "null",
+                                    jolokia: containerJolokia,
+                                    popup: {
+                                       title: "Consumer: " + consumerId,
+                                       content: "<p>client: " + (consumer.connectionID || "") + "</p> " + brokerNameMarkup(broker.brokerId)
+                                    }
+                                 };
+                              });
+                              addLinkIds("queue:\"" + queueName + "\"", consumerNode["id"], "consumer");
+                           }
+                        }
+                     });
+                     graphModelUpdated();
+                  }));
+               }
+
+
+               // find networks of brokers
+               if ($scope.viewSettings.network && $scope.viewSettings.broker) {
+
+                  ARTEMISService.artemisConsole.getRemoteBrokers(mBean, containerJolokia, onSuccess(function (properties) {
+                     remoteBrokers = properties.value;
+
+                     ARTEMIS.log.info("remoteBrokers=" + angular.toJson(remoteBrokers))
+                     angular.forEach(angular.fromJson(remoteBrokers), function (remoteBroker) {
+                        if (remoteBroker) {
+                           ARTEMIS.log.info("remote=" + angular.toJson(remoteBroker))
+                           if (broker.nodeId != remoteBroker.nodeID) {
+                              getOrAddBroker(true, "\"" + remoteBroker.live + "\"", remoteBroker.nodeID, "remote", null, properties);
+                              addLinkIds("broker:" + broker.brokerId, "broker:" + "\"" + remoteBroker.live + "\"", "network");
+
+                              var backup = remoteBroker.backup;
+                              if (backup) {
+                                 getOrAddBroker(false, "\"" + backup + "\"", remoteBroker.nodeID, "remote", null, properties);
+                                 addLinkIds("broker:" + "\"" + remoteBroker.live + "\"", "broker:" + "\"" + backup + "\"", "network");
+                              }
+                           }
+                           else {
+                              var backup = remoteBroker.backup;
+                              if (backup) {
+                                 getOrAddBroker(false, "\"" + remoteBroker.backup + "\"", remoteBroker.nodeID, "remote", null, properties);
+                                 addLinkIds("broker:" + broker.brokerId, "broker:" + "\"" + remoteBroker.backup + "\"", "network");
+                              }
+                           }
+                        }
+                     });
+                     graphModelUpdated();
+                  }));
+               }
+            });
+         }
+
+         if (containerJolokia) {
+            container.jolokia = containerJolokia;
+            function getOrAddQueue(properties, typeName, routingType, queueName, addressName, brokerName) {
+               var queue = getOrAddNode(typeName.toLowerCase(), queueName, properties, function () {
+                  var objectName = "";
+                  if (addressName) {
+                     objectName = artemisJmxDomain + ":broker=" + brokerName + ",component=addresses,address=" + addressName + ",subcomponent=queues,routing-type=" + routingType + ",queue=" + queueName;
+                     
+                  }
+                  ARTEMIS.log.info(objectName);
+                  var answer = {
+                     typeLabel: typeName,
+                     brokerContainer: container,
+                     objectName: objectName,
+                     jolokia: containerJolokia,
+                     popup: {
+                        title: "queue: " + queueName,
+                        content: "address:" + addressName
+                     }
+                  };
+                  if (!addressName) {
+                     containerJolokia.search(artemisJmxDomain + ":broker=" + brokerName + ",component=addresses,address=" + addressName + ",subcomponent=queues,routing-type=" + routingType + ",queue=" + queueName + ",*", onSuccess(function (response) {
+                        if (response && response.length) {
+                           answer.objectName = response[0];
+                        }
+                     }));
+                  }
+                  return answer;
+               });
+               if (queue && $scope.viewSettings.broker && addressName) {
+                  addLinkIds("address:" + addressName, queue["id"], "queue");
+               }
+               return queue;
+            }
+
+            function getOrAddAddress(properties, typeName, destinationName, brokerName) {
+               var destination = getOrAddNode(typeName.toLowerCase(), destinationName, properties, function () {
+                  var objectName = "";
+                  if (brokerName) {
+                     objectName = artemisJmxDomain + ":broker=" + brokerName + ",component=addresses,address=" + destinationName;
+                  }
+                  var answer = {
+                     typeLabel: typeName,
+                     brokerContainer: container,
+                     objectName: objectName,
+                     jolokia: containerJolokia,
+                     popup: {
+                        title: typeName + ": " + destinationName,
+                        content: brokerNameMarkup(brokerName)
+                     }
+                  };
+                  if (!brokerName) {
+                     containerJolokia.search(artemisJmxDomain + ":broker=" + brokerName + ",component=addresses,address=" + destinationName + ",*", onSuccess(function (response) {
+                        if (response && response.length) {
+                           answer.objectName = response[0];
+                        }
+                     }));
+                  }
+                  return answer;
+               });
+               if (destination && $scope.viewSettings.broker && brokerName) {
+                  addLinkIds(brokerNodeId(brokerName), destination["id"], "address");
+               }
+               return destination;
+            }
+
+            createAddresses(brokers);
+         }
+      }
+
+      function graphModelUpdated() {
+         $scope.graph = graphBuilder.buildGraph();
+         Core.$apply($scope);
+      }
+
+      function getOrAddBroker(master, brokerId, nodeId, containerId, container, brokerStatus) {
+         var broker = null;
+         var brokerFlag = master ? $scope.viewSettings.broker : $scope.viewSettings.slave;
+         if (brokerFlag) {
+            broker = getOrAddNode("broker", brokerId, brokerStatus, function () {
+               return {
+                  type: master ? "broker" : "brokerSlave",
+                  typeLabel: master ? "Broker" : "Slave Broker",
+                  popup: {
+                     title: (master ? "Master" : "Slave") + " Broker: " + brokerId,
+                     content: "<p>Container: " + containerId + "</p> Node ID: " + nodeId
+                  }
+               };
+            });
+            if (!broker['objectName']) {
+               // lets try guess the mbean name
+               broker['objectName'] = artemisJmxDomain + ":broker=" + brokerId;
+               ARTEMIS.log.debug("Guessed broker mbean: " + broker['objectName']);
+            }
+            if (!broker['brokerContainer'] && container) {
+               broker['brokerContainer'] = container;
+            }
+            if (!broker['nodeID']) {
+               broker['nodeID'] = nodeId;
+            }
+         }
+         return broker;
+      }
+
+      function getOrAddNode(typeName, id, properties, createFn) {
+         var node = null;
+         if (id) {
+            var nodeId = typeName + ":" + id;
+            node = graphBuilder.getNode(nodeId);
+            if (!node) {
+               var nodeValues = createFn();
+               node = angular.copy(properties);
+
+               angular.forEach(nodeValues, function (value, key) {
+                  return node[key] = value;
+               });
+               node['id'] = nodeId;
+               if (!node['type']) {
+                  node['type'] = typeName;
+               }
+               if (!node['name']) {
+                  node['name'] = id;
+               }
+               if (node) {
+                  var size = $scope.shapeSize[typeName];
+                  if (size && !node['size']) {
+                     node['size'] = size;
+                  }
+                  if (!node['summary']) {
+                     node['summary'] = node['popup'] || "";
+                  }
+                  if (!$scope.viewSettings.popup) {
+                     delete node['popup'];
+                  }
+                  if (!$scope.viewSettings.label) {
+                     delete node['name'];
+                  }
+                  // lets not add nodes which are defined as being disabled
+                  var enabled = $scope.viewSettings[typeName];
+                  if (enabled || !angular.isDefined(enabled)) {
+                     graphBuilder.addNode(node);
+                  }
+                  else {
+                  }
+               }
+            }
+         }
+         return node;
+      }
+
+      function addLink(object1, object2, linkType) {
+         if (object1 && object2) {
+            addLinkIds(object1.id, object2.id, linkType);
+         }
+      }
+
+      function addLinkIds(id1, id2, linkType) {
+         ARTEMIS.log.info("adding " + id1 + " to " + id2 + " " + linkType)
+         if (id1 && id2) {
+            graphBuilder.addLink(id1, id2, linkType);
+         }
+      }
+
+      function brokerNodeId(brokerId) {
+         return brokerId ? "broker:" + brokerId : null;
+      }
+
+      /**
+       * Avoid the JMX type property clashing with the ForceGraph type property; used for associating css classes with nodes on the graph
+       *
+       * @param properties
+       */
+      function renameTypeProperty(properties) {
+         properties.mbeanType = properties['type'];
+         delete properties['type'];
+      }
+
+      function configureDestinationProperties(properties) {
+         renameTypeProperty(properties);
+         var destinationType = properties.destinationType || "Queue";
+         var typeName = destinationType.toLowerCase();
+         properties.isQueue = !typeName.startsWith("t");
+         properties['destType'] = typeName;
+      }
+   };
+
+   return ARTEMIS;
+} (ARTEMIS || {}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/browse.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/browse.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/browse.js
new file mode 100644
index 0000000..9ced888
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/browse.js
@@ -0,0 +1,499 @@
+/*
+ * 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 ARTEMIS
+ */
+var ARTEMIS = (function(ARTEMIS) {
+
+    ARTEMIS.BrowseQueueController = function ($scope, workspace, ARTEMISService, jolokia, localStorage, artemisMessage, $location, $timeout) {
+       $scope.searchText = '';
+       $scope.allMessages = [];
+       $scope.messages = [];
+       $scope.headers = {};
+       $scope.mode = 'text';
+       $scope.deleteDialog = false;
+       $scope.moveDialog = false;
+       $scope.gridOptions = {
+          selectedItems: [],
+          data: 'messages',
+          displayFooter: false,
+          showFilter: false,
+          showColumnMenu: true,
+          enableColumnResize: true,
+          enableColumnReordering: true,
+          enableHighlighting: true,
+          filterOptions: {
+             filterText: '',
+             useExternalFilter: true
+          },
+          selectWithCheckboxOnly: true,
+          showSelectionCheckbox: true,
+          maintainColumnRatios: false,
+          columnDefs: [
+             {
+                field: 'messageID',
+                displayName: 'Message ID',
+                cellTemplate: '<div class="ngCellText"><a ng-click="openMessageDialog(row)">{{row.entity.messageID}}</a></div>',
+                // for ng-grid
+                width: '10%'
+             },
+             {
+                field: 'userID',
+                displayName: 'User ID',
+                width: '10%'
+             },
+             {
+                field: 'type',
+                displayName: 'Type',
+                width: '10%'
+             },
+             {
+                field: 'durable',
+                displayName: 'Durable',
+                width: '10%'
+             },
+             {
+                field: 'priority',
+                displayName: 'Priority',
+                width: '7%'
+             },
+             {
+                field: 'timestamp',
+                displayName: 'Timestamp',
+                width: '19%'
+             },
+             {
+                field: 'expiration',
+                displayName: 'Expires',
+                width: '10%'
+             },
+              {
+                 field: 'redelivered',
+                 displayName: 'Redelivered',
+                 width: '10%'
+              }
+          ],
+          afterSelectionChange: afterSelectionChange
+       };
+       $scope.showMessageDetails = false;
+       var ignoreColumns = ["PropertiesText", "BodyPreview", "text"];
+       var flattenColumns = ["BooleanProperties", "ByteProperties", "ShortProperties", "IntProperties", "LongProperties", "FloatProperties", "DoubleProperties", "StringProperties"];
+       $scope.$watch('workspace.selection', function () {
+          if (workspace.moveIfViewInvalid()) {
+             return;
+          }
+          // lets defer execution as we may not have the selection just yet
+          setTimeout(loadTable, 50);
+       });
+       $scope.$watch('gridOptions.filterOptions.filterText', function (filterText) {
+          filterMessages(filterText);
+       });
+       $scope.openMessageDialog = function (message) {
+          ARTEMIS.selectCurrentMessage(message, "messageID", $scope);
+          if ($scope.row) {
+             $scope.mode = CodeEditor.detectTextFormat($scope.row.Text);
+             $scope.showMessageDetails = true;
+          }
+       };
+       $scope.refresh = loadTable;
+       ARTEMIS.decorate($scope);
+       $scope.moveMessages = function () {
+          var selection = workspace.selection;
+          var mbean = selection.objectName;
+          if (mbean && selection) {
+             var selectedItems = $scope.gridOptions.selectedItems;
+             $scope.message = "Moved " + Core.maybePlural(selectedItems.length, "message" + " to " + $scope.queueName);
+             var operation = "moveMessageTo(java.lang.String, java.lang.String)";
+             angular.forEach(selectedItems, function (item, idx) {
+                var id = item.messageID;
+                if (id) {
+                   var callback = (idx + 1 < selectedItems.length) ? intermediateResult : moveSuccess;
+                   jolokia.execute(mbean, operation, id, $scope.queueName, onSuccess(callback));
+                   ARTEMISService.artemisConsole.moveMessage(mbean, jolokia, id, $scope.queueName, onSuccess(callback));
+                }
+             });
+          }
+       };
+       $scope.resendMessage = function () {
+          var selection = workspace.selection;
+          var mbean = selection.objectName;
+          if (mbean && selection) {
+             var selectedItems = $scope.gridOptions.selectedItems;
+             //always assume a single message
+             artemisMessage.message = selectedItems[0];
+             $location.path('artemis/sendMessage');
+          }
+       };
+       $scope.deleteMessages = function () {
+          var selection = workspace.selection;
+          var mbean = selection.objectName;
+          if (mbean && selection) {
+             var selectedItems = $scope.gridOptions.selectedItems;
+             $scope.message = "Deleted " + Core.maybePlural(selectedItems.length, "message");
+             angular.forEach(selectedItems, function (item, idx) {
+                var id = item.messageID;
+                if (id) {
+                   var callback = (idx + 1 < selectedItems.length) ? intermediateResult : operationSuccess;
+                   ARTEMISService.artemisConsole.deleteMessage(mbean, jolokia, id, onSuccess(callback));
+                }
+             });
+          }
+       };
+       $scope.retryMessages = function () {
+          var selection = workspace.selection;
+          var mbean = selection.objectName;
+          if (mbean && selection) {
+             var selectedItems = $scope.gridOptions.selectedItems;
+             $scope.message = "Retry " + Core.maybePlural(selectedItems.length, "message");
+             var operation = "retryMessage(java.lang.String)";
+             angular.forEach(selectedItems, function (item, idx) {
+                var id = item.messageID;
+                if (id) {
+                   var callback = (idx + 1 < selectedItems.length) ? intermediateResult : operationSuccess;
+                   jolokia.execute(mbean, operation, id, onSuccess(callback));
+                   ARTEMISService.artemisConsole.retryMessage(mbean, jolokia, id, onSuccess(callback));
+                }
+             });
+          }
+       };
+       $scope.queueNames = function (completionText) {
+          var queuesFolder = ARTEMIS.getSelectionQueuesFolder(workspace);
+          if (queuesFolder) {
+             var selectedQueue = workspace.selection.key;
+             var otherQueues = queuesFolder.children.exclude(function (child) {
+                return child.key == selectedQueue;
+             });
+             return (otherQueues) ? otherQueues.map(function (n) {
+                return n.title;
+             }) : [];
+          }
+          else {
+             return [];
+          }
+       };
+       function populateTable(response) {
+          var data = response.value;
+          ARTEMIS.log.info("loading data:" + data);
+
+          if (!angular.isArray(data)) {
+             $scope.allMessages = [];
+             angular.forEach(data, function (value, idx) {
+                $scope.allMessages.push(value);
+             });
+          }
+          else {
+             $scope.allMessages = data;
+          }
+          angular.forEach($scope.allMessages, function (message) {
+             message.headerHtml = createHeaderHtml(message);
+             message.bodyText = createBodyText(message);
+          });
+          filterMessages($scope.gridOptions.filterOptions.filterText);
+          Core.$apply($scope);
+       }
+
+       /*
+        * For some reason using ng-repeat in the modal dialog doesn't work so lets
+        * just create the HTML in code :)
+        */
+       function createBodyText(message) {
+
+          ARTEMIS.log.info("loading message:" + message);
+          if (message.text) {
+             var body = message.text;
+             var lenTxt = "" + body.length;
+             message.textMode = "text (" + lenTxt + " chars)";
+             return body;
+          }
+          else if (message.BodyPreview) {
+             var code = Core.parseIntValue(localStorage["ARTEMISBrowseBytesMessages"] || "1", "browse bytes messages");
+             var body;
+             message.textMode = "bytes (turned off)";
+             if (code != 99) {
+                var bytesArr = [];
+                var textArr = [];
+                message.BodyPreview.forEach(function (b) {
+                   if (code === 1 || code === 2) {
+                      // text
+                      textArr.push(String.fromCharCode(b));
+                   }
+                   if (code === 1 || code === 4) {
+                      // hex and must be 2 digit so they space out evenly
+                      var s = b.toString(16);
+                      if (s.length === 1) {
+                         s = "0" + s;
+                      }
+                      bytesArr.push(s);
+                   }
+                   else {
+                      // just show as is without spacing out, as that is usually more used for hex than decimal
+                      var s = b.toString(10);
+                      bytesArr.push(s);
+                   }
+                });
+                var bytesData = bytesArr.join(" ");
+                var textData = textArr.join("");
+                if (code === 1 || code === 2) {
+                   // bytes and text
+                   var len = message.BodyPreview.length;
+                   var lenTxt = "" + textArr.length;
+                   body = "bytes:\n" + bytesData + "\n\ntext:\n" + textData;
+                   message.textMode = "bytes (" + len + " bytes) and text (" + lenTxt + " chars)";
+                }
+                else {
+                   // bytes only
+                   var len = message.BodyPreview.length;
+                   body = bytesData;
+                   message.textMode = "bytes (" + len + " bytes)";
+                }
+             }
+             return body;
+          }
+          else {
+             message.textMode = "unsupported";
+             return "Unsupported message body type which cannot be displayed by hawtio";
+          }
+       }
+
+       /*
+        * For some reason using ng-repeat in the modal dialog doesn't work so lets
+        * just create the HTML in code :)
+        */
+       function createHeaderHtml(message) {
+          var headers = createHeaders(message);
+          var properties = createProperties(message);
+          var headerKeys = Object.extended(headers).keys();
+
+          function sort(a, b) {
+             if (a > b)
+                return 1;
+             if (a < b)
+                return -1;
+             return 0;
+          }
+
+          var propertiesKeys = Object.extended(properties).keys().sort(sort);
+          var jmsHeaders = headerKeys.filter(function (key) {
+             return key.startsWith("JMS");
+          }).sort(sort);
+          var remaining = headerKeys.subtract(jmsHeaders, propertiesKeys).sort(sort);
+          var buffer = [];
+
+          function appendHeader(key) {
+             var value = headers[key];
+             if (value === null) {
+                value = '';
+             }
+             buffer.push('<tr><td class="propertyName"><span class="green">Header</span> - ' + key + '</td><td class="property-value">' + value + '</td></tr>');
+          }
+
+          function appendProperty(key) {
+             var value = properties[key];
+             if (value === null) {
+                value = '';
+             }
+             buffer.push('<tr><td class="propertyName">' + key + '</td><td class="property-value">' + value + '</td></tr>');
+          }
+
+          jmsHeaders.forEach(appendHeader);
+          remaining.forEach(appendHeader);
+          propertiesKeys.forEach(appendProperty);
+          return buffer.join("\n");
+       }
+
+       function createHeaders(row) {
+          var answer = {};
+          angular.forEach(row, function (value, key) {
+             if (!ignoreColumns.any(key) && !flattenColumns.any(key)) {
+                answer[Core.escapeHtml(key)] = Core.escapeHtml(value);
+             }
+          });
+          return answer;
+       }
+
+       function createProperties(row) {
+          ARTEMIS.log.debug("properties: ", row);
+          var answer = {};
+          angular.forEach(row, function (value, key) {
+             if (!ignoreColumns.any(key) && flattenColumns.any(key)) {
+                angular.forEach(value, function (v2, k2) {
+                   answer['<span class="green">' + key.replace('Properties', ' Property') + '</span> - ' + Core.escapeHtml(k2)] = Core.escapeHtml(v2);
+                });
+             }
+          });
+          return answer;
+       }
+
+       function loadTable() {
+          ARTEMIS.log.info("loading table")
+          var objName;
+          $scope.gridOptions.selectedItems.length = 0;
+          if (workspace.selection) {
+             objName = workspace.selection.objectName;
+          }
+          else {
+             // in case of refresh
+             var key = location.search()['nid'];
+             var node = workspace.keyToNodeMap[key];
+             objName = node.objectName;
+          }
+          if (objName) {
+             $scope.dlq = false;
+             var queueName = jolokia.getAttribute(objName, "Name");
+
+             var artemisDLQ = localStorage['artemisDLQ'] || "DLQ";
+             var artemisExpiryQueue = localStorage['artemisExpiryQueue'] || "ExpiryQueue";
+             ARTEMIS.log.info("loading table" + artemisExpiryQueue);
+             if (queueName == artemisDLQ || queueName == artemisExpiryQueue) {
+                onDlq(true);
+             }
+             else {
+                onDlq(false);
+             }
+             ARTEMISService.artemisConsole.browse(objName, jolokia, onSuccess(populateTable));
+          }
+       }
+
+       function onDlq(response) {
+          ARTEMIS.log.info("onDLQ=" + response);
+          $scope.dlq = response;
+          Core.$apply($scope);
+       }
+
+       function intermediateResult() {
+       }
+
+       function operationSuccess() {
+          $scope.messageDialog = false;
+          deselectAll();
+          Core.notification("success", $scope.message);
+          loadTable();
+          setTimeout(loadTable, 50);
+       }
+
+       function moveSuccess() {
+          operationSuccess();
+          workspace.loadTree();
+       }
+
+       function filterMessages(filter) {
+          var searchConditions = buildSearchConditions(filter);
+          evalFilter(searchConditions);
+       }
+
+       function evalFilter(searchConditions) {
+          if (!searchConditions || searchConditions.length === 0) {
+             $scope.messages = $scope.allMessages;
+          }
+          else {
+             ARTEMIS.log.debug("Filtering conditions:", searchConditions);
+             $scope.messages = $scope.allMessages.filter(function (message) {
+                ARTEMIS.log.debug("Message:", message);
+                var matched = true;
+                $.each(searchConditions, function (index, condition) {
+                   if (!condition.column) {
+                      matched = matched && evalMessage(message, condition.regex);
+                   }
+                   else {
+                      matched = matched && (message[condition.column] && condition.regex.test(message[condition.column])) || (message.StringProperties && message.StringProperties[condition.column] && condition.regex.test(message.StringProperties[condition.column]));
+                   }
+                });
+                return matched;
+             });
+          }
+       }
+
+       function evalMessage(message, regex) {
+          var jmsHeaders = ['JMSDestination', 'JMSDeliveryMode', 'JMSExpiration', 'JMSPriority', 'JMSmessageID', 'JMSTimestamp', 'JMSCorrelationID', 'JMSReplyTo', 'JMSType', 'JMSRedelivered'];
+          for (var i = 0; i < jmsHeaders.length; i++) {
+             var header = jmsHeaders[i];
+             if (message[header] && regex.test(message[header])) {
+                return true;
+             }
+          }
+          if (message.StringProperties) {
+             for (var property in message.StringProperties) {
+                if (regex.test(message.StringProperties[property])) {
+                   return true;
+                }
+             }
+          }
+          if (message.bodyText && regex.test(message.bodyText)) {
+             return true;
+          }
+          return false;
+       }
+
+       function getRegExp(str, modifiers) {
+          try {
+             return new RegExp(str, modifiers);
+          }
+          catch (err) {
+             return new RegExp(str.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\\|\||\.|\*|\+|\?)/g, '\\$1'));
+          }
+       }
+
+       function buildSearchConditions(filterText) {
+          var searchConditions = [];
+          var qStr;
+          if (!(qStr = $.trim(filterText))) {
+             return;
+          }
+          var columnFilters = qStr.split(";");
+          for (var i = 0; i < columnFilters.length; i++) {
+             var args = columnFilters[i].split(':');
+             if (args.length > 1) {
+                var columnName = $.trim(args[0]);
+                var columnValue = $.trim(args[1]);
+                if (columnName && columnValue) {
+                   searchConditions.push({
+                      column: columnName,
+                      columnDisplay: columnName.replace(/\s+/g, '').toLowerCase(),
+                      regex: getRegExp(columnValue, 'i')
+                   });
+                }
+             }
+             else {
+                var val = $.trim(args[0]);
+                if (val) {
+                   searchConditions.push({
+                      column: '',
+                      regex: getRegExp(val, 'i')
+                   });
+                }
+             }
+          }
+          return searchConditions;
+       }
+
+       function afterSelectionChange(rowItem, checkAll) {
+          if (checkAll === void 0) {
+             // then row was clicked, not select-all checkbox
+             $scope.gridOptions['$gridScope'].allSelected = rowItem.config.selectedItems.length == $scope.messages.length;
+          }
+          else {
+             $scope.gridOptions['$gridScope'].allSelected = checkAll;
+          }
+       }
+
+       function deselectAll() {
+          $scope.gridOptions['$gridScope'].allSelected = false;
+       }
+    }
+
+       return ARTEMIS;
+   } (ARTEMIS || {}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/jmsHeaderSchema.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/jmsHeaderSchema.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/jmsHeaderSchema.js
new file mode 100644
index 0000000..89bbd9d
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/jmsHeaderSchema.js
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var ARTEMIS;
+(function (ARTEMIS) {
+    ARTEMIS.jmsHeaderSchema = {
+        definitions: {
+            headers: {
+                properties: {
+                    JMSCorrelationID: {
+                        type: "java.lang.String"
+                    },
+                    JMSDeliveryMode: {
+                        "type": "string",
+                        "enum": [
+                            "PERSISTENT",
+                            "NON_PERSISTENT"
+                        ]
+                    },
+                    JMSDestination: {
+                        type: "javax.jms.Destination"
+                    },
+                    JMSExpiration: {
+                        type: "long"
+                    },
+                    JMSPriority: {
+                        type: "int"
+                    },
+                    JMSReplyTo: {
+                        type: "javax.jms.Destination"
+                    },
+                    JMSType: {
+                        type: "java.lang.String"
+                    },
+                    JMSXGroupId: {
+                        type: "java.lang.String"
+                    },
+                    _AMQ_SCHED_DELIVERY: {
+                        type: "java.lang.String"
+                    }
+                }
+            },
+            "javax.jms.Destination": {
+                type: "java.lang.String"
+            }
+        }
+    };
+})(ARTEMIS || (ARTEMIS = {}));
+//# sourceMappingURL=jmsHeaderSchema.js.map
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/preferences.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/preferences.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/preferences.js
new file mode 100644
index 0000000..f66d7d9
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/preferences.js
@@ -0,0 +1,54 @@
+/*
+ * 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 ARTEMIS
+ */
+var ARTEMIS = (function(ARTEMIS) {
+
+   /**
+    * @method PreferencesController
+    * @param $scope
+    *
+    * Controller for the Preferences interface
+    */
+   ARTEMIS.PreferencesController = function ($scope, localStorage, userDetails, $rootScope) {
+      Core.initPreferenceScope($scope, localStorage, {
+         'artemisUserName': {
+            'value': userDetails.username
+         },
+         'artemisPassword': {
+            'value': userDetails.password
+         },
+         'artemisDLQ': {
+            'value': "DLQ"
+         },
+         'artemisExpiryQueue': {
+            'value': "ExpiryQueue"
+         },
+         'artemisBrowseBytesMessages': {
+            'value': 1,
+            'converter': parseInt,
+            'formatter': function (value) {
+               return "" + value;
+            }
+         }
+      });
+   };
+
+   return ARTEMIS;
+
+}(ARTEMIS || {}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/queue.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/queue.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/queue.js
new file mode 100644
index 0000000..1cfb2de
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/queue.js
@@ -0,0 +1,152 @@
+/*
+ * 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 ARTEMIS
+ */
+var ARTEMIS = (function(ARTEMIS) {
+
+    /**
+     * @method QueueController
+     * @param $scope
+     * @param ARTEMISService
+     *
+     * Controller for the Create interface
+     */
+    ARTEMIS.QueueController = function ($scope, workspace, ARTEMISService, jolokia, localStorage) {
+        Core.initPreferenceScope($scope, localStorage, {
+            'durable': {
+                'value': true,
+                'converter': Core.parseBooleanValue
+            },
+            'routingType': {
+                'value': 0,
+                'converter': parseInt,
+                'formatter': parseInt
+            },
+            'maxConsumers': {
+                'value': -1,
+                'converter': parseInt,
+                'formatter': parseInt
+            },
+            'purgeWhenNoConsumers': {
+                'value': false,
+                'converter': Core.parseBooleanValue
+            }
+        });
+        var artemisJmxDomain = localStorage['artemisJmxDomain'] || "org.apache.activemq.artemis";
+        $scope.workspace = workspace;
+        $scope.message = "";
+        $scope.queueType = 'true';
+        $scope.deleteDialog = false;
+        $scope.purgeDialog = false;
+        $scope.$watch('workspace.selection', function () {
+            workspace.moveIfViewInvalid();
+        });
+        function operationSuccess() {
+            $scope.queueName = "";
+            $scope.workspace.operationCounter += 1;
+            Core.$apply($scope);
+            Core.notification("success", $scope.message);
+            $scope.workspace.loadTree();
+        }
+        function deleteSuccess() {
+            // lets set the selection to the parent
+            workspace.removeAndSelectParentNode();
+            $scope.workspace.operationCounter += 1;
+            Core.$apply($scope);
+            Core.notification("success", $scope.message);
+            $scope.workspace.loadTree();
+        }
+        $scope.createQueue = function (queueName, routingType, durable, filter, maxConsumers, purgeWhenNoConsumers) {
+            var mbean = getBrokerMBean(jolokia);
+            if (mbean) {
+                var selection = workspace.selection;
+                var entries = selection.entries;
+                var address = entries["address"];
+                if (address.charAt(0) === '"' && address.charAt(address.length -1) === '"')
+                {
+                    address = address.substr(1,address.length -2);
+                }
+                $scope.message = "Created queue " + queueName + " durable=" + durable + " filter=" + filter + " on address " + address;
+                if (routingType == 0) {
+                    ARTEMIS.log.info($scope.message);
+                    ARTEMISService.artemisConsole.createQueue(mbean, jolokia, address, "MULTICAST", queueName, durable, filter, maxConsumers, purgeWhenNoConsumers, onSuccess(operationSuccess));
+                    ARTEMIS.log.info("executed");
+                } else {
+                   ARTEMIS.log.info($scope.message);
+                   ARTEMISService.artemisConsole.createQueue(mbean, jolokia, address, "ANYCAST", queueName, durable, filter, maxConsumers, purgeWhenNoConsumers, onSuccess(operationSuccess));
+                   ARTEMIS.log.info("executed");
+                }
+            }
+        };
+        $scope.deleteDestination = function (isQueue) {
+            var selection = workspace.selection;
+            var entries = selection.entries;
+            var mbean = getBrokerMBean(jolokia);
+            ARTEMIS.log.info(mbean);
+            if (mbean) {
+                if (selection && jolokia && entries) {
+                    var domain = selection.domain;
+                    var name = entries["Destination"] || entries["destinationName"] || selection.title;
+                    name = name.replace(/['"]+/g, '');
+                    ARTEMIS.log.info(name);
+                    var operation;
+                    if (isQueue) {
+                        $scope.message = "Deleted queue " + name;
+                        ARTEMISService.artemisConsole.deleteQueue(mbean, jolokia, name, onSuccess(deleteSuccess));
+                    }
+                    else {
+                        $scope.message = "Deleted topic " + name;
+                        ARTEMISService.artemisConsole.deleteTopic(mbean, jolokia, name, onSuccess(deleteSuccess));
+                    }
+                }
+            }
+        };
+        $scope.purgeDestination = function () {
+            var selection = workspace.selection;
+            var entries = selection.entries;
+            var mbean = getBrokerMBean(jolokia);
+            if (mbean) {
+                if (selection && jolokia && entries) {
+                    var name = entries["Destination"] || entries["destinationName"] || selection.title;
+                    name = name.unescapeHTML();
+                    var operation = "purge()";
+                    $scope.message = "Purged queue " + name;
+                    ARTEMISService.artemisConsole.purgeQueue(mbean, jolokia, name, onSuccess(deleteSuccess));
+                }
+            }
+        };
+        $scope.name = function () {
+            var selection = workspace.selection;
+            if (selection) {
+                return selection.title;
+            }
+            return null;
+        };
+
+        function getBrokerMBean(jolokia) {
+            var mbean = null;
+            var selection = workspace.selection;
+            var folderNames = selection.folderNames;
+            mbean = "" + folderNames[0] + ":broker=" + folderNames[1];
+            ARTEMIS.log.info("broker=" + mbean);
+            return mbean;
+        }
+    };
+
+    return ARTEMIS;
+} (ARTEMIS || {}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/send.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/send.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/send.js
new file mode 100644
index 0000000..1301387
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/send.js
@@ -0,0 +1,211 @@
+/*
+ * 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 ARTEMIS
+ */
+var ARTEMIS;
+(function (ARTEMIS) {
+    var DELIVERY_PERSISTENT = "2";
+    ARTEMIS.SendMessageController = function($route, $scope, $element, $timeout, workspace, ARTEMISService,  jolokia, localStorage, $location, artemisMessage) {
+        Core.initPreferenceScope($scope, localStorage, {
+            'durable': {
+                'value': true,
+                'converter': Core.parseBooleanValue
+            }
+        });
+        var log = Logger.get("ARTEMIS");
+        $scope.noCredentials = false;
+        $scope.showChoose = false;
+        $scope.profileFileNames = [];
+        $scope.profileFileNameToProfileId = {};
+        $scope.selectedFiles = {};
+        $scope.container = {};
+        $scope.message = "\n\n\n\n";
+        $scope.headers = [];
+        // bind model values to search params...
+        Core.bindModelToSearchParam($scope, $location, "tab", "subtab", "compose");
+        Core.bindModelToSearchParam($scope, $location, "searchText", "q", "");
+        // only reload the page if certain search parameters change
+        Core.reloadWhenParametersChange($route, $scope, $location);
+        $scope.checkCredentials = function () {
+           ARTEMIS.log.info(localStorage['artemisUserName'] + " " + localStorage['artemisPassword']);
+            $scope.noCredentials = (Core.isBlank(localStorage['artemisUserName']) || Core.isBlank(localStorage['artemisPassword']));
+        };
+        if ($location.path().has('artemis')) {
+            $scope.localStorage = localStorage;
+            $scope.$watch('localStorage.artemisUserName', $scope.checkCredentials);
+            $scope.$watch('localStorage.artemisPassword', $scope.checkCredentials);
+            //prefill if it's a resent
+            if (artemisMessage.message !== null) {
+                $scope.message = artemisMessage.message.bodyText;
+                if (artemisMessage.message.PropertiesText !== null) {
+                    for (var p in artemisMessage.message.StringProperties) {
+                        $scope.headers.push({name: p, value: artemisMessage.message.StringProperties[p]});
+                    }
+                }
+            }
+            // always reset at the end
+            artemisMessage.message = null;
+        }
+        $scope.openPrefs = function () {
+            $location.search('pref', 'Artemis');
+            $scope.$emit("hawtioOpenPrefs");
+        };
+        var LANGUAGE_FORMAT_PREFERENCE = "defaultLanguageFormat";
+        var sourceFormat = workspace.getLocalStorage(LANGUAGE_FORMAT_PREFERENCE) || "javascript";
+        // TODO Remove this if possible
+        $scope.codeMirror = undefined;
+        var options = {
+            mode: {
+                name: sourceFormat
+            },
+            // Quick hack to get the codeMirror instance.
+            onChange: function (codeMirror) {
+                if (!$scope.codeMirror) {
+                    $scope.codeMirror = codeMirror;
+                }
+            }
+        };
+        $scope.codeMirrorOptions = CodeEditor.createEditorSettings(options);
+        $scope.addHeader = function () {
+            $scope.headers.push({name: "", value: ""});
+            // lets set the focus to the last header
+            if ($element) {
+                $timeout(function () {
+                    var lastHeader = $element.find("input.headerName").last();
+                    lastHeader.focus();
+                }, 100);
+            }
+        };
+        $scope.removeHeader = function (header) {
+            $scope.headers = $scope.headers.remove(header);
+        };
+        $scope.defaultHeaderNames = function () {
+            var answer = [];
+
+            function addHeaderSchema(schema) {
+                angular.forEach(schema.definitions.headers.properties, function (value, name) {
+                    answer.push(name);
+                });
+            }
+
+            if (isJmsEndpoint()) {
+                addHeaderSchema(ARTEMIS.jmsHeaderSchema);
+            }
+            /*if (isARTEMISEndpoint()) {
+                addHeaderSchema(ARTEMIS.ARTEMISHeaderSchema);
+            }*/
+            return answer;
+        };
+        /* save the sourceFormat in preferences for later
+         * Note, this would be controller specific preferences and not the global, overriding, preferences */
+        // TODO Use ng-selected="changeSourceFormat()" - Although it seemed to fire multiple times..
+        $scope.$watch('codeMirrorOptions.mode.name', function (newValue, oldValue) {
+            workspace.setLocalStorage(LANGUAGE_FORMAT_PREFERENCE, newValue);
+        });
+        var sendWorked = function () {
+            Core.notification("success", "Message sent!");
+        };
+        $scope.autoFormat = function () {
+            setTimeout(function () {
+                CodeEditor.autoFormatEditor($scope.codeMirror);
+            }, 50);
+        };
+        $scope.sendMessage = function (durable) {
+            var body = $scope.message;
+           ARTEMIS.log.info(body);
+            doSendMessage(durable, body, sendWorked);
+        };
+        function doSendMessage(durable, body, onSendCompleteFn) {
+            var selection = workspace.selection;
+            if (selection) {
+                var mbean = selection.objectName;
+                if (mbean) {
+                    var headers = null;
+                    if ($scope.headers.length) {
+                        headers = {};
+                        angular.forEach($scope.headers, function (object) {
+                            var key = object.name;
+                            if (key) {
+                                headers[key] = object.value;
+                            }
+                        });
+                        log.info("About to send headers: " + JSON.stringify(headers));
+                    }
+                    var callback = onSuccess(onSendCompleteFn);
+
+                    ARTEMIS.log.info("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
+                    var user = localStorage["artemisUserName"];
+                    var pwd = localStorage["artemisPassword"];
+                    // AMQ is sending non persistent by default, so make sure we tell to sent persistent by default
+                    if (!headers) {
+                        headers = {};
+                    }
+                    var type = 3;
+                    ARTEMISService.artemisConsole.sendMessage(mbean, jolokia, headers, type, body, durable, user, pwd, callback, onSuccess(callback));
+
+                }
+            }
+        }
+
+        $scope.fileSelection = function () {
+            var answer = [];
+            angular.forEach($scope.selectedFiles, function (value, key) {
+                if (value) {
+                    answer.push(key);
+                }
+            });
+            return answer;
+        };
+        $scope.sendSelectedFiles = function () {
+            var filesToSend = $scope.fileSelection();
+            var fileCount = filesToSend.length;
+            var version = $scope.container.versionId || "1.0";
+
+            function onSendFileCompleted(response) {
+                if (filesToSend.length) {
+                    var fileName = filesToSend.pop();
+                    if (fileName) {
+                        // lets load the file data...
+                        var profile = $scope.profileFileNameToProfileId[fileName];
+                        if (profile) {
+                            var body = Fabric.getConfigFile(jolokia, version, profile, fileName);
+                            if (!body) {
+                                log.warn("No body for message " + fileName);
+                                body = "";
+                            }
+                            doSendMessage(body, onSendFileCompleted);
+                        }
+                    }
+                }
+                else {
+                    var text = Core.maybePlural(fileCount, "Message") + " sent!";
+                    Core.notification("success", text);
+                }
+            }
+
+            // now lets start sending
+            onSendFileCompleted(null);
+        };
+
+        function isJmsEndpoint() {
+            // TODO check for the jms/activemq endpoint in ARTEMIS or if its an activemq endpoint
+            return true;
+        }
+    };
+    return ARTEMIS;
+} (ARTEMIS || {}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/tree.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/tree.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/tree.js
new file mode 100644
index 0000000..87c04f4
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/tree.js
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ */
+/// <reference path="artemisPlugin.ts"/>
+var ARTEMIS;
+(function (ARTEMIS) {
+    ARTEMIS.module.controller("ARTEMIS.TreeHeaderController", ["$scope", function ($scope) {
+        $scope.expandAll = function () {
+            Tree.expandAll("#artemistree");
+        };
+        $scope.contractAll = function () {
+            Tree.contractAll("#artemistree");
+        };
+    }]);
+    ARTEMIS.module.controller("ARTEMIS.TreeController", ["$scope", "$location", "workspace", "localStorage", function ($scope, $location, workspace, localStorage) {
+        var artemisJmxDomain = localStorage['artemisJmxDomain'] || "org.apache.activemq.artemis";
+        ARTEMIS.log.info("init tree " + artemisJmxDomain);
+        $scope.$on("$routeChangeSuccess", function (event, current, previous) {
+            // lets do this asynchronously to avoid Error: $digest already in progress
+            setTimeout(updateSelectionFromURL, 50);
+        });
+        $scope.$watch('workspace.tree', function () {
+            reloadTree();
+        });
+        $scope.$on('jmxTreeUpdated', function () {
+            reloadTree();
+        });
+        function reloadTree() {
+            ARTEMIS.log.info("workspace tree has changed, lets reload the artemis tree");
+            var children = [];
+            var tree = workspace.tree;
+
+            ARTEMIS.log.info("tree="+tree);
+            if (tree) {
+                var domainName = artemisJmxDomain;
+                var folder = tree.get(domainName);
+
+                ARTEMIS.log.info("folder="+folder);
+                if (folder) {
+                    children = folder.children;
+                }
+                var treeElement = $("#artemistree");
+                Jmx.enableTree($scope, $location, workspace, treeElement, children, true);
+                // lets do this asynchronously to avoid Error: $digest already in progress
+                setTimeout(updateSelectionFromURL, 50);
+            }
+        }
+        function updateSelectionFromURL() {
+            Jmx.updateTreeSelectionFromURLAndAutoSelect($location, $("#artemistree"), function (first) {
+                // use function to auto select the queue folder on the 1st broker
+                var jms = first.getChildren()[0];
+                ARTEMIS.log.info("%%%%%%" + jms);
+                var queues = jms.getChildren()[0];
+                if (queues && queues.data.title === 'Queue') {
+                    first = queues;
+                    first.expand(true);
+                    return first;
+                }
+                return null;
+            }, true);
+        }
+    }]);
+})(ARTEMIS || (ARTEMIS = {}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/lib/artemis-console.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/lib/artemis-console.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/lib/artemis-console.js
new file mode 100644
index 0000000..948127b
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/lib/artemis-console.js
@@ -0,0 +1,82 @@
+/*
+ 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.
+ Architecture
+ */
+function ArtemisConsole() {
+
+   this.getServerAttributes = function (jolokia, mBean) {
+      var req1 = { type: "read", mbean: mBean};
+      return jolokia.request(req1, {method: "post"});
+   };
+
+   this.createAddress = function (mbean, jolokia, name, routingType,  method) {
+      jolokia.execute(mbean, "createAddress(java.lang.String,java.lang.String)", name, routingType,  method);
+   };
+
+   this.deleteAddress = function (mbean, jolokia, name, method) {
+      jolokia.execute(mbean, "deleteAddress(java.lang.String)", name,  method);
+   };
+
+   this.createQueue = function (mbean, jolokia, address, routingType, name, durable, filter, maxConsumers, purgeWhenNoConsumers, method) {
+      jolokia.execute(mbean, "createQueue(java.lang.String,java.lang.String,java.lang.String,java.lang.String,boolean,int,boolean,boolean)", address, routingType, name, filter, durable, maxConsumers, purgeWhenNoConsumers, true, method);
+   };
+
+   this.deleteQueue = function (mbean, jolokia, name, method) {
+      jolokia.execute(mbean, "destroyQueue(java.lang.String)", name,  method);
+   };
+
+   this.purgeQueue = function (mbean, jolokia, name, method) {
+      //todo
+   };
+
+   this.browse = function (mbean, jolokia, method) {
+      jolokia.request({ type: 'exec', mbean: mbean, operation: 'browse()' }, method);
+   };
+
+   this.deleteMessage = function (mbean, jolokia, id,  method) {
+      ARTEMIS.log.info("executing on " + mbean);
+      jolokia.execute(mbean, "removeMessage(long)", id, method);
+   };
+
+   this.moveMessage = function (mbean, jolokia, id, queueName,  method) {
+      jolokia.execute(mbean, "moveMessage(java.lang.String,java.lang.String)", id, queueName, method);
+   };
+
+   this.retryMessage = function (mbean, jolokia, id, method) {
+      jolokia.execute(mbean, "retryMessage(java.lang.String)", id,  method);
+   };
+
+   this.sendMessage = function (mbean, jolokia, headers, type, body, durable, user, pwd, method) {
+      jolokia.execute(mbean, "sendMessage(java.util.Map, int, java.lang.String, boolean, java.lang.String, java.lang.String)", headers, type, body, durable, user, pwd,  method);
+   };
+
+   this.getConsumers = function (mbean, jolokia, method) {
+      jolokia.request({ type: 'exec', mbean: mbean, operation: 'listAllConsumersAsJSON()' }, method);
+   };
+
+   this.getRemoteBrokers = function (mbean, jolokia, method) {
+      jolokia.request({ type: 'exec', mbean: mbean, operation: 'listNetworkTopology()' }, method);
+   };
+}
+
+function getServerAttributes() {
+   var console = new ArtemisConsole();
+   return console.getVersion(new Jolokia("http://localhost:8161/jolokia/"));
+}
+
+
+
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/pom.xml b/artemis-hawtio/pom.xml
index a12046d..7c60dd9 100644
--- a/artemis-hawtio/pom.xml
+++ b/artemis-hawtio/pom.xml
@@ -98,6 +98,7 @@
 
     <modules>
         <module>activemq-branding</module>
+        <module>artemis-plugin</module>
     </modules>
 
 </project>


[3/6] activemq-artemis git commit: ARTEMIS-1270 Management Console - Hawtio Solution

Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/login-screen-logo.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/login-screen-logo.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/login-screen-logo.png
new file mode 100644
index 0000000..d40baee
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/login-screen-logo.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/logo.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/logo.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/logo.png
new file mode 100644
index 0000000..d61b38e
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/logo.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/js/plugin.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/js/plugin.js b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/js/plugin.js
new file mode 100644
index 0000000..0277c21
--- /dev/null
+++ b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/js/plugin.js
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+/**
+ * The activemq hawtio theme
+ *
+ * @module activemqBranding
+ * @main activemq
+ */
+var activemqBranding = (function (self) {
+
+    self.log = Logger.get("activemq");
+    self.context = '../activemq-branding/';
+    self.pluginName = 'hawtio-activemq-branding';
+
+    hawtioPluginLoader.registerPreBootstrapTask(function (task) {
+        Themes.definitions['activemq'] = {
+            label: 'activemq',
+            file: self.context + 'plugin/css/activemq.css',
+            loginBg: self.context + 'plugin/img/apache-login-background.jpg'
+        };
+        var localStorage = Core.getLocalStorage();
+        if (!('theme' in localStorage)) {
+            localStorage['theme'] = 'activemq';
+        }
+        Themes.brandings['activemq'] = {
+            label: 'activemq',
+            setFunc: function(branding) {
+                branding.appName = 'Management Console';
+                branding.appLogo = self.context + 'plugin/img/activemq.png';
+                branding.logoOnly = false;
+                branding.fullscreenLogin = true;
+                branding.css = self.context + 'plugin/css/branding.css';
+                branding.favicon = self.context + 'plugin/img/favicon.png';
+                branding.welcomePageUrl = self.context + 'plugin/doc/welcome.md';
+                return branding;
+            }
+        }
+        if (!('branding' in localStorage)) {
+            localStorage['branding'] = 'activemq';
+        }
+        task();
+    });
+
+    self.module = angular.module(self.pluginName, ['hawtioCore']);
+    self.module.run(function (branding) {
+        self.log.debug("ActivMQ theme loaded");
+    });
+
+    hawtioPluginLoader.addModule(self.pluginName);
+    return self;
+})(activemqBranding || {});
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/pom.xml b/artemis-hawtio/pom.xml
new file mode 100644
index 0000000..a12046d
--- /dev/null
+++ b/artemis-hawtio/pom.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.activemq</groupId>
+        <artifactId>artemis-pom</artifactId>
+        <version>2.2.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>artemis-hawtio-pom</artifactId>
+    <name>ActiveMQ Artemis HawtIO</name>
+
+    <!-- hawtio plugins are almost always war files -->
+    <packaging>pom</packaging>
+
+    <properties>
+
+        <activemq.basedir>${project.basedir}/..</activemq.basedir>
+
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        
+        <hawtio.version>1.5.2</hawtio.version>
+        <jline.version>3.2.0</jline.version>
+        <jolokia-version>1.3.6</jolokia-version>
+        <junit-version>4.11</junit-version>
+        <log4j-version>1.2.17</log4j-version>
+        <maven-version>3.0.4</maven-version>
+        <maven-antrun-plugin-version>1.7</maven-antrun-plugin-version>
+        <maven-bundle-plugin-version>3.0.1</maven-bundle-plugin-version>
+        <maven-plugin-version>3.3</maven-plugin-version>
+        <maven-source-plugin-version>2.1.2</maven-source-plugin-version>
+        <maven-resources-plugin-version>2.6</maven-resources-plugin-version>
+        <maven-surefire-plugin-version>2.19.1</maven-surefire-plugin-version>
+        <servlet-api-version>2.5</servlet-api-version>
+
+        <!-- use slf4j-api 1.6.x to be easy compatible with older Karaf/Camel releases -->
+        <slf4j-api-version>1.6.6</slf4j-api-version>
+        <slf4j-version>1.7.21</slf4j-version>
+
+        <war-plugin-version>2.1.1</war-plugin-version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- we only need to embed this dependency in the war, this contains
+              a nice helper class that our plugin can use to export it's plugin
+              mbean -->
+            <dependency>
+                <groupId>io.hawt</groupId>
+                <artifactId>hawtio-plugin-mbean</artifactId>
+                <version>${hawtio.version}</version>
+            </dependency>
+
+            <!-- servlet API is provided by the container -->
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>servlet-api</artifactId>
+                <version>${servlet-api-version}</version>
+                <scope>provided</scope>
+            </dependency>
+
+            <!-- logging -->
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>${slf4j-version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-log4j12</artifactId>
+                <version>${slf4j-version}</version>
+                <scope>provided</scope>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+    <modules>
+        <module>activemq-branding</module>
+    </modules>
+
+</project>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-server/src/main/resources/schema/artemis-configuration.xsd
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index fb1d147..87ec201 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -22,8 +22,17 @@
             elementFormDefault="qualified"
             version="1.0">
 
+   <xsd:element name="imports">
+      <xsd:complexType>
+         <xsd:sequence>
+            <xsd:element name="import" maxOccurs="unbounded" type="xsd:string"/>
+         </xsd:sequence>
+         <xsd:attribute name="type"/>
+      </xsd:complexType>
+   </xsd:element>
+   
    <xsd:element name="core" type="configurationType"/>
-
+   
    <xsd:complexType name="configurationType">
       <xsd:all>
          <xsd:element name="name" type="xsd:string" maxOccurs="1" minOccurs="0">

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
index ddff9af..221468a 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
@@ -58,7 +58,7 @@ import org.junit.Test;
 
 public class FileConfigurationTest extends ConfigurationImplTest {
 
-   private final String fullConfigurationName = "ConfigurationTest-full-config.xml";
+   private final String fullConfigurationName = "configurationImport.xml";
 
    @Override
    @Test

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
----------------------------------------------------------------------
diff --git a/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java b/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
index ae3592e..ec60aeb 100644
--- a/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
+++ b/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
@@ -54,4 +54,8 @@ public interface ActiveMQWebLogger extends BasicLogger {
    @LogMessage(level = Logger.Level.WARN)
    @Message(id = 244003, value = "Temporary file not deleted on shutdown: {0}", format = Message.Format.MESSAGE_FORMAT)
    void tmpFileNotDeleted(File tmpdir);
+
+   @LogMessage(level = Logger.Level.INFO)
+   @Message(id = 241004, value = "Artemis Hawtio available at {0}", format = Message.Format.MESSAGE_FORMAT)
+   void hawtioAvailable(String bind);
 }

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
----------------------------------------------------------------------
diff --git a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
index 601ea4c..59ad7b6 100644
--- a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
+++ b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
@@ -55,6 +55,7 @@ public class WebServerComponent implements ExternalComponent {
    private WebServerDTO webServerConfig;
    private URI uri;
    private String jolokiaUrl;
+   private String hawtioUrl;
    private List<WebAppContext> webContexts;
    private ServerConnector connector;
 
@@ -105,6 +106,9 @@ public class WebServerComponent implements ExternalComponent {
             if (app.war.startsWith("jolokia")) {
                jolokiaUrl = webServerConfig.bind + "/" + app.url;
             }
+            if (app.war.startsWith("hawtio")) {
+               hawtioUrl = webServerConfig.bind + "/" + app.url;
+            }
          }
       }
 
@@ -136,6 +140,9 @@ public class WebServerComponent implements ExternalComponent {
       if (jolokiaUrl != null) {
          ActiveMQWebLogger.LOGGER.jolokiaAvailable(jolokiaUrl);
       }
+      if (hawtioUrl != null) {
+         ActiveMQWebLogger.LOGGER.hawtioAvailable(hawtioUrl);
+      }
    }
 
    public void internalStop() throws Exception {

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 1035f69..41db888 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,6 +54,7 @@
       <module>artemis-jdbc-store</module>
       <module>artemis-maven-plugin</module>
       <module>artemis-server-osgi</module>
+      <module>artemis-hawtio</module>
       <module>integration/activemq-spring-integration</module>
       <module>artemis-distribution</module>
       <module>artemis-tools</module>


[4/6] activemq-artemis git commit: ARTEMIS-1270 Management Console - Hawtio Solution

Posted by cl...@apache.org.
ARTEMIS-1270 Management Console - Hawtio Solution

Add Hawtio to web
Add Custom ActiveMQ Hawtio Branding Plugin

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

Branch: refs/heads/master
Commit: cadf909f781e0b48bfa9a4b2dc25a6439a3be3e3
Parents: 2b64ce4
Author: Michael Andre Pearce <Mi...@me.com>
Authored: Tue Jul 4 11:49:40 2017 +0100
Committer: Clebert Suconic <cl...@apache.org>
Committed: Tue Aug 1 14:54:27 2017 -0400

----------------------------------------------------------------------
 .../cli/commands/etc/bootstrap-web-settings.txt |    3 +
 artemis-distribution/pom.xml                    |   23 +-
 artemis-distribution/src/main/assembly/dep.xml  |   27 +
 artemis-hawtio/activemq-branding/pom.xml        |  260 ++
 .../hawtio/branding/PluginContextListener.java  |   71 +
 .../src/main/resources/WEB-INF/web.xml          |   57 +
 .../src/main/webapp/index.html                  |   27 +
 .../src/main/webapp/plugin/css/activemq.css     | 2450 ++++++++++++++++++
 .../src/main/webapp/plugin/css/branding.css     |   43 +
 .../src/main/webapp/plugin/doc/welcome.md       |   15 +
 .../webapp/plugin/img/activemq-artemis-logo.png |  Bin 0 -> 33442 bytes
 .../main/webapp/plugin/img/activemq-logo.png    |  Bin 0 -> 21424 bytes
 .../src/main/webapp/plugin/img/activemq.png     |  Bin 0 -> 16426 bytes
 .../plugin/img/checkbox-background-checked.png  |  Bin 0 -> 355 bytes
 .../plugin/img/checkbox-background-hover.png    |  Bin 0 -> 244 bytes
 .../webapp/plugin/img/checkbox-background.png   |  Bin 0 -> 228 bytes
 .../src/main/webapp/plugin/img/favicon.png      |  Bin 0 -> 5030 bytes
 .../main/webapp/plugin/img/input-background.png |  Bin 0 -> 149 bytes
 .../plugin/img/login-screen-background.png      |  Bin 0 -> 5658 bytes
 .../webapp/plugin/img/login-screen-logo.png     |  Bin 0 -> 28774 bytes
 .../src/main/webapp/plugin/img/logo.png         |  Bin 0 -> 21340 bytes
 .../src/main/webapp/plugin/js/plugin.js         |   66 +
 artemis-hawtio/pom.xml                          |  103 +
 .../resources/schema/artemis-configuration.xsd  |   11 +-
 .../core/config/impl/FileConfigurationTest.java |    2 +-
 .../activemq/artemis/ActiveMQWebLogger.java     |    4 +
 .../artemis/component/WebServerComponent.java   |    7 +
 pom.xml                                         |    1 +
 28 files changed, 3167 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt
index 0647050..7c19c21 100644
--- a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt
+++ b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt
@@ -1,4 +1,7 @@
    <!-- The web server is only bound to localhost by default -->
    <web bind="${web.protocol}://${http.host}:${http.port}" path="web"${extra.web.attributes}>
        <app url="jolokia" war="jolokia.war"/>
+       <app url="activemq-branding" war="activemq-branding.war"/>
+       <app url="artemis-plugin" war="artemis-plugin.war"/>
+       <app url="hawtio" war="hawtio.war"/>
    </web>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-distribution/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-distribution/pom.xml b/artemis-distribution/pom.xml
index d3fbc3d..a9285d8 100644
--- a/artemis-distribution/pom.xml
+++ b/artemis-distribution/pom.xml
@@ -169,7 +169,28 @@
           <artifactId>jolokia-war</artifactId>
           <type>war</type>
        </dependency>
-      <dependency>
+
+       <!-- Management Console Dependencies -->
+       <dependency>
+           <groupId>io.hawt</groupId>
+           <artifactId>hawtio-no-slf4j</artifactId>
+           <version>1.5.2</version>
+           <type>war</type>
+       </dependency>
+       <dependency>
+           <groupId>org.apache.activemq</groupId>
+           <artifactId>activemq-branding</artifactId>
+           <version>${project.version} </version>
+           <type>war</type>
+       </dependency>
+       <dependency>
+           <groupId>org.apache.activemq</groupId>
+           <artifactId>artemis-plugin</artifactId>
+           <version>${project.version} </version>
+           <type>war</type>
+       </dependency>
+       
+       <dependency>
          <groupId>commons-beanutils</groupId>
          <artifactId>commons-beanutils</artifactId>
       </dependency>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-distribution/src/main/assembly/dep.xml
----------------------------------------------------------------------
diff --git a/artemis-distribution/src/main/assembly/dep.xml b/artemis-distribution/src/main/assembly/dep.xml
index 6b3430e..2d91419 100644
--- a/artemis-distribution/src/main/assembly/dep.xml
+++ b/artemis-distribution/src/main/assembly/dep.xml
@@ -142,6 +142,33 @@
          <unpack>false</unpack>
          <outputFileNameMapping>jolokia.war</outputFileNameMapping>
       </dependencySet>
+      
+      <!-- Management Console Dependencies -->
+      <dependencySet>
+         <includes>
+            <include>io.hawt:hawtio-no-slf4j:war</include>
+         </includes>
+         <outputDirectory>web</outputDirectory>
+         <unpack>false</unpack>
+         <outputFileNameMapping>hawtio.war</outputFileNameMapping>
+      </dependencySet>
+      <dependencySet>
+         <includes>
+            <include>org.apache.activemq:activemq-branding:war</include>
+         </includes>
+         <outputDirectory>web</outputDirectory>
+         <unpack>false</unpack>
+         <outputFileNameMapping>activemq-branding.war</outputFileNameMapping>
+      </dependencySet>
+      <dependencySet>
+         <includes>
+            <include>org.apache.activemq:artemis-plugin:war</include>
+         </includes>
+         <outputDirectory>web</outputDirectory>
+         <unpack>false</unpack>
+         <outputFileNameMapping>artemis-plugin.war</outputFileNameMapping>
+      </dependencySet>
+      
    </dependencySets>
    <fileSets>
       <!-- schema -->

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/pom.xml b/artemis-hawtio/activemq-branding/pom.xml
new file mode 100644
index 0000000..1363f38
--- /dev/null
+++ b/artemis-hawtio/activemq-branding/pom.xml
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.activemq</groupId>
+        <artifactId>artemis-hawtio-pom</artifactId>
+        <version>2.2.0-SNAPSHOT</version>
+    </parent>
+    
+    <artifactId>activemq-branding</artifactId>
+    <name>ActiveMQ Artemis HawtIO Branding</name>
+
+    <!-- hawtio plugins are almost always war files -->
+    <packaging>war</packaging>
+
+    <properties>
+        <activemq.basedir>${project.basedir}/../..</activemq.basedir>
+
+        <!-- filtered plugin properties, we don't define plugin-scripts here
+  as we build that dynamically using maven-antrun-plugin below. -->
+        <!-- plugin-context is what context this plugin will handle requests on
+          in the application server -->
+        <plugin-context>/activemq-branding</plugin-context>
+
+        <!-- plugin-name is the name of our plugin, affects the name used for
+          the plugin's mbean -->
+        <plugin-name>${project.artifactId}</plugin-name>
+
+        <!-- plugin-domain is currently unused, we just define it to an empty
+          string -->
+        <plugin-domain/>
+
+        <!-- this lets this plugin deploy nicely into karaf, these get used
+          for the ImportPackage directive for maven-bundle-plugin -->
+        <fuse.osgi.import>
+            javax.servlet,
+            *;resolution:=optional
+        </fuse.osgi.import>
+
+        <webapp-dir>${project.artifactId}-${project.version}</webapp-dir>
+        <webapp-outdir>${basedir}/target/${webapp-dir}</webapp-outdir>
+        <schema-outdir>${basedir}/src/main/webapp/lib</schema-outdir>
+        <appjs-outfile>${webapp-outdir}/app/app.js</appjs-outfile>
+
+    </properties>
+    
+    <dependencies>
+
+        <!-- we only need to embed this dependency in the war, this contains
+          a nice helper class that our plugin can use to export it's plugin
+          mbean -->
+        <dependency>
+            <groupId>io.hawt</groupId>
+            <artifactId>hawtio-plugin-mbean</artifactId>
+        </dependency>
+
+        <!-- servlet API is provided by the container -->
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- logging -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+    </dependencies>
+
+
+    <build>
+
+        <!-- we want to ensure src/main/resources/WEB-INF/web.xml is being filtered
+          so that it picks up all of our javascript files -->
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+        </resources>
+
+        <plugins>
+
+            <!-- We use maven-antrun-plugin to build up a list of
+                 javascript files for our plugin mbean, this means
+                 it needs to run before the maven-resources-plugin
+                 copies and filters the web.xml, since for this
+                 example we use contextParam settings to configure
+                 our plugin mbean -->
+
+            <plugin>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <version>${maven-antrun-plugin-version}</version>
+                <executions>
+
+                    <execution>
+                        <!-- we run this early in the build process before
+                          maven-resources-plugin is run.  We're exporting the
+                          plugin-scripts property from here, so we need to
+                          use maven-antrun-plugin 1.6 or up -->
+                        <id>generate-sources</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                        <configuration>
+                            <target>
+                                <echo>Building plugin javascript file list</echo>
+                                <!-- javascript-files will contain all of the javascript in
+                                  our project -->
+                                <fileset id="javascript-files" dir="${basedir}/src/main/webapp">
+                                    <include name="**/*.js"/>
+                                </fileset>
+                                <!-- we need to strip out the top level path which is
+                                   our source directory and be sure to change the directory
+                                   separators to forward slashes -->
+                                <pathconvert pathsep="," dirsep="/" property="plugin-scripts" refid="javascript-files">
+                                    <map from="${basedir}/src/main/webapp/" to=""/>
+                                </pathconvert>
+                                <echo>Files: ${plugin-scripts}</echo>
+
+                            </target>
+                            <!-- this exports plugin-scripts to the maven build, without
+                              this line ${plugin-scripts} in the web.xml file won't be
+                              replaced -->
+                            <exportAntProperties>true</exportAntProperties>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>${maven-resources-plugin-version}</version>
+                <executions>
+                    <execution>
+                        <!-- defining this maven plugin in the same phase as the
+                          maven-antrun-plugin but *after* we've configured the
+                          maven-antrun-plugin ensures we filter resources *after*
+                          we've discovered the plugin .js files. -->
+                        <id>copy-resources</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>resources</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- maven-bundle-plugin config, needed to make this war
+              deployable in karaf, defines the context that this bundle
+              should handle requests on -->
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>${maven-bundle-plugin-version}</version>
+                <executions>
+                    <execution>
+                        <id>bundle-manifest</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>manifest</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <manifestLocation>${webapp-outdir}/META-INF</manifestLocation>
+                    <supportedProjectTypes>
+                        <supportedProjectType>jar</supportedProjectType>
+                        <supportedProjectType>bundle</supportedProjectType>
+                        <supportedProjectType>war</supportedProjectType>
+                    </supportedProjectTypes>
+                    <instructions>
+                        <Webapp-Context>${plugin-context}</Webapp-Context>
+                        <Web-ContextPath>${plugin-context}</Web-ContextPath>
+
+                        <Embed-Directory>WEB-INF/lib</Embed-Directory>
+                        <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
+                        <Embed-Transitive>true</Embed-Transitive>
+
+                        <Export-Package>${fuse.osgi.export}</Export-Package>
+                        <Import-Package>${fuse.osgi.import}</Import-Package>
+                        <DynamicImport-Package>${fuse.osgi.dynamic}</DynamicImport-Package>
+                        <Private-Package>${fuse.osgi.private.pkg}</Private-Package>
+
+                        <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
+
+                        <Bundle-Name>${project.description}</Bundle-Name>
+                        <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
+                        <Implementation-Title>HawtIO</Implementation-Title>
+                        <Implementation-Version>${project.version}</Implementation-Version>
+                    </instructions>
+                </configuration>
+            </plugin>
+
+            <!-- We define the maven-war-plugin here and make sure it uses
+              the manifest file generated by the maven-bundle-plugin.  We
+              also ensure it picks up our filtered web.xml and not the one
+              in src/main/resources -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>${war-plugin-version}</version>
+                <configuration>
+                    <outputFileNameMapping>@{artifactId}@-@{baseVersion}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
+                    <packagingExcludes>**/classes/OSGI-INF/**</packagingExcludes>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <archive>
+                        <manifestFile>${webapp-outdir}/META-INF/MANIFEST.MF</manifestFile>
+                    </archive>
+                    <webResources>
+                        <resource>
+                            <filtering>true</filtering>
+                            <directory>src/main/resources</directory>
+                            <includes>
+                                <include>**/*.*</include>
+                            </includes>
+                            <excludes>
+                                <exclude>log4j.properties</exclude>
+                            </excludes>
+                        </resource>
+                    </webResources>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+
+
+</project>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/java/org/apache/activemq/hawtio/branding/PluginContextListener.java
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/java/org/apache/activemq/hawtio/branding/PluginContextListener.java b/artemis-hawtio/activemq-branding/src/main/java/org/apache/activemq/hawtio/branding/PluginContextListener.java
new file mode 100644
index 0000000..a95fbab
--- /dev/null
+++ b/artemis-hawtio/activemq-branding/src/main/java/org/apache/activemq/hawtio/branding/PluginContextListener.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+package org.apache.activemq.hawtio.branding;
+
+import io.hawt.web.plugin.HawtioPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+/**
+ * The Plugin Context Listener used to load in the plugin
+ **/
+public class PluginContextListener implements ServletContextListener {
+
+   private static final Logger LOG = LoggerFactory.getLogger(PluginContextListener.class);
+
+   HawtioPlugin plugin = null;
+
+   @Override
+   public void contextInitialized(ServletContextEvent servletContextEvent) {
+
+      ServletContext context = servletContextEvent.getServletContext();
+
+      plugin = new HawtioPlugin();
+      plugin.setContext((String)context.getInitParameter("plugin-context"));
+      plugin.setName(context.getInitParameter("plugin-name"));
+      plugin.setScripts(context.getInitParameter("plugin-scripts"));
+      plugin.setDomain(null);
+
+      try {
+         plugin.init();
+      } catch (Exception e) {
+         throw createServletException(e);
+      }
+
+      LOG.info("Initialized {} plugin", plugin.getName());
+   }
+
+   @Override
+   public void contextDestroyed(ServletContextEvent servletContextEvent) {
+      try {
+         plugin.destroy();
+      } catch (Exception e) {
+         throw createServletException(e);
+      }
+
+      LOG.info("Destroyed {} plugin", plugin.getName());
+   }
+
+   protected RuntimeException createServletException(Exception e) {
+      return new RuntimeException(e);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/resources/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/resources/WEB-INF/web.xml b/artemis-hawtio/activemq-branding/src/main/resources/WEB-INF/web.xml
new file mode 100644
index 0000000..b9ba164
--- /dev/null
+++ b/artemis-hawtio/activemq-branding/src/main/resources/WEB-INF/web.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
+	      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+	      http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
+	      version="2.4">
+
+  <description>ActiveMQ Artemis HawtIO branding plugin</description>
+  <display-name>activemq artemis hawt.io branding plugin</display-name>
+
+  <context-param>
+    <description>Plugin's path on the server</description>
+    <param-name>plugin-context</param-name>
+    <param-value>${plugin-context}</param-value>
+  </context-param>
+
+  <context-param>
+    <description>Plugin's path on the server</description>
+    <param-name>plugin-name</param-name>
+    <param-value>${project.artifactId}</param-value>
+  </context-param>
+
+  <context-param>
+    <description>Plugin's path on the server</description>
+    <param-name>plugin-domain</param-name>
+    <param-value>${plugin-domain}</param-value>
+  </context-param>
+
+  <context-param>
+    <description>Plugin's path on the server</description>
+    <param-name>plugin-scripts</param-name>
+    <param-value>${plugin-scripts}</param-value>
+  </context-param>
+
+  <listener>
+    <listener-class>org.apache.activemq.hawtio.branding.PluginContextListener</listener-class>
+  </listener>
+
+
+</web-app>
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/index.html b/artemis-hawtio/activemq-branding/src/main/webapp/index.html
new file mode 100644
index 0000000..a9d6e10
--- /dev/null
+++ b/artemis-hawtio/activemq-branding/src/main/webapp/index.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<!--
+  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.
+  Architecture
+-->
+<html>
+  <head>
+    <meta charset="utf-8"/>
+    <title>hawtio-activemq-branding</title>
+  </head>
+  <body>
+    <h1>hawtio :: ActiveMQ Artemis Branding</h1>
+  </body>
+</html>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/activemq.css
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/activemq.css b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/activemq.css
new file mode 100644
index 0000000..fc0d296
--- /dev/null
+++ b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/activemq.css
@@ -0,0 +1,2450 @@
+/*
+ * 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.
+ */
+
+/* fonts */
+
+@import url("../../../hawtio/app/themes/fonts/Open-Sans/stylesheet.css");
+@import url("../../../hawtio/app/themes/fonts/Droid-Sans-Mono/stylesheet.css");
+
+* {
+  font-family: OpenSans;
+}
+
+body {
+  font-family: OpenSans;
+}
+
+#log-panel-statements li {
+  font-family: DroidSansMonoRegular;
+}
+
+#log-panel-statements li pre span {
+  font-family: DroidSansMonoRegular;
+}
+
+div.log-stack-trace {
+  font-family: DroidSansMonoRegular;
+}
+
+div.log-stack-trace p {
+  font-family: DroidSansMonoRegular;
+}
+
+.log-stack-trace > dd > ul > li > .stack-line * {
+  font-family: DroidSansMonoRegular;
+}
+
+pre.stack-line {
+  font-family: DroidSansMonoRegular;
+  font-size: 12px;
+}
+
+div.stack-line {
+  font-family: DroidSansMonoRegular;
+  font-size: 12px;
+}
+
+.log-table *:not('.icon*') {
+  font-family: DroidSansMonoRegular;
+}
+
+.log-table > li > div > div {
+  font-family: DroidSansMonoRegular;
+}
+
+fs-donut svg g text.units {
+  font-family: DroidSansMonoRegular;
+}
+
+/* colors */
+#log-panel {
+  background: inherit;
+  background-color: none;
+  border: 1px solid #d4d4d4;
+  transition: bottom 1s ease-in-out;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+  opacity: 0.8;
+  border-bottom-left-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+
+#log-panel #log-panel-statements {
+  background: #252525;
+}
+
+#log-panel-statements li pre {
+  color: white;
+  background-color: inherit;
+  border: none;
+}
+
+#log-panel-statements li:hover {
+  background: #111111;
+}
+
+#log-panel-statements li.DEBUG {
+  color: dodgerblue;
+}
+
+#log-panel-statements li.INFO {
+  color: white;
+}
+
+#log-panel-statements li.WARN {
+  color: yellow;
+}
+
+#log-panel-statements li.ERROR {
+  color: red;
+}
+
+#log-panel #close {
+  background: #131313;
+  border-top: 1px solid #222222;
+  box-shadow: 0 1px 13px rgba(0, 0, 0, 0.1) inset;
+  color: #eeeeee;
+  border-bottom-left-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+
+#log-panel #copy {
+  background: inherit;
+  color: white;
+}
+
+ul.dynatree-container {
+  background: inherit;
+}
+ul.dynatree-container li {
+  background: inherit;
+}
+
+.axis line {
+  stroke: #000;
+}
+
+.axis.top {
+  border-bottom: 1px solid #d4d4d4;
+}
+
+.axis.bottom {
+  border-top: 1px solid #d4d4d4;
+}
+
+.horizon {
+  border-bottom: solid 1px #eeeeee;
+}
+
+.horizon:last-child {
+  border-bottom: none;
+}
+
+.horizon + .horizon {
+  border-top: none;
+}
+
+.horizon .title,
+.horizon .value {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.line {
+  background: #000;
+  opacity: .2;
+}
+
+.CodeMirror {
+  border: 1px solid #d4d4d4;
+}
+
+i.expandable-indicator {
+  color: #666;
+}
+
+span.dynatree-expander {
+  color: #728271;
+}
+
+span.dynatree-icon {
+  color: #EECA7C;
+}
+span:not(.dynatree-has-children) .dynatree-icon:before {
+  color: gray;
+}
+
+.table-hover tbody tr:hover td.details {
+  background-color: #ffffff;
+}
+
+tr td.focus {
+  background-color: #d9edf7;
+}
+
+.table-hover tbody tr:hover td.focus {
+  background-color: #d9edf7;
+}
+
+.table-striped tbody tr:nth-child(odd) td.focus {
+  background-color: #d9edf7;
+}
+/*
+.red {
+  color: red !important;
+}
+
+.orange {
+  color: orange !important;
+}
+
+.yellow {
+  color: yellow !important;
+}
+
+.green {
+  color: green !important;
+}
+
+.blue {
+  color: dodgerblue !important;
+}
+*/
+
+.gridster ul#widgets .gs_w {
+  border: 1px solid #d4d4d4;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+  background: #ffffff;
+  border-radius: 6px;
+}
+.gridster ul#widgets .gs_w.dragging {
+  box-shadow: 0 1px 13px rgba(0, 0, 0, 0.12);
+}
+.gridster ul#widgets .preview-holder {
+  border-radius: 6px;
+  border: 1px solid #d4d4d4;
+  box-shadow: 0 1px 13px rgba(0, 0, 0, 0.1) inset;
+}
+
+.widget-title {
+  background-color: #FAFAFA;
+  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
+  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#F2F2F2', GradientType=0);
+  border-bottom: 1px solid #d4d4d4;
+  color: #777777;
+  text-shadow: 0 1px 0 #FFFFFF;
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+
+.widget-title:hover {
+  color: #333333;
+  text-shadow: 0 1px 0 #FFFFFF;
+  border-bottom: 1px solid #d4d4d4;
+  background-image: -moz-linear-gradient(top, #fafafa, #f0f0f0);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#f0f0f0));
+  background-image: -webkit-linear-gradient(top, #fafafa, #f0f0f0);
+  background-image: -o-linear-gradient(top, #fafafa, #f0f0f0);
+  background-image: linear-gradient(to bottom, #fafafa, #f0f0f0);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa', endColorstr='#f0f0f0', GradientType=0);
+}
+
+.ep[ng-show=editing] {
+  background: white;
+  border-bottom: 1px solid #d4d4d4;
+  border: 1px solid #cecdcd;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.ep > form > fieldset > input {
+  border: 0;
+}
+
+.ngFooterPanel {
+  background: inherit;
+}
+.ngTopPanel {
+  background: inherit;
+}
+.ngGrid {
+  background: inherit;
+}
+
+.ngCellText:hover i:before {
+  text-shadow: 0px 0px 8px #969696;
+}
+
+.ACTIVE:before {
+  color: #777777;
+}
+.RESOLVED:before {
+
+}
+.STARTING:before {
+
+}
+.STARTING {
+
+}
+.STOPPING:before {
+
+}
+.STOPPING {
+
+}
+.UNINSTALLED:before {
+
+}
+.INSTALLED:before {
+
+}
+.table-bordered {
+  border: none;
+  border-radius: 0px;
+}
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  border-radius: 0px;
+  border-left: none;
+}
+.table-bordered th {
+  border-bottom: 1px solid #d4d4d4;
+}
+.table-bordered th,
+.table-bordered td {
+  border-left: none;
+  border-top: none;
+  border-right: 1px solid #d4d4d4;
+}
+.table-bordered th:last-child,
+.table-bordered td:last-child {
+  border-left: none;
+  border-top: none;
+  border-right: none;
+}
+table.table thead .sorting {
+  background: inherit;
+}
+/*
+table.table thead .sorting_asc:after {
+  background: url('../img/datatable/sort_asc.png') no-repeat top center;
+}
+table.table thead .sorting_desc:after {
+  background: url('../img/datatable/sort_desc.png') no-repeat top center;
+}
+*/
+
+div#main div ul.nav {
+  border-radius: 0 0 4px 4px;
+  border: 1px solid #d4d4d4;
+  border-top: 1px transparent;
+  background-color: #FAFAFA;
+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+  background-repeat: repeat-x;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar .btn-navbar span {
+  color: #777777;
+  text-shadow: 0 1px 0 #FFFFFF;
+}
+
+div#main div ul.nav li.active a, div#main div ul.nav li.active span.a {
+  border: 1px;
+  border-radius: 2px;
+  background-color: #E5E5E5;
+  box-shadow: 0 3px 8px rgba(0, 0, 0, 0.125) inset;
+  text-shadow: 0 1px 0 #FFFFFF;
+}
+
+div#main div ul.nav li.active a:hover, div#main div ul.nav li.active span.a:hover {
+  border: 1px;
+  border-radius: 2px;
+  background-color: #E5E5E5;
+  box-shadow: 0 3px 8px rgba(0, 0, 0, 0.125) inset;
+  text-shadow: 0 1px 0 #FFFFFF;
+}
+
+div#main div ul.nav li a, div#main div ul.nav li span.a {
+  border: 1px;
+  border-radius: 2px;
+  background: inherit;
+  color: #777777;
+  text-shadow: 0 1px 0 #FFFFFF;
+}
+
+div#main div ul.nav li div.separator {
+  padding: 6px 12px;
+  line-height: 20px;
+}
+
+div#main div ul.nav li a:hover {
+  border: 1px;
+  border-radius: 2px;
+  background: inherit;
+  color: #333333;
+  text-shadow: 0 1px 0 #FFFFFF;
+}
+
+#main div div div section .tabbable .nav.nav-tabs {
+  border-radius: 0 0 4px 4px;
+  border: 1px solid #d4d4d4;
+  border-top: 1px transparent;
+  background-color: #FAFAFA;
+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+  background-repeat: repeat-x;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+#main div div div .nav.nav-tabs:not(.connected) {
+  border-radius: 4px;
+  border: 1px solid #d4d4d4;
+}
+
+.logbar {
+  background: white;
+  border-bottom: 1px solid #d4d4d4;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+  border-bottom-left-radius: 5px;
+  border-bottom-right-radius: 5px;
+  border-left: 1px solid #d4d4d4;
+  border-right: 1px solid #d4d4d4;
+  top: 90px;
+}
+
+.ui-resizable-se {
+  height: 10px;
+  width: 10px;
+  margin-right: 5px;
+  margin-bottom: 5px;
+  background: inherit;
+  box-shadow: -3px -3px 10px rgba(0, 0, 0, 0.1) inset;
+  font-size: 32px;
+  z-index: 50;
+  position: absolute;
+  display: block;
+  right: 0px;
+  bottom: 0px;
+  border-radius: 6px;
+  border: 1px solid #d4d4d4;
+  cursor: se-resize;
+}
+
+.innerDetails {
+  box-shadow: 0 10px 10px -10px rgba(0, 0, 0, 0.1) inset;
+  border: 1px solid #d4d4d4;
+  display: none;
+  background: #ffffff;
+}
+
+.odd {
+  background-color: #f9f9f9;
+}
+
+#main .logbar[ng-controller='Wiki.NavBarController'] .wiki.logbar-container .nav.nav-tabs,
+#main .logbar-wiki .wiki.logbar-container .nav.nav-tabs {
+  border: none;
+  border-radius: 0;
+  box-shadow: none;
+  background: inherit;
+}
+
+.help-display img:not(.no-shadow) {
+  box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.1);
+}
+
+.text-shadowed {
+  text-shadow: 1px 1px rgba(0, 0, 0, 0.5);
+}
+
+.bundle-item-details {
+  background: white;
+}
+
+.bundle-item > a {
+  border-radius: 4px;
+  border: 1px solid #d4d4d4;
+  display: block;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+  background: #ffffff;
+  background: -moz-linear-gradient(top, #ffffff 0%, #ffffff 34%, #f4f4f4 76%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(34%, #ffffff), color-stop(76%, #f4f4f4));
+  background: -webkit-linear-gradient(top, #ffffff 0%, #ffffff 34%, #f4f4f4 76%);
+  background: -o-linear-gradient(top, #ffffff 0%, #ffffff 34%, #f4f4f4 76%);
+  background: -ms-linear-gradient(top, #ffffff 0%, #ffffff 34%, #f4f4f4 76%);
+  background: linear-gradient(to bottom, #ffffff 0%, #ffffff 34%, #f4f4f4 76%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f4f4f4', GradientType=0);
+}
+
+.bundle-item.in-selected-repository > a {
+  background: #ddeeff;
+  background: -moz-linear-gradient(top, #ddeeff 0%, #ddeeff 34%, #e3e3f4 76%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ddeeff), color-stop(34%, #ddeeff), color-stop(76%, #e3e3f4));
+  background: -webkit-linear-gradient(top, #ddeeff 0%, #ddeeff 34%, #e3e3f4 76%);
+  background: -o-linear-gradient(top, #ddeeff 0%, #ddeeff 34%, #e3e3f4 76%);
+  background: -ms-linear-gradient(top, #ddeeff 0%, #ddeeff 34%, #e3e3f4 76%);
+  background: linear-gradient(to bottom, #ddeeff 0%, #ddeeff 34%, #e3e3f4 76%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ddeeff', endColorstr='#e3e3f4', GradientType=0);
+}
+
+.bundle-item > a:hover {
+  text-decoration: none;
+}
+
+.bundle-item a span {
+  background: inherit;
+  border-radius: 4px;
+  border: 0px;
+  color: #404040;
+  text-shadow: none;
+}
+
+.bundle-item a span.badge::before {
+  border-radius: 3px;
+  background: #737373;
+}
+
+.bundle-item a span.badge-success::before {
+  background: #1cd11d;
+  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(34, 203, 1, 0.49);
+}
+
+.bundle-item a span.badge-inverse::before {
+  background: #737373;
+  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5);
+}
+
+.bundle-item a span.badge-important::before {
+  background: #ee0002;
+  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(195, 6, 0, 0.47);
+}
+
+.bundle-item a span.badge-info::before {
+  background: #3a87ad;
+  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(45, 105, 135, 0.47);
+}
+
+.bundle-item a span.badge-warning::before {
+  background: #f89406;
+  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(198, 118, 5, 0.47);
+}
+
+.bundle-item a.toggle-action {
+  border-radius: 0;
+  border: none;
+  opacity: 0.2;
+  color: inherit;
+  box-shadow: none;
+}
+
+.bundle-item a.toggle-action .icon-power-off {
+  color: orange;
+}
+
+.bundle-item a.toggle-action .icon-play-circle {
+  color: green;
+}
+
+div.hawtio-form-tabs div.tab-content {
+  border: 1px solid #d4d4d4;
+  border-radius: 4px;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+div.hawtio-form-tabs ul.nav-tabs {
+  border: none !important;
+  border-radius: 0 !important;
+  box-shadow: none !important;
+  background: inherit;
+  background-color: inherit !important;
+  background-image: inherit !important;
+  border-top: none !important;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li {
+  border: 1px solid #d4d4d4 !important;
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+  background-color: inherit;
+  box-shadow: inset 0 -10px 10px -10px rgba(0, 0, 0, 0.08) !important;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li.active {
+  border-bottom: 1px solid white !important;
+  background-color: white;
+  box-shadow: 0 -10px 10px -10px rgba(0, 0, 0, 0.1) !important;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li.active a {
+  box-shadow: none !important;
+  text-shadow: none !important;
+  background-color: inherit !important;
+}
+
+
+.slideout {
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+  border: 1px solid #d4d4d4;
+  background: white;
+}
+
+.slideout > .slideout-content {
+  box-shadow: inset 0 1px 10px rgba(0, 0, 0, 0.1);
+  border: 1px solid white;
+  background: white;
+}
+
+.slideout.right {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+
+.slideout.left {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+
+.slideout.left > .slideout-content {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+
+.slideout.right > .slideout-content {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+
+.slideout > .slideout-content > .slideout-body {
+  background: white;
+}
+
+.slideout .slideout-title a {
+  color: #d4d4d4;
+}
+
+.ngHeaderCell:last-child {
+  border-right: 1px solid rgba(0, 0, 0, 0) !important;
+}
+
+.color-picker .wrapper {
+  border: 1px solid #d4d4d4;
+  border-radius: 4px;
+}
+
+.selected-color {
+  width: 1em;
+  height: 1em;
+  border-radius: 4px;
+  padding: 4px;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.color-picker-popout {
+  transition: opacity 0.25s ease-in-out;
+  background: white;
+  border-radius: 4px;
+  border: 1px solid rgba(0, 0, 0, 0);
+}
+
+.popout-open {
+  border: 1px solid #d4d4d4;
+}
+
+.color-picker div table tr td div {
+  border: 3px solid rgba(0, 0, 0, 0);
+  border-radius: 4px;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.color-picker div table tr td div.color-picker-selected {
+  border-color: #474747;
+}
+
+.clickable {
+  color: #787878;
+}
+
+.canvas {
+  box-shadow: inset 0 0 10px rgba(0, 0, 0, 0);
+}
+
+.container-group-header {
+  background: #fdfdfd;
+  border-bottom: 1px solid #d4d4d4;
+}
+
+.box {
+  background: none repeat scroll 0 0 white;
+  border-top: 1px solid #d4d4d4;
+}
+
+.container-group-header:not([style]) + div > .box {
+  border-top: 1px solid transparent;
+}
+
+.selected,
+.box.selected {
+  background-color: #AEAEAE !important;
+}
+
+.box.selected .box-right i {
+  text-shadow: none;
+}
+
+.box > .box-left > div {
+  border-radius: 4px;
+}
+
+.section-header {
+  background: none;
+  background-color: transparent;
+  background-image: none;
+}
+
+.section-header .dropdown-menu {
+  border-top: 1px solid #d4d4d4;
+
+}
+
+.section-controls > a,
+.section-controls > span > span > span > span > span > .hawtio-dropdown {
+  color: #4d5258;
+}
+
+.section-controls > a.nav-danger {
+  color: IndianRed !important;
+}
+
+.section-controls > a.nav-danger:hover {
+  text-shadow: rgba(205, 92, 92, 0.6) 0 0 20px !important;
+}
+
+td.deleting {
+  background-color: IndianRed !important;
+}
+
+td.adding {
+  background-color: Aquamarine !important;
+}
+
+.input-prepend .progress {
+  border-top-left-radius: 0px;
+  border-bottom-left-radius: 0px;
+}
+
+.login-wrapper {
+  background-color: rgba(255, 168, 27, 0.3);
+  box-shadow: rgba(255, 168, 27, 0.2) 0 0 30px 10px;
+}
+
+.login-wrapper form {
+  background-color: rgba(255, 255, 255, 0.2);
+  box-shadow: inset rgba(255, 168, 27, 0.2) 0 0 30px 10px;
+}
+
+.login-form form fieldset .control-group label {
+  color: white;
+}
+
+.login-logo {
+  color: white;
+}
+
+/** highlight required fields which have no focus */
+input.ng-invalid,
+textarea.ng-invalid,
+select.ng-invalid {
+  border-color: #e5e971;
+  -webkit-box-shadow: 0 0 6px #eff898;
+  -moz-box-shadow: 0 0 6px #eff898;
+  box-shadow: 0 0 6px #eff898;
+}
+
+/** Use bigger and darker border on checkboxes as its hard to see since they already have a shadow */
+input[type="checkbox"].ng-invalid {
+  -webkit-box-shadow: 0 0 12px #e5e971;
+  -moz-box-shadow: 0 0 12px #e5e971;
+  box-shadow: 0 0 12px #e5e971;
+}
+
+.profile-details div .tab-pane ul li:nth-child(even):not(.add) {
+  background-color: #f3f3f3;
+}
+
+.fabric-page-header {
+  border-bottom: 1px solid #d4d4d4;
+}
+
+pre.stack-line {
+  color: #333333;
+  background: inherit;
+  border: none;
+  border-radius: 0;
+}
+
+.directive-example {
+  border: 1px solid #d4d4d4;
+  border-radius: 4px;
+}
+
+div#main div ul.nav li a.nav-primary.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+div#main div ul.nav li a.nav-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  background-color: #0044cc;
+}
+
+div#main div ul.nav li a.nav-primary:hover,
+div#main div ul.nav li a.nav-primary:active,
+div#main div ul.nav li a.nav-primary.active,
+div#main div ul.nav li a.nav-primary.disabled,
+div#main div ul.nav li a.nav-primary[disabled] {
+  color: #ffffff;
+  background-color: #0044cc;
+}
+
+div#main div ul.nav li a.nav-primary:active,
+div#main div ul.nav li a.nav-primary.active {
+  background-color: #003399 \9;
+}
+
+div#main div ul.nav li a.nav-primary .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.main-nav-upper {
+  background-image: none;
+  background-color: white;
+}
+
+.main-nav-upper .nav li a {
+  border-radius: 0;
+}
+
+.file-list-toolbar .nav {
+  border: none !important;
+  border-bottom: 1px solid #d4d4d4 !important;
+  border-radius: 0 !important;
+  background: inherit !important;
+  box-shadow: none !important;
+}
+
+.file-list-toolbar .nav li a {
+  background: inherit !important;
+}
+
+.file-icon i.icon-folder-close {
+  color: #EECA7C;
+}
+
+.status-icon {
+  color: inherit;
+}
+
+.active-profile-icon {
+  color: green !important;
+}
+
+.mq-profile-icon {
+  color: green !important;
+}
+
+i.mq-master {
+  color: orange;
+}
+
+.mq-broker-rectangle, .mq-container-rectangle {
+
+  border-left-width: 10px;
+  border-right-width: 10px;
+  border-top-width: 10px;
+
+  color: #333333;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  background-color: #f5f5f5;
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #e6e6e6;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border: 1px solid #bbbbbb;
+  *border: 0;
+  border-bottom-color: #a2a2a2;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  *margin-left: .3em;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+}
+
+.mq-group-rectangle:nth-child(odd) .mq-group-rectangle-label {
+  background-color: #f3f3f3;
+}
+
+.mq-group-rectangle-label {
+  border-radius: 4px;
+  background-color: #f9f9f9;
+  border: 1px solid #d4d4d4;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.mq-profile-rectangle {
+  border: 1px solid #d4d4d4;
+  border-radius: 4px;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.mq-container-rectangle {
+  border-radius: 4px;
+}
+
+.mq-container-rectangle.master {
+  background-color: #DFFFB9;
+  background-image: -moz-linear-gradient(top, #efffdd, #CCFF99);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#efffdd), to(#CCFF99));
+  background-image: -webkit-linear-gradient(top, #efffdd, #CCFF99);
+  background-image: -o-linear-gradient(top, #efffdd, #CCFF99);
+  background-image: linear-gradient(to bottom, #efffdd, #CCFF99);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffefffdd', endColorstr='#ffCCFF99', GradientType=0);
+  border-color: #CCFF99 #CCFF99 #CCFF99;
+  *background-color: #CCFF99;
+}
+
+.mq-broker-rectangle {
+  background-color: #bbddff;
+  background-image: -moz-linear-gradient(top, #bbddff, #88bbdd);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#bbddff), to(#88bbdd));
+  background-image: -webkit-linear-gradient(top, #bbddff, #88bbdd);
+  background-image: -o-linear-gradient(top, #bbddff, #88bbdd);
+  background-image: linear-gradient(to bottom, #bbddff, #88bbdd);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff88bbdd', GradientType=0);
+  border-color: #88bbdd #88bbdd #002a80;
+  *background-color: #88bbdd;
+}
+
+a.dashboard-link {
+  color: black;
+}
+
+.provision-list ul li:nth-child(even) {
+  background-color: #f3f3f3;
+}
+
+.zebra-list > li:nth-child(even),
+ol.zebra-list > li:nth-child(even):before {
+  background-color: #f3f3f3;
+}
+
+.add-link {
+  background: white;
+  border-radius: 4px;
+  border: 1px solid #d4d4d4;
+}
+
+.log-table > .table-row.selected:before {
+  color: green;
+}
+
+.log-table > li:nth-child(odd) > div > div:not(.stack-line) {
+  background-color: white;
+}
+
+.log-table > li:nth-child(even) > div > div:not(.stack-line) {
+  background-color: #f3f3f3;
+}
+
+.log-table > li > div > div:nth-child(2) {
+  border-right: 1px solid #d4d4d4;
+}
+
+.log-table > li > div > div:nth-child(3) {
+  border-right: 1px solid #d4d4d4;
+}
+
+.log-table > li > div > div:nth-child(4) {
+  border-right: 1px solid #d4d4d4;
+}
+
+.log-table > li > div > div:nth-child(6) {
+  background: white;
+}
+
+.log-info-panel {
+  background: white;
+  border-radius: 4px;
+  border: 1px solid #d4d4d4;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.log-info-panel > .log-info-panel-frame > .log-info-panel-header {
+  border-bottom: 1px solid #d4d4d4;
+}
+
+.log-info-panel > .log-info-panel-frame > .log-info-panel-body > .row-fluid > span {
+  margin-right: 7px;
+  white-space: nowrap;
+}
+
+.ex-node {
+  border-radius: 4px;
+  border: 1px solid #d4d4d4;
+  background: white;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.dozer-mapping-node {
+  border: 1px solid #f3f3f3;
+  border-radius: 4px;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.wiki-grid {
+  border-right: 1px solid #d4d4d4;
+}
+
+.wiki-file-list-up {
+  color: black;
+}
+
+.fabric-page-header.features {
+  margin-top: 10px;
+}
+
+.profile-selector-name a:not(.profile-info) {
+  color: #333333;
+}
+
+.profile-selector-name.abstract {
+  color: #888888;
+}
+
+.file-name {
+  color: #333333;
+}
+
+i.expandable-indicator.folder {
+  color: #EECA7C;
+}
+
+.camel-canvas {
+  border: 1px solid #d4d4d4;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 13px rgba(0, 0, 0, 0.1);
+  background-image: url('../img/img-noise-600x600.png')
+}
+
+/*
+ * jquery.tocify.css 1.8.0
+ * Author: @gregfranko
+ */
+/* The Table of Contents container element */
+.tocify {
+  /* top works for the wiki, may need customization
+     elsewhere */
+  border: 1px solid #ccc;
+  webkit-border-radius: 6px;
+  moz-border-radius: 6px;
+  border-radius: 6px;
+  background-color: white;
+}
+
+.tocify li a {
+  border-top: 1px solid rgba(0, 0, 0, 0);
+  border-bottom: 1px solid rgba(0, 0, 0, 0);
+}
+
+.tocify li a:hover {
+  background-color: #FAFAFA;
+  border-top: 1px solid rgba(0, 0, 0, 0);
+  border-bottom: 1px solid rgba(0, 0, 0, 0);
+}
+
+.tocify li a.active {
+  border-top: 1px solid #d4d4d4;
+  border-bottom: 1px solid #d4d4d4;
+  background-color: #FAFAFA;
+}
+
+.health-displays .health-display {
+  border-radius: 4px;
+  border: 1px solid #d4d4d4;
+}
+
+.health-details {
+  background: white;
+}
+
+.health-status {
+  background: white;
+  border-bottom-left-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+
+.health-message-wrap {
+  border-top: 1px solid #d4d4d4;
+}
+
+.health-details-wrap dl {
+  border-bottom: 1px solid #f3f3f3;
+}
+
+.health-details-wrap table tr {
+  border-bottom: 1px solid #f3f3f3;
+}
+
+.health-display-title {
+  border-radius: 4px;
+  background-color: #eaeaea;
+  border: 1px solid #d3d3d3;
+}
+
+.health-display-title.ok {
+  background-color: lightgreen;
+}
+
+.health-display-title.warning {
+  background-color: darkorange;
+}
+
+.toast.toast-warning * {
+  color: black;
+}
+
+.hawtio-toc .panel-title {
+  border: 1px solid #d4d4d4;
+  border-radius: 4px;
+}
+
+.hawtio-toc .panel-title a {
+  border-radius: 3px;
+  background: #cceeff;
+}
+
+.camel-canvas-endpoint svg circle {
+  fill: #346789;
+}
+
+tr.selected,
+tr.selected .ngCell,
+tr.selected .ngCellText a,
+.table-striped tbody tr.selected:nth-child(odd) td {
+  background-color: #c9dde1;
+}
+
+input.ng-invalid-pattern {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+  -moz-box-shadow: 0 0 6px #f8b9b7;
+  box-shadow: 0 0 6px #f8b9b7;
+}
+
+input.ng-invalid-pattern:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+  -moz-box-shadow: 0 0 6px #f8b9b7;
+  box-shadow: 0 0 6px #f8b9b7;
+}
+
+.runnable {
+  color: green;
+}
+
+.timed-waiting {
+  color: orange;
+}
+
+.waiting,
+.darkgray {
+  color: darkgray;
+}
+
+.blocked {
+  color: red;
+}
+
+strong.new,
+.lightgreen {
+  color: lightgreen;
+}
+
+.terminated,
+.darkred {
+  color: darkred;
+}
+
+.monitor-indicator {
+  border-radius: 6px;
+}
+
+.monitor-indicator.true {
+  background: #1cd11d;
+  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(34, 203, 1, 0.49);
+}
+
+.monitor-indicator.false {
+  background: #737373;
+  box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5);
+}
+
+.table-header {
+  color: black;
+}
+
+.table-header:hover {
+  background-color: #f3f3f3;
+}
+
+.table-header.asc,
+.table-header.desc {
+  background-color: #f3f3f3;
+}
+
+.dropdown-menu {
+  border-radius: 0;
+}
+
+.main-nav-upper .dropdown-menu {
+  border-radius: 0;
+}
+
+.main-nav-lower .dropdown-menu {
+  border-top: none;
+}
+
+.submenu-caret:before {
+  color: #53595f;
+}
+
+.hawtio-dropdown > ul > li.item:hover {
+  text-decoration: none;
+  color: #ffffff;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.hawtio-dropdown > ul > li:hover > span > ul.sub-menu > li {
+  color: #333333;
+}
+
+.dropdown-menu .sub-menu {
+  border-top: 1px solid #d3d3d3;
+}
+
+.caret:before {
+  color: #53595f;
+}
+
+.hawtio-breadcrumb .caret {
+  border: 0;
+  width: 17px;
+  margin-right: 2px;
+  margin-left: 0;
+}
+
+.hawtio-breadcrumb .caret:before {
+  color: rgba(255, 255, 255, 0.8);
+  text-shadow: 2px 0 2px   rgba(0, 0, 0, 0.3);
+}
+
+.component {
+  background-color: white;
+  color: black;
+}
+
+.window,
+.node > rect {
+  stroke-width: 2px;
+  stroke: #346789;
+  border: 2px solid #346789;
+  box-shadow: 2px 2px 19px #e0e0e0;
+  -o-box-shadow: 2px 2px 19px #e0e0e0;
+  -webkit-box-shadow: 2px 2px 19px #e0e0e0;
+  -moz-box-shadow: 2px 2px 19px #e0e0e0;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+
+.window-inner.from,
+.node > .from {
+  background-color: lightsteelblue;
+  fill: lightsteelblue;
+}
+
+.window-inner.choice,
+.node > .choice {
+  background-color: lightblue;
+  fill: lightblue;
+}
+
+.window-inner.when,
+.node > .when {
+  background-color: lightgreen;
+  fill: lightgreen;
+}
+
+.window-inner.otherwise,
+.node > .otherwise {
+  background-color: lightgreen;
+  fill: lightgreen;
+}
+
+.window-inner.to,
+.node > .to {
+  background-color: lightsteelblue;
+  fill: lightsteelblue;
+}
+
+.window-inner.log,
+.node > .log {
+  background-color: lightcyan;
+  fill: lightcyan;
+}
+
+.window-inner.setBody,
+.node > .setBody {
+  background-color: #d3d3d3;
+  fill: #d3d3d3;
+}
+
+.window-inner.onException,
+.node > .onException {
+  background-color: lightpink;
+  fill: lightpink;
+}
+
+.window-inner.delay,
+.node > .delay {
+  background-color: lightgrey;
+  fill: lightgrey;
+}
+
+.window-inner.bean,
+.node > .bean {
+  background-color: mediumaquamarine;
+  fill: mediumaquamarine;
+}
+
+.window:hover {
+  border-color: #5d94a6;
+  background-color: #ffffa0;
+}
+
+.window.selected {
+  background-color: #f0f0a0;
+}
+
+.window.selected > .window-inner {
+  background: inherit;
+}
+
+img.nodeIcon:hover {
+  opacity: 0.6;
+  box-shadow: 2px 2px 19px #a0a0a0;
+  background-color: #a0a0a0;
+}
+
+.hl {
+  border: 3px solid red;
+}
+
+.discovery > li > div:last-child > div > i,
+.discovery > li > .lock > i {
+  color: lightgreen;
+}
+
+.discovery > li > .lock > i {
+  color: lightgrey;
+}
+
+html, body {
+  font-size: 13.5px;
+}
+
+small {
+  font-size: 11.5px;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  letter-spacing: -1px;
+  font-weight: normal;
+  font-family: "Overpass", sans-serif;
+}
+
+a {
+  color: #6C2D58;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+#tree-ctrl {
+  top: 0;
+}
+
+
+#main {
+  margin-top: 90px!important;
+}
+
+#main-nav {
+  max-height: 90px !important;
+}
+
+#main-nav .main-nav-upper .nav {
+  max-height: 45px !important;
+}
+
+#main-nav .main-nav-upper .nav li {
+  max-height: 45px !important;
+}
+
+#main-nav .main-nav-upper .nav li a {
+  max-height: 45px !important;
+}
+
+#main-nav .main-nav-upper .nav li a i.fixme:before {
+  top: 0 !important;
+}
+
+
+#main-nav > .navbar-inner {
+  background-color: inherit;
+  background-image: linear-gradient(to bottom, #3f4349 0%, #464c51 100%);
+}
+
+.navbar-inner {
+  height: auto;
+  min-height: 0;
+}
+
+.main-nav-upper {
+  height: auto;
+  min-height: 0;
+}
+
+#main-nav > .main-nav-upper {
+  filter: none;
+  border-top: 3px solid #6C2D58;
+  background: #B2577A !important;
+  border-bottom: none;
+  height: 44px !important;
+  min-height: 44px !important;
+  box-shadow: none;
+}
+
+#main-nav > .main-nav-lower {
+  border-top: 1px solid #53565b;
+  box-shadow: none;
+  background: #3f4349;
+
+  background: -moz-linear-gradient(top, #3f4349 0%, #464c51 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#3f4349), color-stop(100%,#464c51));
+  background: -webkit-linear-gradient(top, #3f4349 0%,#464c51 100%);
+  background: -o-linear-gradient(top, #3f4349 0%,#464c51 100%);
+  background: -ms-linear-gradient(top, #3f4349 0%,#464c51 100%);
+  background: linear-gradient(to bottom, #3f4349 0%,#464c51 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3f4349', endColorstr='#464c51',GradientType=0 );
+
+  padding: 0px;
+  height: 42px;
+  max-height: 42px;
+  min-height: 42px;
+  border-bottom: none;
+
+}
+
+/*
+.prefs > .row-fluid > .tabbable > .nav.nav-tabs {
+  margin-top: 0 !important;
+  border-radius: 0 !important;
+  border: none !important;
+  max-height: 45px !important;
+  min-height: 45px !important;
+  border-bottom: 1px solid #cecdcd !important;
+}
+*/
+
+.prefs > .row-fluid > .tabbable > .nav.nav-tabs > li {
+  margin-bottom: 0px;
+  margin-top: 0px;                                          padding-left: 20px;
+  padding-right: 20px;
+}
+
+.prefs > .row-fluid > .tabbable > .nav.nav-tabs > li > a {
+  background-image: none;
+  background: #f6f6f6;
+  color: #4d5258;
+  border-radius: 0;
+  padding-left: 0px;
+  padding-right: 0px;
+  padding-top: 6px;
+  padding-bottom: 5px;
+}
+
+.prefs > .row-fluid > .tabbable > .nav.nav-tabs > li.active a {
+  border: none;
+  border-bottom: 1px solid #6C2D58 !important;
+}
+
+#main-nav > .navbar-inner.main-nav-upper > .container > .pull-left > .brand {
+  color: #fff;
+  text-shadow: none;
+}
+
+#main-nav > .navbar-inner.main-nav-lower .nav {
+  width: 100%;
+  float: none;
+  position: relative;
+  top: -1px;
+  height: 42px;
+  background: inherit;
+  background-color: inherit;
+  background-image: inherit;
+  background-image: linear-gradient(to bottom, #474d52, #3f4349 100%);
+  border-top: 1px solid #565b60;
+}
+
+.main-nav-lower > .container > ul > .dropdown.overflow {
+  margin-right: 0;
+}
+
+@media (max-width: 767px) {
+  .navbar .container {
+    margin-left: 10px;
+    margin-right: 10px;
+  }
+
+  .main-nav-lower > .container > ul > .dropdown.overflow {
+    margin-right: 45px;
+  }
+
+}
+
+.main-nav-lower > .container {
+  padding-left: 0 !important;
+  padding-right: 0 !important;
+}
+
+#main-nav > .main-nav-lower > .container .nav > li.overflow > ul > li > a {
+  font-weight: normal;
+  color: #4D5258;
+}
+
+#main-nav > .main-nav-lower .nav > li.overflow.open > a {
+  color: #ffffff;
+  text-shadow: none;
+  border-top: 1px solid #949699;
+  background-color: inherit;
+  background-image: linear-gradient(to bottom, #72757a 0%, #64686C 100%);
+  font-weight: bold;
+  border-bottom: none;
+}
+
+.dropdown-menu {
+  border-radius: 0;
+}
+
+#main-nav > .navbar-inner .nav > li > a {
+  margin-top: -1px;
+  border-top: 1px solid #53565B;
+  color: #ffffff;
+  text-shadow: none;
+  height: 32px;
+  padding-bottom: 0;
+}
+
+#main-nav > .navbar-inner .nav > li:hover > a {
+  color: #ffffff;
+  border-top: 1px solid #949699;
+  text-shadow: 1px 0 0 white;
+  background-color: inherit;
+  background-image: linear-gradient(to bottom, #5c6165, #4b5053 100%);
+}
+
+
+#main-nav .navbar-inner .nav li.active a {
+  color: #ffffff;
+  text-shadow: none;
+  border-top: 1px solid #949699;
+  background-color: inherit;
+  background-image: linear-gradient(to bottom, #72757a 0%, #64686C 100%);
+  font-weight: bold;
+}
+
+#main-nav .navbar-inner.main-nav-upper .nav {
+
+}
+
+#main-nav .navbar-inner.main-nav-upper .nav > li {
+  height: 44px;
+  border-left: 1px solid #585b5e;
+}
+
+#main-nav .navbar-inner.main-nav-upper .nav > li > a {
+  position: relative;
+  top: 1px;
+  padding-top: 1px;
+  border-radius: 0;
+  border: none;
+  height: 44px;
+  max-height: 44px;
+}
+
+#main-nav .navbar-inner.main-nav-upper .nav > li:hover a {
+
+}
+
+#main-nav .navbar-inner.main-nav-upper .nav li a i:before {
+  position: relative;
+  top: 2px;
+}
+
+#main-nav .navbar-inner.main-nav-upper .nav li.dropdown a.dropdown-toggle span:not(.caret) {
+  display: inline-block;
+  margin-top: 2px;
+}
+
+#main-nav .navbar-inner.main-nav-upper .nav li.dropdown a.dropdown-toggle span.caret {
+  margin-top: 10px;
+  margin-left: 1px;
+}
+
+#main-nav .main-nav-upper .nav li.dropdown.open a.dropdown-toggle {
+  color: #ffffff !important;
+  text-shadow: none;
+  background-color: inherit;
+  background-image: linear-gradient(to bottom, #72757a 0%, #64686C 100%);
+  border-bottom-color: inherit !important;
+}
+
+#main-nav .main-nav-upper .nav li.dropdown .dropdown-menu li {
+  border: none !important;
+}
+
+#main-nav .main-nav-upper .nav li.dropdown .dropdown-menu li a {
+  color: #4D5258;
+  border: none !important;
+  padding-top: 2px !important;
+  height: 22px;
+}
+
+#main-nav .main-nav-upper .nav li.dropdown .dropdown-menu li:hover a {
+  border: none;
+  color: white;
+}
+
+#main-nav .navbar-inner.main-nav-upper .nav li.active a {
+  border-top: none;
+}
+
+.navbar .nav > li > .dropdown-menu:before {
+  display: none;
+}
+
+.navbar .nav > li > .dropdown-menu:after {
+  display: none;
+}
+
+#main.container-fluid {
+  padding-left: 0;
+  padding-right: 0;
+}
+
+#main.container-fluid div .nav {
+  background-image: none;
+  background: #f6f6f6;
+  border-radius: 0;
+  line-height: 18px;
+  padding: 0;
+  max-height: 45px;
+  min-height: 45px;
+  border-top: none;
+  border-bottom: 1px solid #cecdcd;
+}
+
+#main.container-fluid div .nav li {
+  margin-bottom: 0;
+  margin-top: 0;
+  padding-left: 0;
+  padding-right: 0;
+}
+
+#main.container-fluid div .nav li a {
+  background-image: none;
+  background: #f6f6f6;
+  color: #4d5258;
+  border-radius: 0;
+  border: 1px solid inherit;
+  padding: 6px 20px 5px 20px;
+}
+
+#main.container-fluid div .nav li a:hover {
+  border-radius: 0;
+  padding-top: 6px;
+  padding-bottom: 5px;
+}
+
+#main.container-fluid div .nav li.overflow a:hover  {
+  background-image: none;
+  background-color: #6C2D58;
+  color: #4d5258
+}
+
+
+
+div#main div ul.nav li a:hover[disabled] {
+  border: 1px;
+  border-radius: 2px;
+  background: inherit;
+  color: #4d5258;
+  cursor: default;
+}
+
+#main.container-fluid div .nav li.active a {
+  border-radius: 0;
+  background-color: inherit;
+  background-image: none;
+  color: #6C2D58;
+  box-shadow: none;
+  border-bottom: 1px solid #6C2D58;
+}
+
+#main.container-fluid div .nav li.active a:hover {
+  border-radius: 0;
+  background-color: inherit;
+  background-image: none;
+  color: #6C2D58;
+  box-shadow: none;
+  border-bottom: 1px solid #6C2D58;
+  padding-top: 6px;
+  padding-bottom: 5px;
+}
+
+/*
+div[ng-include][src='viewPartial'] .row-fluid {
+  padding-left: 10px;
+  padding-right: 10px;
+  width: auto;
+}
+*/
+
+.nav li a {
+  cursor: pointer;
+}
+
+
+select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input {
+  font-size: 13.5px;
+  border-radius: 0;
+  /*
+  color: #555555;
+  display: inline-block;
+  font-size: 14px;
+  height: 20px;
+  line-height: 20px;
+  margin-bottom: 10px;
+  padding: 4px 6px;
+  vertical-align: middle;
+  */
+}
+
+div[ng-controller='Core.LoginController']:after {
+  position: absolute;
+  top: 50px;
+  right: 64px;
+  content: url('../img/login-screen-logo.png');
+}
+
+
+.login-wrapper {
+  top: inherit;
+  border-radius: 0;
+  box-shadow: none;
+  left: 0;
+  position: absolute;
+  bottom: 15%;
+  padding-left: 0;
+  width: 100%;
+  min-width: 850px;
+  border-top: 1px rgba(255, 255, 255, 0.05) solid;
+  border-bottom: 1px rgba(255, 255, 255, 0.05) solid;
+  background-color: rgba(178, 97, 130, 0.75);
+
+}
+
+.login-logo>img {
+  height: 80px;
+}
+
+.login-logo {
+  top: -100px;
+  /* with no app title */
+  /* left: 183px; */
+  left: 45px;
+  width: 700px;
+}
+
+.login-logo span {
+  position: relative;
+  top: 2px;
+  text-transform: uppercase;
+  letter-spacing: 0.5px;
+}
+
+.login-wrapper form {
+  background: inherit;
+  border-radius: 0;
+  box-shadow: none;
+  padding: 0;
+  margin: 0;
+}
+
+.login-wrapper form fieldset {
+  padding-top: 40px;
+  padding-bottom: 40px;
+  width: 344px;
+}
+
+.login-wrapper form fieldset .control-group label {
+  padding-top: 12px;
+}
+
+.login-wrapper form fieldset input[type="text"],
+.login-wrapper form fieldset input[type="password"] {
+  margin: 4px;
+  padding: 3px 6px;
+  min-width: 200px;
+  height: 26px;
+  border: 1px #b6b6b6 solid;
+  border-radius: 2px;
+  background: url("../img/input-background.png") repeat-x top left;
+}
+
+.login-wrapper form fieldset input[type="text"]:hover,
+.login-wrapper form fieldset input[type="password"]:hover {
+  border-color: #B2577A;
+}
+
+.login-wrapper form fieldset input[type="text"]:focus,
+.login-wrapper form fieldset input[type="password"]:focus {
+  border-color: #B2577A;
+  box-shadow: #B2577A 0 0 5px;
+}
+
+.login-wrapper form fieldset .control-group .controls .checkbox {
+  position: absolute;
+  top: 185px;
+  left: 181px;
+}
+
+.dropdown-menu li > a:hover,
+.dropdown-menu li > a:focus,
+.dropdown-submenu:hover > a {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #B26182;
+  background-image: -moz-linear-gradient(top, #B26182, #B2577A);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#B26182), to(#B2577A));
+  background-image: -webkit-linear-gradient(top, #B26182, #B2577A);
+  background-image: -o-linear-gradient(top, #B26182, #B2577A);
+  background-image: linear-gradient(to bottom, #B26182, #B2577A);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#B26182', endColorstr='#B2577A', GradientType=0);
+}
+
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: #B26182;
+  background-image: -moz-linear-gradient(top, #B26182, #B2577A);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#B26182), to(#B2577A));
+  background-image: -webkit-linear-gradient(top, #B26182, #B2577A);
+  background-image: -o-linear-gradient(top, #B26182, #B2577A);
+  background-image: linear-gradient(to bottom, #B26182, #B2577A);
+  background-repeat: repeat-x;
+  outline: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#B26182', endColorstr='#B2577A', GradientType=0);
+}
+
+.login-wrapper form fieldset button[type="submit"] {
+  position: relative;
+  left: 39px;
+  padding: 4px 14px;
+  border: 1px #B24E78 solid;
+  border-radius: 2px;
+  background-image: linear-gradient(top, #B26182 0%, #B2577A 100%);
+  background-image: -o-linear-gradient(top, #B26182 0%, #B2577A 100%);
+  background-image: -moz-linear-gradient(top, #B26182 0%, #B2577A 100%);
+  background-image: -webkit-linear-gradient(top, #B26182 0%, #B2577A 100%);
+  background-image: -ms-linear-gradient(top, #B26182 0%, #B2577A 100%);
+  background-image: -webkit-gradient(
+          linear,
+          left top,
+          left bottom,
+          color-stop(0.0, #B26182),
+          color-stop(1,0, #B2577A)
+  );
+  color: #fff;
+  font-weight: bold;
+  font-size: 12px;
+  letter-spacing: 0.6px;
+}
+
+.login-wrapper form fieldset button[type="submit"]:hover,
+.login-wrapper form fieldset button[type="submit"]:focus {
+  background-color: #B26182;
+  background-image: none;
+  cursor: pointer;
+}
+
+.login-wrapper form fieldset button[type="submit"]:active {
+  background-color: #B27497;
+  background-image: none;
+  cursor: pointer;
+  box-shadow: inset 0 0 5px 3px #B2577A;
+}
+
+.login-wrapper form fieldset input[type="checkbox"] {
+  margin-right: 6px;
+}
+
+.login-wrapper form fieldset input[type="text"],
+.login-wrapper form fieldset input[type="password"] {
+  color: #ffffff;
+  background-color: inherit;
+  margin: 4px 0px;
+  margin-bottom: 14px;
+  width: 282px;
+}
+
+.login-wrapper form fieldset button[type="submit"] {
+  float: right;
+  margin-top: 12px;
+}
+
+.logbar {
+  width: 100%;
+  left: 0;
+  background: inherit !important;
+  border-bottom: none !important;
+  box-shadow: none;
+  border-left: none;
+  border-right: none;
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+  padding-left: 0;
+  padding-right: 0;
+}
+
+.logbar-container > .control-group {
+  margin-bottom: 0;
+}
+
+.logbar-container > .control-group:first-child {
+  padding-left: 20px;
+}
+
+.logbar-container > .control-group:last-child {
+  padding-right: 20px;
+}
+
+.logbar-container {
+  margin-top: 4px;
+  margin-bottom: 4px;
+}
+
+.threads.logbar {
+  background-color: #F6F6F6 !important;
+  border-bottom: 1px solid #CECDCD !important;
+}
+
+.threads.logbar > .logbar-container {
+  margin-bottom: 2px;
+}
+
+.threads.logbar > .logbar-container > .state-panel {
+  margin-left: 10px;
+  margin-top: 2px;
+}
+
+.threads.logbar > .logbar-container > .support-panel {
+  margin-right: 10px;
+}
+
+.wiki.logbar-container {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.wiki.logbar-container > .nav.nav-tabs {
+  background-color: #F6F6F6 !important;
+  border-bottom: 1px solid #CECDCD !important;
+  border-radius: 0 !important;
+  border-top: 0 !important;
+  border-left: 0 !important;
+  border-right: 0 !important;
+  margin-top: 0 !important;
+}
+
+div#main div ul.nav li a.nav-primary:hover, div#main div ul.nav li a.nav-primary:active, div#main div ul.nav li a.nav-primary.active, div#main div ul.nav li a.nav-primary.disabled, div#main div ul.nav li a.nav-primary[disabled] {
+  background-color: inherit;
+  color: #0044CC;
+}
+
+div#main div ul.nav li a.nav-primary {
+  background-color: inherit;
+  background-image: inherit;
+  background-repeat: repeat-x;
+  border-color: inherit;
+  color: #0044CC;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.nav.help-sidebar {
+  /*
+  background: none;
+  border-bottom: 0;
+  */
+  max-height: inherit !important;
+  position: relative;
+  left: -10px;
+}
+
+.nav.help-sidebar li:first-child {
+  padding-top: 3px;
+}
+
+.nav-tabs .dropdown-menu {
+  border-radius: 0;
+}
+
+.perspective-selector {
+  border-right: 1px solid #65696e;
+  background-color: inherit;
+}
+
+.perspective-selector:hover > a {
+  border-top: 1px solid #65696e;
+}
+
+.perspective-selector > a {
+  border-top: 1px solid #64696d !important;
+  background-image: linear-gradient(to bottom, #585d62 0%, #4e5257 100%);
+}
+
+#main-nav .dropdown-toggle > .caret:before {
+  color: white;
+}
+
+#main-nav li.dropdown.open > a.dropdown-toggle {
+  border-bottom: 1px solid #585b60;
+}
+
+#main-nav .dropdown.open,
+li.dropdown.open > a.dropdown-toggle {
+  color: white;
+  border-bottom: none;
+  background-color: inherit;
+  background-image: linear-gradient(to bottom, #72757a 0%, #64686C 100%);
+  text-shadow: 1px 0 0 white;
+
+}
+
+.dropdown-menu {
+  border: 1px solid #b6b6b6;
+  border-top: 0;
+  margin-top: 0;
+  padding: 0;
+  background-color: white;
+}
+
+.dropdown-menu > .divider {
+  margin: 0 !important;
+  border: 0;
+  color: #E5E5E5;
+}
+
+.dropdown-menu > li > a {
+  background: inherit;
+  text-shadow: none;
+  line-height: 22px;
+  font-size: 14px;
+  border: 0 !important;
+  padding: 0 !important;
+  max-height: 22px;
+}
+
+.dropdown-menu > li:hover {
+  color: #ffffff !important;
+  border-top: 1px solid #B24E78;
+  background-color: #B2577A !important;
+  background-image: linear-gradient(to bottom, #B2577A 0%, #B26182 100%) !important;
+  cursor: pointer;
+}
+
+.dropdown-menu > li:hover > span > ul.sub-menu > li {
+  color: #333333 !important;
+}
+
+.dropdown-menu > li:hover > span > ul.sub-menu > li:hover {
+  color: #ffffff !important;
+}
+
+.ngRow.selected {
+  color: #ffffff !important;
+  background-color: #6C2D58 !important;
+  border-bottom: 1px solid #d4d4d4;
+}
+
+.ngRow.selected .ngCell {
+  color: #ffffff !important;
+  background-color: #6C2D58 !important;
+  border-bottom: 1px solid #d4d4d4;
+}
+
+.ngRow.selected .ngCellText a {
+  color: #ffffff !important;
+  background-color: #6C2D58 !important;
+}
+
+.dropdown-menu > .divider:hover {
+  border-top: 0;
+  background-image: none !important;
+}
+
+.dropdown-menu > li:hover > a {
+  color: white !important;
+  text-shadow: 0px 0px 1px white;
+}
+
+.dropdown-menu > li {
+  padding-left: 10px !important;
+  padding-right: 10px !important;
+  line-height: 44px !important;
+  border-top: none;
+  max-height: 44px;
+}
+
+li.dropdown.open > a.dropdown-toggle {
+  color: #6C2D58;
+  border-bottom: 1px solid #6C2D58;
+}
+
+.main-nav-upper .container .pull-right .nav.nav-tabs .dropdown .caret:before {
+  color: white !important;
+}
+
+.wiki > ul > li[ng-repeat='link in breadcrumbs']:first-child {
+  padding-left: 20px !important;
+}
+
+.wiki > ul > li[ng-repeat='link in breadcrumbs'] {
+  padding-left: 5px !important;
+  padding-right: 5px !important;
+  white-space: nowrap;
+}
+
+.wiki > ul > li[ng-repeat='link in breadcrumbs'] a {
+  display: inline-block;
+}
+
+.wiki > ul > li[ng-repeat='link in breadcrumbs']:after {
+  position: relative;
+  top: 1px;
+  content: '/';
+}
+
+.wiki > ul > li[ng-repeat='link in breadcrumbs'].active:after {
+  content: '';
+}
+
+.wiki > ul > li.pull-right.dropdown {
+  padding-right: 20px;
+}
+
+.tabbable > .nav-tabs {
+  min-height: inherit !important;
+  max-height: inherit !important;
+}
+
+.tabbable li a {
+  background-color: inherit !important;
+}
+
+.tabbable li.active a {
+  border-bottom: 0 !important;
+}
+
+.no-bottom-margin .control-group {
+  margin-bottom: 10px;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li:first-child {
+  margin-left: 3px;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li.active:first-child {
+  margin-left: 3px;
+}
+
+.instance-name {
+  border-top-left-radius: 0;
+  padding: 0;
+  padding-left: 3px;
+  padding-top: 3px;
+  box-shadow: none;
+}
+
+ng-include[src="'app/jmx/html/subLevelTabs.html'"] .nav.nav-tabs {
+  border-radius: 0 !important;
+  margin-top: 0 !important;
+}
+
+div.wiki-fixed[ng-controller] .row-fluid .span12 .nav.nav-tabs {
+  border-radius: 0 !important;
+  margin-top: 0 !important;
+  border: none !important;
+  box-shadow: none !important;
+  background: inherit !important;
+  border-bottom: 1px solid #cecdcd !important;
+  position: relative;
+  top: -8px;
+  margin-bottom: 0 !important;
+}
+
+div.wiki-fixed[ng-controller] .row-fluid .span12 .nav.nav-tabs li a {
+  background: inherit !important;
+}
+
+.controller-section {
+  padding-left: 20px;
+  padding-right: 20px;
+}
+
+@media(max-width: 849px) {
+  .controller-section {
+    padding-left: 5px;
+    padding-right: 5px;
+  }
+
+}
+
+#jmxtree {
+  margin-left: 20px;
+}
+
+#activemqtree {
+  margin-left: 20px;
+}
+
+#cameltree {
+  margin-left: 20px;
+}
+
+.span9 #properties {
+  margin-right: 20px;
+}
+
+.wiki-fixed {
+  margin-left: 20px;
+  margin-right: 20px;
+}
+
+.CodeMirror * {
+  font-family: monospace;
+}
+
+.fabric-page-header .span4 h2 {
+  margin-top: 0px;
+}
+
+div[ng-controller="Log.LogController"] .logbar {
+
+}
+
+div[ng-controller="Log.LogController"] .logbar .logbar-container {
+  background: white;
+  margin :0px;
+  padding-top: 4px;
+  padding-bottom: 3px;
+  border-bottom: 1px solid #cecdcd !important;
+}
+
+.help-header {
+  background-color: #B2577A;
+  color: white;
+  padding-left: 10px;
+  padding-right: 10px;
+  border-radius: 4px;
+}
+
+.help-header img {
+  position: relative;
+  margin-right: 7px;
+  margin-left: 3px;
+  height: 22px;
+  top: -2px;
+}
+
+.about-display {
+  margin-left: auto;
+  margin-right: auto;
+  width: 700px;
+}
+
+.about-display > .about-header {
+  text-align: center;
+  background-color: #B2577A;
+  color: white;
+  padding-left: 10px;
+  padding-right: 10px;
+  border-radius: 4px;
+}
+
+.about-display > .about-header > img {
+  position: relative;
+  margin-right: 7px;
+  margin-left: 3px;
+  height: 22px;
+  top: -2px;
+}
+
+.camel-tree > .section-filter {
+  margin-left: 10px;
+  margin-top: 5px;
+  margin-right: 10px;
+}
+
+.dropdown-menu .sub-menu {
+  left: 190px;
+  top: -5px;
+}
+
+.hawtio-breadcrumb {
+  margin-top: 5px;
+  display: inline-block;
+}
+
+.hawtio-breadcrumb > li:first-child {
+  padding-left: 10px !important;
+}
+
+.hawtio-breadcrumb > li:last-child {
+  padding-right: 10px !important;
+}
+
+.hawtio-breadcrumb > li {
+  padding-left: 2px !important;
+  padding-right: 2px !important;
+}
+
+.nav.nav-tabs li .hawtio-dropdown .dropdown-menu {
+  margin-top: 7px;
+  border-top: none;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div > p,
+.hawtio-dropdown p {
+  color: #333333;
+}
+
+.can-invoke > .dynatree-icon:before,
+.icon-cog.can-invoke {
+  color: green !important;
+}
+
+.cant-invoke > .dynatree-icon:before,
+.icon-cog.cant-invoke {
+  color: red !important;
+}
+
+.pane-bar {
+  border-left: 1px solid #d4d4d4;
+  border-right: 1px solid #d4d4d4;
+  background: white;
+}
+
+.pane {
+  box-shadow: 0 0 50px rgba(0, 0, 0, 0.05);
+  background: #fff;
+  top: 90px;
+}
+
+.pane-header-wrapper {
+  box-shadow: 0 0 50px rgba(0, 0, 0, 0.2);
+}
+
+.navbar .nav > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu:after {
+  display: none;
+  border: none;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div > p,
+.hawtio-dropdown p {
+  border-top: 1px solid #d4d4d4;
+  border-bottom: 1px solid #d4d4d4;
+  background-image: linear-gradient(to bottom, #fff, #e5e5e5);
+}
+.dropdown.perspective-selector .dropdown-menu li.clear-recent {
+  border-top: 1px dashed #d4d4d4;
+}
+
+ng-include > .nav.nav-tabs {
+  border-left: none;
+  border-right: none;
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/branding.css
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/branding.css b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/branding.css
new file mode 100644
index 0000000..f11ff23
--- /dev/null
+++ b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/branding.css
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+#main-nav > .navbar-inner.main-nav-upper > .container > .pull-left > .brand {
+  /*
+  padding-top: 6px;
+  */
+  white-space: nowrap;
+}
+
+
+#main-nav > .navbar-inner.main-nav-upper > .container > .pull-left > .brand > img {
+  display: inline-block;
+  position: relative;
+  left: -3px;
+  height: 43px;
+}
+
+#main-nav > .navbar-inner.main-nav-upper > .container > .pull-left > .brand > strong {
+  font-weight: normal;
+  font-size: 18px;
+  position: relative;
+  top: 2px;
+  left: 0;
+}
+
+.brand > .with-text {
+  margin-top: 0;
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/doc/welcome.md
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/doc/welcome.md b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/doc/welcome.md
new file mode 100644
index 0000000..4b09501
--- /dev/null
+++ b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/doc/welcome.md
@@ -0,0 +1,15 @@
+
+![ActiveMQ Artemis logo](../activemq-branding/plugin/img/activemq-artemis-logo.png)
+
+Apache ActiveMQ Artemis 
+=======================
+
+
+Management Console
+------------------
+
+Links
+-----
+
+[Artemis User Guide](http://activemq.apache.org/artemis/docs/2.1.0/index.html)
+[Java Docs](http://activemq.apache.org/artemis/docs/javadocs/javadoc-2.1.0/index.html)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-artemis-logo.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-artemis-logo.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-artemis-logo.png
new file mode 100644
index 0000000..5e7e1c5
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-artemis-logo.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-logo.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-logo.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-logo.png
new file mode 100644
index 0000000..1766a89
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-logo.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq.png
new file mode 100644
index 0000000..cb2ff74
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background-checked.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background-checked.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background-checked.png
new file mode 100644
index 0000000..21be54a
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background-checked.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background-hover.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background-hover.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background-hover.png
new file mode 100644
index 0000000..b12873f
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background-hover.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background.png
new file mode 100644
index 0000000..9b0ee2e
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/checkbox-background.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/favicon.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/favicon.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/favicon.png
new file mode 100644
index 0000000..bd1375e
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/favicon.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/input-background.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/input-background.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/input-background.png
new file mode 100644
index 0000000..7c73159
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/input-background.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/cadf909f/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/login-screen-background.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/login-screen-background.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/login-screen-background.png
new file mode 100644
index 0000000..e94c417
Binary files /dev/null and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/login-screen-background.png differ


[5/6] activemq-artemis git commit: ARTEMIS-1270 Management Console - Hawtio Solution

Posted by cl...@apache.org.
ARTEMIS-1270 Management Console - Hawtio Solution

applying Artemis skin


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/12942a60
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/12942a60
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/12942a60

Branch: refs/heads/master
Commit: 12942a609f7eb0319bcf638b40d396fb2d943e80
Parents: fa7b247
Author: Michael Andre Pearce <Mi...@me.com>
Authored: Tue Jul 25 03:01:40 2017 +0100
Committer: Clebert Suconic <cl...@apache.org>
Committed: Tue Aug 1 14:55:03 2017 -0400

----------------------------------------------------------------------
 .gitignore                                      |   3 +
 .../artemis/cli/commands/etc/artemis.profile    |   2 +-
 .../cli/commands/etc/artemis.profile.cmd        |   2 +-
 .../cli/commands/etc/bootstrap-web-settings.txt |   2 +-
 artemis-distribution/pom.xml                    |   6 +-
 artemis-distribution/src/main/assembly/dep.xml  |   4 +-
 .../src/main/resources/licenses/bin/LICENSE     | 190 ++++++++++++++++++
 artemis-hawtio/activemq-branding/pom.xml        |  14 +-
 .../src/main/webapp/plugin/css/activemq.css     |  39 ++--
 .../src/main/webapp/plugin/css/branding.css     |   6 +-
 .../src/main/webapp/plugin/doc/welcome.md       |   7 +-
 .../webapp/plugin/img/activemq-artemis-logo.png | Bin 33442 -> 0 bytes
 .../main/webapp/plugin/img/activemq-logo.png    | Bin 21424 -> 0 bytes
 .../src/main/webapp/plugin/img/activemq.png     | Bin 16426 -> 21601 bytes
 .../src/main/webapp/plugin/img/favicon.png      | Bin 5030 -> 25918 bytes
 .../src/main/webapp/plugin/img/logo.png         | Bin 21340 -> 0 bytes
 .../src/main/webapp/plugin/js/plugin.js         |   4 +-
 artemis-hawtio/artemis-console/pom.xml          | 196 +++++++++++++++++++
 .../src/main/webapp/app/core/doc/about.md       |  53 +++++
 .../src/main/webapp/app/core/html/help.html     |  38 ++++
 .../src/main/webapp/app/jvm/html/connect.html   | 104 ++++++++++
 artemis-hawtio/artemis-plugin/pom.xml           |  14 +-
 artemis-hawtio/pom.xml                          |   9 +-
 .../resources/schema/artemis-configuration.xsd  |  11 +-
 .../core/config/impl/FileConfigurationTest.java |   2 +-
 .../activemq/artemis/ActiveMQWebLogger.java     |   4 +-
 .../artemis/component/WebServerComponent.java   |  10 +-
 artemis-website/pom.xml                         |   2 +
 artemis-website/src/main/resources/index.html   |   1 +
 pom.xml                                         |   3 +
 30 files changed, 656 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 9869bc8..9661e9c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,6 @@ artemis-native/src/main/c/org_apache_activemq_artemis_jlibaio_LibaioContext.h
 # gitbook output
 docs/user-manual/en/_book
 docs/hacking-guide/en/_book
+
+# overlay outpit
+**/overlays/**/*

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile
index ed23e53..baeac56 100644
--- a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile
+++ b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile
@@ -28,7 +28,7 @@ ARTEMIS_INSTANCE_URI='${artemis.instance.uri}'
 
 
 # Java Opts
-JAVA_ARGS="${java-opts} -XX:+PrintClassHistogram -XX:+UseG1GC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -Xms512M -Xmx2G"
+JAVA_ARGS="${java-opts} -XX:+PrintClassHistogram -XX:+UseG1GC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -Xms512M -Xmx2G -Dhawtio.realm=activemq -Dhawtio.role=${role} -Dhawtio.rolePrincipalClasses=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal"
 
 #
 # There might be options that you only want to enable on specifc commands, like setting a JMX port

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile.cmd
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile.cmd b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile.cmd
index e2d7ded..23a75ec 100644
--- a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile.cmd
+++ b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/artemis.profile.cmd
@@ -28,7 +28,7 @@ rem Cluster Properties: Used to pass arguments to ActiveMQ Artemis which can be
 rem set ARTEMIS_CLUSTER_PROPS=-Dactivemq.remoting.default.port=61617 -Dactivemq.remoting.amqp.port=5673 -Dactivemq.remoting.stomp.port=61614 -Dactivemq.remoting.hornetq.port=5446
 
 rem Java Opts
-set JAVA_ARGS=${java-opts} -XX:+PrintClassHistogram -XX:+UseG1GC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -Xms512M -Xmx1024M -Xbootclasspath/a:%ARTEMIS_HOME%\lib\${logmanager} -Djava.security.auth.login.config=%ARTEMIS_INSTANCE%\etc\login.config -Dartemis.instance=%ARTEMIS_INSTANCE%
+set JAVA_ARGS=${java-opts} -XX:+PrintClassHistogram -XX:+UseG1GC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -Xms512M -Xmx1024M -Xbootclasspath/a:%ARTEMIS_HOME%\lib\${logmanager} -Djava.security.auth.login.config=%ARTEMIS_INSTANCE%\etc\login.config -Dhawtio.realm=activemq -Dhawtio.role=${role} -Dhawtio.rolePrincipalClasses=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal -Dartemis.instance=%ARTEMIS_INSTANCE%
 
 rem There might be options that you only want to enable on specifc commands, like setting a JMX port
 rem See https://issues.apache.org/jira/browse/ARTEMIS-318

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt
index 7c19c21..feb179c 100644
--- a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt
+++ b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/bootstrap-web-settings.txt
@@ -3,5 +3,5 @@
        <app url="jolokia" war="jolokia.war"/>
        <app url="activemq-branding" war="activemq-branding.war"/>
        <app url="artemis-plugin" war="artemis-plugin.war"/>
-       <app url="hawtio" war="hawtio.war"/>
+       <app url="console" war="console.war"/>
    </web>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-distribution/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-distribution/pom.xml b/artemis-distribution/pom.xml
index a9285d8..206aa8f 100644
--- a/artemis-distribution/pom.xml
+++ b/artemis-distribution/pom.xml
@@ -172,9 +172,9 @@
 
        <!-- Management Console Dependencies -->
        <dependency>
-           <groupId>io.hawt</groupId>
-           <artifactId>hawtio-no-slf4j</artifactId>
-           <version>1.5.2</version>
+           <groupId>org.apache.activemq</groupId>
+           <artifactId>artemis-console</artifactId>
+           <version>${project.version} </version>
            <type>war</type>
        </dependency>
        <dependency>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-distribution/src/main/assembly/dep.xml
----------------------------------------------------------------------
diff --git a/artemis-distribution/src/main/assembly/dep.xml b/artemis-distribution/src/main/assembly/dep.xml
index 2d91419..5770bce 100644
--- a/artemis-distribution/src/main/assembly/dep.xml
+++ b/artemis-distribution/src/main/assembly/dep.xml
@@ -146,11 +146,11 @@
       <!-- Management Console Dependencies -->
       <dependencySet>
          <includes>
-            <include>io.hawt:hawtio-no-slf4j:war</include>
+            <include>org.apache.activemq:artemis-console:war</include>
          </includes>
          <outputDirectory>web</outputDirectory>
          <unpack>false</unpack>
-         <outputFileNameMapping>hawtio.war</outputFileNameMapping>
+         <outputFileNameMapping>console.war</outputFileNameMapping>
       </dependencySet>
       <dependencySet>
          <includes>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-distribution/src/main/resources/licenses/bin/LICENSE
----------------------------------------------------------------------
diff --git a/artemis-distribution/src/main/resources/licenses/bin/LICENSE b/artemis-distribution/src/main/resources/licenses/bin/LICENSE
index b1164f3..e7dff44 100644
--- a/artemis-distribution/src/main/resources/licenses/bin/LICENSE
+++ b/artemis-distribution/src/main/resources/licenses/bin/LICENSE
@@ -243,3 +243,193 @@ Notice from author (Robert Harder, rob@iharder.net):
 
 See: http://iharder.sourceforge.net/current/java/base64/
 
+
+==============================================================================
+Apache ActiveMQ Artemis Subcomponents:
+
+The Apache ActiveMQ Artemis project contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for the these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+==============================================================================
+Subcomponent: Apache ActiveMQ Artemis Management Console
+
+The next section covers the Apache ActiveMQ Artemis Management Console war.
+The management console is based on HAWTIO, which itself is ASL V2.
+This subcomponent is bundled by default but is optional.
+It bundles the below declared packages not covered by ASL V2.
+
+==============================================================================
+For Angular:
+==============================================================================
+This product bundles Angular from data tables, which is available under a
+"MIT" license.  For details, see
+https://angular.io/license
+
+==============================================================================
+For ColReorder:
+==============================================================================
+This product bundles ColReorder, which is available under a
+"MIT" license.  For details, see
+https://github.com/DataTables/Dist-DataTables-ColReorder/blob/master/License.txt
+
+==============================================================================
+For Dagre:
+==============================================================================
+This product bundles Dagre, which is available under a
+"MIT" license.  For details, see
+https://github.com/cpettitt/dagre/blob/master/LICENSE
+
+==============================================================================
+For Dangle:
+==============================================================================
+This product bundles Dangle, which is available under a
+"MIT" license.  For details, see
+https://github.com/fullscale/dangle/blob/master/LICENSE.txt
+
+==============================================================================
+For Elastic:
+==============================================================================
+This product bundles Dangle, which is available under a
+"MIT" license.  For details, see
+https://github.com/fullscale/elastic.js/blob/master/LICENSE-MIT
+
+
+==============================================================================
+For html5shiv:
+==============================================================================
+This product bundles html5shiv, which is available under a
+"MIT" license and "GPL v2".  For details, see
+https://github.com/aFarkas/html5shiv/blob/master/MIT%20and%20GPL2%20licenses.md
+
+
+==============================================================================
+For jQuery:
+==============================================================================
+This product bundles jQuery, which is available under a
+"MIT" license.  For details, see
+https://jquery.org/license/
+
+==============================================================================
+For JSONSchema.js:
+==============================================================================
+This product bundles JSONSchema.js, which is available under a
+"MIT" license.  For details, see
+https://github.com/tdegrunt/jsonschema/blob/master/LICENSE
+
+==============================================================================
+For jsUri:
+==============================================================================
+This product bundles jsUri, which is available under a
+"MIT" license.  For details, see
+https://github.com/derek-watson/jsUri/blob/master/LICENSE
+
+
+==============================================================================
+For KeyTable:
+==============================================================================
+This product bundles KeyTable, which is available under a
+"MIT" license.  For details, see
+https://github.com/DataTables/KeyTable/blob/master/License.txt
+
+==============================================================================
+For Marked:
+==============================================================================
+This product bundles Marked, which is available under a
+"MIT" license.  For details, see
+https://github.com/chjj/marked
+
+==============================================================================
+For PrefixFree:
+==============================================================================
+This product bundles PrefixFree, which is available under a
+"MIT" license.  For details, see
+https://github.com/LeaVerou/prefixfree/blob/gh-pages/LICENSE
+
+==============================================================================
+For Sugar:
+==============================================================================
+This product bundles Sugar, which is available under a
+"MIT" license.  For details, see
+https://github.com/andrewplummer/Sugar/blob/master/LICENSE
+
+==============================================================================
+For Angular-Toastr:
+==============================================================================
+This product bundles Angular-Toastr, which is available under a
+"MIT" license.  For details, see
+https://github.com/Foxandxss/angular-toastr/blob/master/LICENSE
+
+==============================================================================
+For Bootstrap:
+==============================================================================
+This product bundles Bootstrap, which is available under a
+"MIT" license.  For details, see
+https://github.com/twbs/bootstrap/blob/master/LICENSE
+
+==============================================================================
+For URI.js:
+==============================================================================
+This product bundles URI.js, which is available under a
+"MIT" license.  For details, see
+https://github.com/medialize/URI.js/blob/gh-pages/LICENSE.txt
+
+==============================================================================
+For ZeroClipboard:
+==============================================================================
+This product bundles ZeroClipboard, which is available under a
+"MIT" license.  For details, see
+https://github.com/zeroclipboard/zeroclipboard/blob/master/LICENSE
+
+==============================================================================
+For ZeroClipboard:
+==============================================================================
+This product bundles ZeroClipboard, which is available under a
+"MIT" license.  For details, see
+https://github.com/zeroclipboard/zeroclipboard/blob/master/LICENSE
+
+==============================================================================
+For CodeMirror:
+==============================================================================
+This product bundles CodeMirror, which is available under a
+"MIT" license.  For details, see
+https://github.com/codemirror/CodeMirror/blob/master/LICENSE
+
+==============================================================================
+For CodeMirror:
+==============================================================================
+This product bundles CodeMirror, which is available under a
+"MIT" license.  For details, see
+https://github.com/codemirror/CodeMirror/blob/master/LICENSE
+
+==============================================================================
+For D3:
+==============================================================================
+This product bundles D3, which is available under a
+"BSD 3-clause" license.  For details, see
+https://github.com/d3/d3/blob/master/LICENSE
+
+==============================================================================
+For Font-Awesome:
+==============================================================================
+This product bundles Font-Awesome code, which is available under a
+"MIT" license.  
+This product bundles Font-Awesome fonts, which is available under a
+"SIL OFL 1.1" license.
+For details, see
+http://fontawesome.io/license/
+
+==============================================================================
+For JS-Logger:
+==============================================================================
+This product bundles JS-Logger, which is available under a
+"MIT" license.  For details, see
+https://github.com/jonnyreeves/js-logger/blob/master/MIT-LICENSE.txt
+
+==============================================================================
+For Underscore:
+==============================================================================
+This product bundles Underscore, which is available under a
+"MIT" license.  For details, see
+https://github.com/jashkenas/underscore/blob/master/LICENSE
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/pom.xml b/artemis-hawtio/activemq-branding/pom.xml
index 1363f38..b87a4df 100644
--- a/artemis-hawtio/activemq-branding/pom.xml
+++ b/artemis-hawtio/activemq-branding/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-hawtio-pom</artifactId>
-        <version>2.2.0-SNAPSHOT</version>
+        <version>2.3.0-SNAPSHOT</version>
     </parent>
     
     <artifactId>activemq-branding</artifactId>
@@ -51,10 +51,10 @@
 
         <!-- this lets this plugin deploy nicely into karaf, these get used
           for the ImportPackage directive for maven-bundle-plugin -->
-        <fuse.osgi.import>
+        <osgi.import>
             javax.servlet,
             *;resolution:=optional
-        </fuse.osgi.import>
+        </osgi.import>
 
         <webapp-dir>${project.artifactId}-${project.version}</webapp-dir>
         <webapp-outdir>${basedir}/target/${webapp-dir}</webapp-outdir>
@@ -208,10 +208,10 @@
                         <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
                         <Embed-Transitive>true</Embed-Transitive>
 
-                        <Export-Package>${fuse.osgi.export}</Export-Package>
-                        <Import-Package>${fuse.osgi.import}</Import-Package>
-                        <DynamicImport-Package>${fuse.osgi.dynamic}</DynamicImport-Package>
-                        <Private-Package>${fuse.osgi.private.pkg}</Private-Package>
+                        <Export-Package>${osgi.export}</Export-Package>
+                        <Import-Package>${osgi.import}</Import-Package>
+                        <DynamicImport-Package>${osgi.dynamic}</DynamicImport-Package>
+                        <Private-Package>${osgi.private.pkg}</Private-Package>
 
                         <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/activemq.css
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/activemq.css b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/activemq.css
index fc0d296..8c0a41e 100644
--- a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/activemq.css
+++ b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/activemq.css
@@ -17,8 +17,8 @@
 
 /* fonts */
 
-@import url("../../../hawtio/app/themes/fonts/Open-Sans/stylesheet.css");
-@import url("../../../hawtio/app/themes/fonts/Droid-Sans-Mono/stylesheet.css");
+@import url("../../../console/app/themes/fonts/Open-Sans/stylesheet.css");
+@import url("../../../console/app/themes/fonts/Droid-Sans-Mono/stylesheet.css");
 
 * {
   font-family: OpenSans;
@@ -1421,7 +1421,7 @@ h1, h2, h3, h4, h5, h6 {
 }
 
 a {
-  color: #6C2D58;
+  color: #B21054;
   text-decoration: none;
 }
 
@@ -1476,8 +1476,8 @@ a:hover {
 
 #main-nav > .main-nav-upper {
   filter: none;
-  border-top: 3px solid #6C2D58;
-  background: #B2577A !important;
+  border-top: 3px solid #B21054;
+  background: #FFFFFF !important;
   border-bottom: none;
   height: 44px !important;
   min-height: 44px !important;
@@ -1535,11 +1535,11 @@ a:hover {
 
 .prefs > .row-fluid > .tabbable > .nav.nav-tabs > li.active a {
   border: none;
-  border-bottom: 1px solid #6C2D58 !important;
+  border-bottom: 1px solid #B21054 !important;
 }
 
 #main-nav > .navbar-inner.main-nav-upper > .container > .pull-left > .brand {
-  color: #fff;
+  color: #333333;
   text-shadow: none;
 }
 
@@ -1640,10 +1640,12 @@ a:hover {
   border: none;
   height: 44px;
   max-height: 44px;
+  color: #333333;
 }
 
 #main-nav .navbar-inner.main-nav-upper .nav > li:hover a {
-
+  color: #ffffff;
+  text-shadow: none;
 }
 
 #main-nav .navbar-inner.main-nav-upper .nav li a i:before {
@@ -1687,6 +1689,7 @@ a:hover {
 
 #main-nav .navbar-inner.main-nav-upper .nav li.active a {
   border-top: none;
+  color: #ffffff
 }
 
 .navbar .nav > li > .dropdown-menu:before {
@@ -1738,7 +1741,7 @@ a:hover {
 
 #main.container-fluid div .nav li.overflow a:hover  {
   background-image: none;
-  background-color: #6C2D58;
+  background-color: #B21054;
   color: #4d5258
 }
 
@@ -1756,18 +1759,18 @@ div#main div ul.nav li a:hover[disabled] {
   border-radius: 0;
   background-color: inherit;
   background-image: none;
-  color: #6C2D58;
+  color: #B21054;
   box-shadow: none;
-  border-bottom: 1px solid #6C2D58;
+  border-bottom: 1px solid #B21054;
 }
 
 #main.container-fluid div .nav li.active a:hover {
   border-radius: 0;
   background-color: inherit;
   background-image: none;
-  color: #6C2D58;
+  color: #B21054;
   box-shadow: none;
-  border-bottom: 1px solid #6C2D58;
+  border-bottom: 1px solid #B21054;
   padding-top: 6px;
   padding-bottom: 5px;
 }
@@ -2145,19 +2148,19 @@ li.dropdown.open > a.dropdown-toggle {
 
 .ngRow.selected {
   color: #ffffff !important;
-  background-color: #6C2D58 !important;
+  background-color: #B21054 !important;
   border-bottom: 1px solid #d4d4d4;
 }
 
 .ngRow.selected .ngCell {
   color: #ffffff !important;
-  background-color: #6C2D58 !important;
+  background-color: #B21054 !important;
   border-bottom: 1px solid #d4d4d4;
 }
 
 .ngRow.selected .ngCellText a {
   color: #ffffff !important;
-  background-color: #6C2D58 !important;
+  background-color: #B21054 !important;
 }
 
 .dropdown-menu > .divider:hover {
@@ -2179,8 +2182,8 @@ li.dropdown.open > a.dropdown-toggle {
 }
 
 li.dropdown.open > a.dropdown-toggle {
-  color: #6C2D58;
-  border-bottom: 1px solid #6C2D58;
+  color: #B21054;
+  border-bottom: 1px solid #B21054;
 }
 
 .main-nav-upper .container .pull-right .nav.nav-tabs .dropdown .caret:before {

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/branding.css
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/branding.css b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/branding.css
index f11ff23..313548b 100644
--- a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/branding.css
+++ b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/css/branding.css
@@ -30,10 +30,10 @@
 }
 
 #main-nav > .navbar-inner.main-nav-upper > .container > .pull-left > .brand > strong {
-  font-weight: normal;
-  font-size: 18px;
+  font-weight: bold;
+  font-size: 17px;
   position: relative;
-  top: 2px;
+  top: 6px;
   left: 0;
 }
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/src/main/webapp/plugin/doc/welcome.md
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/doc/welcome.md b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/doc/welcome.md
index 4b09501..a294a5b 100644
--- a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/doc/welcome.md
+++ b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/doc/welcome.md
@@ -1,5 +1,5 @@
 
-![ActiveMQ Artemis logo](../activemq-branding/plugin/img/activemq-artemis-logo.png)
+![ActiveMQ Artemis logo](../activemq-branding/plugin/img/activemq.png)
 
 Apache ActiveMQ Artemis 
 =======================
@@ -11,5 +11,6 @@ Management Console
 Links
 -----
 
-[Artemis User Guide](http://activemq.apache.org/artemis/docs/2.1.0/index.html)
-[Java Docs](http://activemq.apache.org/artemis/docs/javadocs/javadoc-2.1.0/index.html)
\ No newline at end of file
+[Artemis User Guide](./help)
+
+[Java Docs](../api/index.html)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-artemis-logo.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-artemis-logo.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-artemis-logo.png
deleted file mode 100644
index 5e7e1c5..0000000
Binary files a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-artemis-logo.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-logo.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-logo.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-logo.png
deleted file mode 100644
index 1766a89..0000000
Binary files a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq-logo.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq.png
index cb2ff74..de602ee 100644
Binary files a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq.png and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/activemq.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/favicon.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/favicon.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/favicon.png
index bd1375e..21367c2 100644
Binary files a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/favicon.png and b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/favicon.png differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/logo.png
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/logo.png b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/logo.png
deleted file mode 100644
index d61b38e..0000000
Binary files a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/img/logo.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/activemq-branding/src/main/webapp/plugin/js/plugin.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/js/plugin.js b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/js/plugin.js
index 0277c21..cb811e9 100644
--- a/artemis-hawtio/activemq-branding/src/main/webapp/plugin/js/plugin.js
+++ b/artemis-hawtio/activemq-branding/src/main/webapp/plugin/js/plugin.js
@@ -30,7 +30,7 @@ var activemqBranding = (function (self) {
         Themes.definitions['activemq'] = {
             label: 'activemq',
             file: self.context + 'plugin/css/activemq.css',
-            loginBg: self.context + 'plugin/img/apache-login-background.jpg'
+            loginBg: self.context + 'plugin/img/login-screen-background.jpg'
         };
         var localStorage = Core.getLocalStorage();
         if (!('theme' in localStorage)) {
@@ -39,7 +39,7 @@ var activemqBranding = (function (self) {
         Themes.brandings['activemq'] = {
             label: 'activemq',
             setFunc: function(branding) {
-                branding.appName = 'Management Console';
+                branding.appName = 'MANAGEMENT CONSOLE';
                 branding.appLogo = self.context + 'plugin/img/activemq.png';
                 branding.logoOnly = false;
                 branding.fullscreenLogin = true;

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/artemis-console/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-console/pom.xml b/artemis-hawtio/artemis-console/pom.xml
new file mode 100644
index 0000000..9ad015a
--- /dev/null
+++ b/artemis-hawtio/artemis-console/pom.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.activemq</groupId>
+    <artifactId>artemis-hawtio-pom</artifactId>
+    <version>2.3.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>artemis-console</artifactId>
+  <name>ActiveMQ Artemis Console</name>
+
+  <!-- hawtio plugins are almost always war files -->
+  <packaging>war</packaging>
+
+  <properties>
+    <activemq.basedir>${project.basedir}/../..</activemq.basedir>
+  </properties>
+  
+  <dependencies>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+      <version>${servlet-api-version}</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>io.hawt</groupId>
+      <artifactId>hawtio-web</artifactId>
+      <version>${hawtio.version}</version>
+      <!--
+        NOTE this WAR dependency type which enables this WAR to
+        inherit all the plugins and content from the core hawtio-base WAR
+      -->
+      <type>war</type>
+    </dependency>
+
+    <!-- lets mark dependencies from the WAR as provided to avoid jetty:run adding duplicates -->
+    <dependency>
+      <groupId>io.hawt</groupId>
+      <artifactId>hawtio-core</artifactId>
+      <version>${hawtio.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.hawt</groupId>
+      <artifactId>hawtio-git</artifactId>
+      <version>${hawtio.version}</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-war-plugin</artifactId>
+        <version>${war-plugin-version}</version>
+        <configuration>
+          <useCache>true</useCache>
+          <packagingExcludes>**/lib/slf4j*.jar</packagingExcludes>
+          <failOnMissingWebXml>false</failOnMissingWebXml>
+          <webResources>
+            <resource>
+              <filtering>true</filtering>
+              <directory>src/main/webapp</directory>
+              <includes>
+                <include>**/*.md</include>
+                <!-- include any other file types you want to filter -->
+              </includes>
+            </resource>
+          </webResources>
+          <overlays>
+            <overlay>
+              <groupId>io.hawt</groupId>
+              <artifactId>hawtio-web</artifactId>
+              <excludes>
+                <exclude>bower_components/bootstrap/docs/build/**/*</exclude>
+                <exclude>bower_components/bootstrap/docs/examples/**/*</exclude>
+                <exclude>bower_components/bootstrap/docs/templates/**/*</exclude>
+                <exclude>bower_components/bootstrap/docs/assets/img/examples/**/*</exclude>
+                <exclude>bower_components/bootstrap/docs/assets/img/example-sites/**/*</exclude>
+                <exclude>bower_components/bootstrap/js/tests/**/*</exclude>
+                <exclude>bower_components/bootstrap/docs/**/*.html</exclude>
+                <exclude>bower_components/Font-Awesome/src/**/*</exclude>
+                <exclude>bower_components/d3/src/**/*</exclude>
+                <exclude>bower_components/d3/test/**/*</exclude>
+                <exclude>bower_components/elastic.js/src/**/*</exclude>
+                <exclude>bower_components/elastic.js/tests/**/*</exclude>
+                <exclude>bower_components/elastic.js/examples/**/*</exclude>
+                <exclude>bower_components/jquery/src/**/*</exclude>
+                <exclude>bower_components/jquery/test/**/*</exclude>
+                <exclude>bower_components/js-logger/src/**/*</exclude>
+                <excluse>WEB-INF/lib/slf4j-api*.jar</excluse>
+                <excluse>lib/camelModel.js</excluse>
+                <exclude>app/activemq/**/*</exclude>
+                <exclude>app/api/**/*</exclude>
+                <exclude>app/apm/**/*</exclude>
+                <exclude>app/camel/**/*</exclude>
+                <exclude>app/camin/**/*</exclude>
+                <exclude>app/datatable/**/*</exclude>
+                <exclude>app/dozer/**/*</exclude>
+                <exclude>app/elasticsearch/**/*</exclude>
+                <exclude>app/fabric/**/*</exclude>
+                <exclude>app/fabric-deploy/**/*</exclude>
+                <exclude>app/fabric-requirements/**/*</exclude>
+                <exclude>app/forcegraph/**/*</exclude>
+                <exclude>app/git/**/*</exclude>
+                <exclude>app/health/**/*</exclude>
+                <exclude>app/ide/**/*</exclude>
+                <exclude>app/infinispan/**/*</exclude>
+                <exclude>app/jboss/**/*</exclude>
+                <exclude>app/jclouds/**/*</exclude>
+                <exclude>app/junit/**/*</exclude>
+                <exclude>app/maven/**/*</exclude>
+                <exclude>app/openejb/**/*</exclude>
+                <exclude>app/quartz/**/*</exclude>
+                <exclude>app/site/**/*</exclude>
+                <exclude>app/springbatch/**/*</exclude>
+                <exclude>app/springBoot/**/*</exclude>
+                <exclude>app/tomcat/**/*</exclude>
+                <exclude>app/wiki-drop/**/*</exclude>
+              </excludes>
+            </overlay>
+          </overlays>
+        </configuration>
+        <executions>
+          <execution>
+            <id>prepare-war</id>
+            <phase>prepare-package</phase>
+            <goals>
+              <goal>exploded</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>com.google.code.maven-replacer-plugin</groupId>
+        <artifactId>replacer</artifactId>
+        <version>1.5.3</version>
+        <executions>
+          <execution>
+            <phase>prepare-package</phase>
+            <goals>
+              <goal>replace</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <file>${project.build.directory}/${project.build.finalName}/index.html</file>
+          <replacements>
+            <replacement>
+              <token>&lt;title&gt;.*&lt;/title&gt;</token>
+              <value>&lt;title&gt;${project.name}&lt;/title&gt;</value>
+            </replacement>
+          </replacements>
+        </configuration>
+      </plugin>
+      <plugin>
+        <artifactId>maven-clean-plugin</artifactId>
+        <version>2.5</version>
+        <configuration>
+          <filesets>
+            <fileset>
+              <directory>${basedir}/overlays</directory>
+              <includes>
+                <include>**/*.*</include>
+              </includes>
+              <followSymlinks>false</followSymlinks>
+            </fileset>
+          </filesets>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/artemis-console/src/main/webapp/app/core/doc/about.md
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-console/src/main/webapp/app/core/doc/about.md b/artemis-hawtio/artemis-console/src/main/webapp/app/core/doc/about.md
new file mode 100644
index 0000000..8d36813
--- /dev/null
+++ b/artemis-hawtio/artemis-console/src/main/webapp/app/core/doc/about.md
@@ -0,0 +1,53 @@
+<h3 class="about-header">About Apache ActiveMQ Artemis</h3>
+
+<div id="content">
+    <div class="wrapper">
+        <p>Apache ActiveMQ Artemis is an open source project to build a multi-protocol, embeddable, very high performance, clustered, asynchronous messaging system.</p>
+        <p>Apache ActiveMQ Artemis has a proven non blocking architecture. It delivers outstanding performance. </p>
+        <p>A full guide on features and usage can be found in the <a href="#/help">User Manual</a></p>
+        <p/>{{branding.appName}} is powered by <img class='no-shadow' ng-src='img/logo-16px.png'><a href="http://hawt.io/">hawtio</a><p/>
+        <h2 id = "Features">Features</h2>
+        <ul>
+            <li>AMQP protocol support</li>
+            <li>OpenWire support for ActiveMQ 5 clients</li>
+            <li>MQTT support</li>
+            <li>STOMP protocol support</li>
+            <li>HornetQ Core protocol support for HornetQ 2.4,2.5 clients</li>
+            <li>JMS 2.0 and 1.1 support</li>
+            <li>High availability with shared store and non shared store (replication)</li>
+            <li>Flexible Clustering</li>
+            <li>High performance journal for message persistence</li>
+            <li>Queue memory limitation</li>
+            <li>SSL support</li>
+            <li>Management over JMX, JMS and core protocol</li>
+            <li>Large message support</li>
+            <li>Topic hierarchies</li>
+            <li>Producer flow control</li>
+            <li>Consumer flow control</li>
+            <li>Diverts</li>
+            <li>Last value queue</li>
+            <li>Message Groups</li>
+            <li>OSGi support</li>
+        </ul>
+        <h2 id = "Links">Links</h2>
+        <ul>
+            <li><a target="_blank" href="#/help">User Manual</a></li>
+            <li><a href="https://activemq.apache.org/artemis/download.html">Download</a></li>
+            <li><a href="https://activemq.apache.org/artemis/migration.html">Migration</a></li>
+            <li><a href="https://activemq.apache.org/artemis/community.html">Community</a></li>
+        </ul>
+    </div>
+</div>
+
+
+<h4>Versions</h4>
+
+  **artemis** version: ${project.version}
+
+  **hawtio** version: {{hawtioVersion}}
+
+  **jolokia** version: {{jolokiaVersion}}
+
+<div ng-show="serverVendor">
+  <strong>server</strong> version: {{serverVendor}} {{serverProduct}} {{serverVersion}}
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/artemis-console/src/main/webapp/app/core/html/help.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-console/src/main/webapp/app/core/html/help.html b/artemis-hawtio/artemis-console/src/main/webapp/app/core/html/help.html
new file mode 100644
index 0000000..c06d8bd
--- /dev/null
+++ b/artemis-hawtio/artemis-console/src/main/webapp/app/core/html/help.html
@@ -0,0 +1,38 @@
+<!--
+  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.
+  Architecture
+-->
+<style>
+    #scroll-box {
+        background:#e6e6e6;
+        width:100%;
+        height: 100%;
+        padding:0px;
+        overflow-y: scroll;
+        overflow-x: scroll
+    }
+
+    #help-content
+    {
+        position:absolute; left: 0; right: 0; bottom: 0; top: 90px;
+    }
+</style>
+
+<div  ng-controller="Core.HelpController">
+    <div id="help-content">
+        <iframe id=scroll-box src="../user-manual/index.html" scrolling="yes" height="100%" width="100%" />
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/artemis-console/src/main/webapp/app/jvm/html/connect.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-console/src/main/webapp/app/jvm/html/connect.html b/artemis-hawtio/artemis-console/src/main/webapp/app/jvm/html/connect.html
new file mode 100644
index 0000000..06f8d8a
--- /dev/null
+++ b/artemis-hawtio/artemis-console/src/main/webapp/app/jvm/html/connect.html
@@ -0,0 +1,104 @@
+<!--
+  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.
+  Architecture
+-->
+<div ng-controller="JVM.ConnectController">
+
+    <div class="row-fluid connect-column-container" hawtio-auto-columns=".connect-column">
+
+        <div class="connect-column">
+            <div class="alert alert-info">
+                <p>
+                    This page allows you to connect to remote processes which <strong>already have a <a
+                        href="http://jolokia.org/">jolokia agent</a> running inside them</strong>. You will need to know the
+                    host name, port and path of the jolokia agent to be able to connect.
+                </p>
+
+                <p>
+                    If the process you wish to connect to does not have a jolokia agent inside, please refer to the <a
+                        href="http://jolokia.org/agent.html">jolokia documentation</a> for how to add a JVM, servlet or OSGi
+                    based agent inside it.
+                </p>
+
+                <p ng-show="hasLocalMBean()">
+                    Use the <strong><a href="#/jvm/local">Local Tab</a></strong> to connect to processes locally on this machine (which will install a jolokia agent automatically if required).
+                </p>
+
+                <p ng-show="!hasLocalMBean()">
+                    The <strong>Local Tab</strong> is not currently enabled because either the server side <strong>hawtio-local-jvm-mbean plugin</strong> is not installed or this
+                    JVM cannot find the <strong>com.sun.tools.attach.VirtualMachine</strong> API usually found in the <strong>tool.jar</strong>.
+                    Please see the <a href="http://hawt.io/faq/index.html">FAQ entry</a> for more details.
+                </p>
+            </div>
+        </div>
+
+        <div class="connect-column">
+
+            <dl>
+                <dt>Saved Connections</dt>
+                <dd>
+                    <form class="form-horizontal no-bottom-margin">
+                        <fieldset>
+                            <div class="control-group">
+                                <label class="control-label">Connections: </label>
+                                <div class="controls">
+                                    <select ng-model="lastConnection"
+                                            ng-options="value.name as key for (key, value) in connectionConfigs">
+                                        <option value=""
+                                                ng-hide="lastConnection">New connection...</option>
+                                    </select>
+                                    <button class="btn btn-success"
+                                            title="Connect to this server"
+                                            ng-disabled="!lastConnection"
+                                            ng-click="gotoServer()"><i class="icon-share"></i></button>
+                                    <button class="btn btn-danger"
+                                            title="Delete this connection"
+                                            ng-disabled="!lastConnection"
+                                            ng-click="deleteConnection()"><i class="icon-remove-sign"></i></button>
+                                    <button class="btn btn-primary"
+                                            title="Create a new connection"
+                                            ng-disabled="!lastConnection"
+                                            ng-click="newConnection()"><i class="icon-plus"></i></button>
+                                </div>
+                            </div>
+                        </fieldset>
+                    </form>
+                </dd>
+            </dl>
+
+            <dl>
+                <dt>Connection Settings</dt>
+                <dd>
+                    <div simple-form name="connectForm" data="formConfig" entity="currentConfig" onSubmit="gotoServer()"></div>
+
+                    <div class="centered">
+                        <button class="btn btn-primary"
+                                ng-disabled="!forms.connectForm.$valid"
+                                hawtio-submit="connectForm"
+                                title="Saves the connection and opens a new browser window connecting to the given JVM process via its Jolokia servlet URL">Connect to remote server</button>
+                        <button class="btn"
+                                title="Save this configuration but don't open a new tab"
+                                ng-disabled="!forms.connectForm.$valid"
+                                ng-click="save()">Save</button>
+                    </div>
+                </dd>
+            </dl>
+
+        </div>
+
+    </div>
+
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/artemis-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/pom.xml b/artemis-hawtio/artemis-plugin/pom.xml
index 234a054..3cad6da 100644
--- a/artemis-hawtio/artemis-plugin/pom.xml
+++ b/artemis-hawtio/artemis-plugin/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.activemq</groupId>
     <artifactId>artemis-hawtio-pom</artifactId>
-    <version>2.2.0-SNAPSHOT</version>
+    <version>2.3.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>artemis-plugin</artifactId>
@@ -50,10 +50,10 @@
 
     <!-- this lets this plugin deploy nicely into karaf, these get used
       for the ImportPackage directive for maven-bundle-plugin -->
-    <fuse.osgi.import>
+    <osgi.import>
       javax.servlet,
       *;resolution:=optional
-    </fuse.osgi.import>
+    </osgi.import>
 
     <webapp-dir>${project.artifactId}-${project.version}</webapp-dir>
     <webapp-outdir>${basedir}/target/${webapp-dir}</webapp-outdir>
@@ -212,10 +212,10 @@
             <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
             <Embed-Transitive>true</Embed-Transitive>
 
-            <Export-Package>${fuse.osgi.export}</Export-Package>
-            <Import-Package>${fuse.osgi.import}</Import-Package>
-            <DynamicImport-Package>${fuse.osgi.dynamic}</DynamicImport-Package>
-            <Private-Package>${fuse.osgi.private.pkg}</Private-Package>
+            <Export-Package>${osgi.export}</Export-Package>
+            <Import-Package>${osgi.import}</Import-Package>
+            <DynamicImport-Package>${osgi.dynamic}</DynamicImport-Package>
+            <Private-Package>${osgi.private.pkg}</Private-Package>
 
             <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-hawtio/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/pom.xml b/artemis-hawtio/pom.xml
index 7c60dd9..037f2d6 100644
--- a/artemis-hawtio/pom.xml
+++ b/artemis-hawtio/pom.xml
@@ -23,11 +23,11 @@
     <parent>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-pom</artifactId>
-        <version>2.2.0-SNAPSHOT</version>
+        <version>2.3.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>artemis-hawtio-pom</artifactId>
-    <name>ActiveMQ Artemis HawtIO</name>
+    <name>ActiveMQ Artemis Cons</name>
 
     <!-- hawtio plugins are almost always war files -->
     <packaging>pom</packaging>
@@ -39,7 +39,7 @@
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
         
-        <hawtio.version>1.5.2</hawtio.version>
+        <hawtio.version>1.5.0</hawtio.version>
         <jline.version>3.2.0</jline.version>
         <jolokia-version>1.3.6</jolokia-version>
         <junit-version>4.11</junit-version>
@@ -57,7 +57,7 @@
         <slf4j-api-version>1.6.6</slf4j-api-version>
         <slf4j-version>1.7.21</slf4j-version>
 
-        <war-plugin-version>2.1.1</war-plugin-version>
+        <war-plugin-version>2.6</war-plugin-version>
     </properties>
 
     <dependencyManagement>
@@ -99,6 +99,7 @@
     <modules>
         <module>activemq-branding</module>
         <module>artemis-plugin</module>
+        <module>artemis-console</module>
     </modules>
 
 </project>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-server/src/main/resources/schema/artemis-configuration.xsd
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index 87ec201..fb1d147 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -22,17 +22,8 @@
             elementFormDefault="qualified"
             version="1.0">
 
-   <xsd:element name="imports">
-      <xsd:complexType>
-         <xsd:sequence>
-            <xsd:element name="import" maxOccurs="unbounded" type="xsd:string"/>
-         </xsd:sequence>
-         <xsd:attribute name="type"/>
-      </xsd:complexType>
-   </xsd:element>
-   
    <xsd:element name="core" type="configurationType"/>
-   
+
    <xsd:complexType name="configurationType">
       <xsd:all>
          <xsd:element name="name" type="xsd:string" maxOccurs="1" minOccurs="0">

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
index 221468a..ddff9af 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
@@ -58,7 +58,7 @@ import org.junit.Test;
 
 public class FileConfigurationTest extends ConfigurationImplTest {
 
-   private final String fullConfigurationName = "configurationImport.xml";
+   private final String fullConfigurationName = "ConfigurationTest-full-config.xml";
 
    @Override
    @Test

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
----------------------------------------------------------------------
diff --git a/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java b/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
index ec60aeb..b50b70b 100644
--- a/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
+++ b/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
@@ -56,6 +56,6 @@ public interface ActiveMQWebLogger extends BasicLogger {
    void tmpFileNotDeleted(File tmpdir);
 
    @LogMessage(level = Logger.Level.INFO)
-   @Message(id = 241004, value = "Artemis Hawtio available at {0}", format = Message.Format.MESSAGE_FORMAT)
-   void hawtioAvailable(String bind);
+   @Message(id = 241004, value = "Artemis Console available at {0}", format = Message.Format.MESSAGE_FORMAT)
+   void consoleAvailable(String bind);
 }

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
----------------------------------------------------------------------
diff --git a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
index 59ad7b6..be21198 100644
--- a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
+++ b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
@@ -55,7 +55,7 @@ public class WebServerComponent implements ExternalComponent {
    private WebServerDTO webServerConfig;
    private URI uri;
    private String jolokiaUrl;
-   private String hawtioUrl;
+   private String consoleUrl;
    private List<WebAppContext> webContexts;
    private ServerConnector connector;
 
@@ -106,8 +106,8 @@ public class WebServerComponent implements ExternalComponent {
             if (app.war.startsWith("jolokia")) {
                jolokiaUrl = webServerConfig.bind + "/" + app.url;
             }
-            if (app.war.startsWith("hawtio")) {
-               hawtioUrl = webServerConfig.bind + "/" + app.url;
+            if (app.war.startsWith("console")) {
+               consoleUrl = webServerConfig.bind + "/" + app.url;
             }
          }
       }
@@ -140,8 +140,8 @@ public class WebServerComponent implements ExternalComponent {
       if (jolokiaUrl != null) {
          ActiveMQWebLogger.LOGGER.jolokiaAvailable(jolokiaUrl);
       }
-      if (hawtioUrl != null) {
-         ActiveMQWebLogger.LOGGER.hawtioAvailable(hawtioUrl);
+      if (consoleUrl != null) {
+         ActiveMQWebLogger.LOGGER.consoleAvailable(consoleUrl);
       }
    }
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-website/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-website/pom.xml b/artemis-website/pom.xml
index 432de6e..db9f1ac 100644
--- a/artemis-website/pom.xml
+++ b/artemis-website/pom.xml
@@ -160,6 +160,8 @@
                         </configuration>
                      </execution>
                   </executions>
+                  <configuration>
+                  </configuration>
                </plugin>
                <plugin>
                   <artifactId>maven-antrun-plugin</artifactId>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/artemis-website/src/main/resources/index.html
----------------------------------------------------------------------
diff --git a/artemis-website/src/main/resources/index.html b/artemis-website/src/main/resources/index.html
index 58890ec..25d6231 100644
--- a/artemis-website/src/main/resources/index.html
+++ b/artemis-website/src/main/resources/index.html
@@ -51,6 +51,7 @@
 <div id="content">
     <div class="wrapper">
         <ul>
+            <li><a target="_blank" href="console">Management Console</a></li>
             <li><a target="_blank" href="api/index.html">API</a></li>
             <li><a target="_blank" href="user-manual/index.html">User Manual</a></li>
             <li><a target="_blank" href="hacking-guide/index.html">Hacking Guide</a></li>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/12942a60/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 41db888..3675fc7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1538,6 +1538,9 @@
                   <exclude>**/node_modules/**</exclude>
                   <exclude>**/package.json</exclude>
                   <exclude>**/npm-shrinkwrap.json</exclude>
+                  
+                  <!-- Build time overlay folder -->
+                  <exclude>**/overlays/**</exclude>
 
                   <!-- things from cmake on the native build -->
                   <exclude>**/CMakeFiles/</exclude>


[2/6] activemq-artemis git commit: ARTEMIS-1270 Management Console - Hawtio Solution

Posted by cl...@apache.org.
ARTEMIS-1270 Management Console - Hawtio Solution

Add Artemis Plugin


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

Branch: refs/heads/master
Commit: fa7b247dc460eb76b588befbe4ee3aa5a49a4f5d
Parents: cadf909
Author: Andy Taylor <an...@apache.org>
Authored: Wed Jul 5 16:34:18 2017 +0100
Committer: Clebert Suconic <cl...@apache.org>
Committed: Tue Aug 1 14:54:27 2017 -0400

----------------------------------------------------------------------
 artemis-hawtio/artemis-plugin/README.md         |   3 +
 artemis-hawtio/artemis-plugin/pom.xml           | 263 ++++++++
 .../hawtio/plugin/PluginContextListener.java    |  71 ++
 .../src/main/resources/WEB-INF/web.xml          |  57 ++
 .../src/main/resources/log4j.properties         |  23 +
 .../src/main/webapp/plugin/doc/help.md          |  19 +
 .../main/webapp/plugin/html/artemisLayout.html  |  42 ++
 .../main/webapp/plugin/html/brokerDiagram.html  | 313 +++++++++
 .../main/webapp/plugin/html/browseQueue.html    | 156 +++++
 .../main/webapp/plugin/html/createAddress.html  |  44 ++
 .../main/webapp/plugin/html/createQueue.html    |  77 +++
 .../main/webapp/plugin/html/deleteAddress.html  |  48 ++
 .../main/webapp/plugin/html/deleteQueue.html    |  62 ++
 .../main/webapp/plugin/html/preferences.html    |  69 ++
 .../main/webapp/plugin/html/sendMessage.html    | 135 ++++
 .../src/main/webapp/plugin/js/address.js        | 119 ++++
 .../src/main/webapp/plugin/js/artemisHelpers.js | 126 ++++
 .../src/main/webapp/plugin/js/artemisPlugin.js  | 246 +++++++
 .../src/main/webapp/plugin/js/artemisService.js |  44 ++
 .../src/main/webapp/plugin/js/brokerDiagram.js  | 665 +++++++++++++++++++
 .../src/main/webapp/plugin/js/browse.js         | 499 ++++++++++++++
 .../main/webapp/plugin/js/jmsHeaderSchema.js    |  62 ++
 .../src/main/webapp/plugin/js/preferences.js    |  54 ++
 .../src/main/webapp/plugin/js/queue.js          | 152 +++++
 .../src/main/webapp/plugin/js/send.js           | 211 ++++++
 .../src/main/webapp/plugin/js/tree.js           |  76 +++
 .../main/webapp/plugin/lib/artemis-console.js   |  82 +++
 artemis-hawtio/pom.xml                          |   1 +
 28 files changed, 3719 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/README.md
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/README.md b/artemis-hawtio/artemis-plugin/README.md
new file mode 100644
index 0000000..dbf6e45
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/README.md
@@ -0,0 +1,3 @@
+# artemis-hawtio
+
+Is a HawtIO plugin that allows the viewing and manipulation of topic/queues and other JMS resources.

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/pom.xml b/artemis-hawtio/artemis-plugin/pom.xml
new file mode 100644
index 0000000..234a054
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/pom.xml
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.activemq</groupId>
+    <artifactId>artemis-hawtio-pom</artifactId>
+    <version>2.2.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>artemis-plugin</artifactId>
+  <name>ActiveMQ Artemis HawtIO Plugin</name>
+
+  <!-- hawtio plugins are almost always war files -->
+  <packaging>war</packaging>
+
+  <properties>
+    <activemq.basedir>${project.basedir}/../..</activemq.basedir>
+
+    <!-- filtered plugin properties, we don't define plugin-scripts here
+  as we build that dynamically using maven-antrun-plugin below. -->
+    <!-- plugin-context is what context this plugin will handle requests on
+      in the application server -->
+    <plugin-context>/artemis-plugin</plugin-context>
+
+    <!-- plugin-name is the name of our plugin, affects the name used for
+      the plugin's mbean -->
+    <plugin-name>${project.artifactId}</plugin-name>
+
+    <!-- plugin-domain is currently unused, we just define it to an empty
+      string -->
+    <plugin-domain/>
+
+    <!-- this lets this plugin deploy nicely into karaf, these get used
+      for the ImportPackage directive for maven-bundle-plugin -->
+    <fuse.osgi.import>
+      javax.servlet,
+      *;resolution:=optional
+    </fuse.osgi.import>
+
+    <webapp-dir>${project.artifactId}-${project.version}</webapp-dir>
+    <webapp-outdir>${basedir}/target/${webapp-dir}</webapp-outdir>
+    <schema-outdir>${basedir}/src/main/webapp/lib</schema-outdir>
+    <appjs-outfile>${webapp-outdir}/app/app.js</appjs-outfile>
+
+  </properties>
+
+  <dependencies>
+
+    <!-- we only need to embed this dependency in the war, this contains
+      a nice helper class that our plugin can use to export it's plugin
+      mbean -->
+    <dependency>
+      <groupId>io.hawt</groupId>
+      <artifactId>hawtio-plugin-mbean</artifactId>
+    </dependency>
+
+    <!-- servlet API is provided by the container -->
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
+    <!-- logging -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
+  </dependencies>
+
+
+  <build>
+
+    <!-- we want to ensure src/main/resources/WEB-INF/web.xml is being filtered
+      so that it picks up all of our javascript files -->
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>
+        <includes>
+          <include>**/*.xml</include>
+        </includes>
+      </resource>
+    </resources>
+
+    <plugins>
+
+      <!-- We use maven-antrun-plugin to build up a list of
+           javascript files for our plugin mbean, this means
+           it needs to run before the maven-resources-plugin
+           copies and filters the web.xml, since for this
+           example we use contextParam settings to configure
+           our plugin mbean -->
+
+      <plugin>
+        <artifactId>maven-antrun-plugin</artifactId>
+        <version>${maven-antrun-plugin-version}</version>
+        <executions>
+
+          <execution>
+            <!-- we run this early in the build process before
+              maven-resources-plugin is run.  We're exporting the
+              plugin-scripts property from here, so we need to
+              use maven-antrun-plugin 1.6 or up -->
+            <id>generate-sources</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>run</goal>
+            </goals>
+            <configuration>
+              <target>
+                <echo>Building plugin javascript file list</echo>
+                <!-- javascript-files will contain all of the javascript in
+                  our project -->
+                <fileset id="javascript-files" dir="${basedir}/src/main/webapp">
+                  <include name="**/*.js"/>
+                </fileset>
+                <!-- we need to strip out the top level path which is
+                   our source directory and be sure to change the directory
+                   separators to forward slashes -->
+                <pathconvert pathsep="," dirsep="/" property="plugin-scripts" refid="javascript-files">
+                  <map from="${basedir}/src/main/webapp/" to=""/>
+                </pathconvert>
+                <echo>Files: ${plugin-scripts}</echo>
+
+              </target>
+              <!-- this exports plugin-scripts to the maven build, without
+                this line ${plugin-scripts} in the web.xml file won't be
+                replaced -->
+              <exportAntProperties>true</exportAntProperties>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>${maven-resources-plugin-version}</version>
+        <executions>
+          <execution>
+            <!-- defining this maven plugin in the same phase as the
+              maven-antrun-plugin but *after* we've configured the
+              maven-antrun-plugin ensures we filter resources *after*
+              we've discovered the plugin .js files. -->
+            <id>copy-resources</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>resources</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!-- maven-bundle-plugin config, needed to make this war
+        deployable in karaf, defines the context that this bundle
+        should handle requests on -->
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>${maven-bundle-plugin-version}</version>
+        <executions>
+          <execution>
+            <id>bundle-manifest</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>manifest</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <manifestLocation>${webapp-outdir}/META-INF</manifestLocation>
+          <supportedProjectTypes>
+            <supportedProjectType>jar</supportedProjectType>
+            <supportedProjectType>bundle</supportedProjectType>
+            <supportedProjectType>war</supportedProjectType>
+          </supportedProjectTypes>
+          <instructions>
+            <Webapp-Context>${plugin-context}</Webapp-Context>
+            <Web-ContextPath>${plugin-context}</Web-ContextPath>
+
+            <Embed-Directory>WEB-INF/lib</Embed-Directory>
+            <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
+            <Embed-Transitive>true</Embed-Transitive>
+
+            <Export-Package>${fuse.osgi.export}</Export-Package>
+            <Import-Package>${fuse.osgi.import}</Import-Package>
+            <DynamicImport-Package>${fuse.osgi.dynamic}</DynamicImport-Package>
+            <Private-Package>${fuse.osgi.private.pkg}</Private-Package>
+
+            <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
+
+            <Bundle-Name>${project.description}</Bundle-Name>
+            <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
+            <Implementation-Title>HawtIO</Implementation-Title>
+            <Implementation-Version>${project.version}</Implementation-Version>
+          </instructions>
+        </configuration>
+      </plugin>
+
+      <!-- We define the maven-war-plugin here and make sure it uses
+        the manifest file generated by the maven-bundle-plugin.  We
+        also ensure it picks up our filtered web.xml and not the one
+        in src/main/resources -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-war-plugin</artifactId>
+        <version>${war-plugin-version}</version>
+        <configuration>
+          <outputFileNameMapping>@{artifactId}@-@{baseVersion}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
+          <packagingExcludes>**/classes/OSGI-INF/**</packagingExcludes>
+          <failOnMissingWebXml>false</failOnMissingWebXml>
+          <archive>
+            <manifestFile>${webapp-outdir}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+          <webResources>
+            <resource>
+              <filtering>true</filtering>
+              <directory>src/main/resources</directory>
+              <includes>
+                <include>**/*.*</include>
+              </includes>
+              <excludes>
+                <exclude>log4j.properties</exclude>
+              </excludes>
+            </resource>
+          </webResources>
+        </configuration>
+      </plugin>
+
+    </plugins>
+  </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/java/org/apache/activemq/hawtio/plugin/PluginContextListener.java
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/java/org/apache/activemq/hawtio/plugin/PluginContextListener.java b/artemis-hawtio/artemis-plugin/src/main/java/org/apache/activemq/hawtio/plugin/PluginContextListener.java
new file mode 100644
index 0000000..75fa706
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/java/org/apache/activemq/hawtio/plugin/PluginContextListener.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+package org.apache.activemq.hawtio.plugin;
+
+import io.hawt.web.plugin.HawtioPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+/**
+ * The Plugin Context Listener used to load in the plugin
+ **/
+public class PluginContextListener implements ServletContextListener {
+
+   private static final Logger LOG = LoggerFactory.getLogger(PluginContextListener.class);
+
+   HawtioPlugin plugin = null;
+
+   @Override
+   public void contextInitialized(ServletContextEvent servletContextEvent) {
+
+      ServletContext context = servletContextEvent.getServletContext();
+
+      plugin = new HawtioPlugin();
+      plugin.setContext((String)context.getInitParameter("plugin-context"));
+      plugin.setName(context.getInitParameter("plugin-name"));
+      plugin.setScripts(context.getInitParameter("plugin-scripts"));
+      plugin.setDomain(null);
+
+      try {
+         plugin.init();
+      } catch (Exception e) {
+         throw createServletException(e);
+      }
+
+      LOG.info("Initialized {} plugin", plugin.getName());
+   }
+
+   @Override
+   public void contextDestroyed(ServletContextEvent servletContextEvent) {
+      try {
+         plugin.destroy();
+      } catch (Exception e) {
+         throw createServletException(e);
+      }
+
+      LOG.info("Destroyed {} plugin", plugin.getName());
+   }
+
+   protected RuntimeException createServletException(Exception e) {
+      return new RuntimeException(e);
+   }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/resources/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/resources/WEB-INF/web.xml b/artemis-hawtio/artemis-plugin/src/main/resources/WEB-INF/web.xml
new file mode 100644
index 0000000..b6c454e
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/resources/WEB-INF/web.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
+	      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+	      http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
+	      version="2.4">
+
+  <description>An Artemis Plugin</description>
+  <display-name>An Artemis plugin</display-name>
+
+  <context-param>
+    <description>Plugin's path on the server</description>
+    <param-name>plugin-context</param-name>
+    <param-value>${plugin-context}</param-value>
+  </context-param>
+
+  <context-param>
+    <description>Plugin's path on the server</description>
+    <param-name>plugin-name</param-name>
+    <param-value>${project.artifactId}</param-value>
+  </context-param>
+
+  <context-param>
+    <description>Plugin's path on the server</description>
+    <param-name>plugin-domain</param-name>
+    <param-value>${plugin-domain}</param-value>
+  </context-param>
+
+  <context-param>
+    <description>Plugin's path on the server</description>
+    <param-name>plugin-scripts</param-name>
+    <param-value>${plugin-scripts}</param-value>
+  </context-param>
+
+  <listener>
+    <listener-class>org.apache.activemq.hawtio.plugin.PluginContextListener</listener-class>
+  </listener>
+
+
+</web-app>
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/resources/log4j.properties b/artemis-hawtio/artemis-plugin/src/main/resources/log4j.properties
new file mode 100644
index 0000000..52537ea
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/resources/log4j.properties
@@ -0,0 +1,23 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+log4j.rootLogger=INFO, console
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%-5p | %t | %m%n
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/doc/help.md
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/doc/help.md b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/doc/help.md
new file mode 100644
index 0000000..e875acd
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/doc/help.md
@@ -0,0 +1,19 @@
+### Artemis
+
+Click [Artemis](#/jmx/attributes?tab=artemis) in the top navigation bar to see the Artemis specific plugin. (The Artemis tab won't appear if there is no broker in this JVM).  The Artemis plugin works very much the same as the JMX plugin however with a focus on interacting with an Artemis broker.
+
+The tree view on the left-hand side shows the top level JMX tree of each broker instance running in the JVM.  Expanding the tree will show the various MBeans registered by Artemis that you can inspect via the **Attributes** tab.
+
+#### Creating a new Address
+
+To create a new address simply click on the broker or the address folder in the jmx tree and click on the create tab.
+
+Once you have created an address you should be able to **Send** to it by clicking on it in the jmx tree and clicking on the send tab.
+
+#### Creating a new Queue
+
+To create a new queue click on the address you want to bind the queue to and click on the create tab.
+
+Once you have created a queue you should be able to **Send** a message to it or **Browse** it or view the  **Attributes** or **Charts**. Simply click on the queue in th ejmx tree and click on the appropriate tab.
+
+You can also see a graphical view of all brokers, addresses, queues and their consumers using the **Diagram** tab. 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/artemisLayout.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/artemisLayout.html b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/artemisLayout.html
new file mode 100644
index 0000000..eb254c9
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/artemisLayout.html
@@ -0,0 +1,42 @@
+<!--
+  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.
+  Architecture
+-->
+<script type="text/ng-template" id="header">
+  <div class="tree-header" ng-controller="ARTEMIS.TreeHeaderController">
+    <div class="left">
+    </div>
+    <div class="right">
+      <i class="icon-chevron-down clickable"
+         title="Expand all nodes"
+         ng-click="expandAll()"></i>
+      <i class="icon-chevron-up clickable"
+         title="Unexpand all nodes"
+         ng-click="contractAll()"></i>
+    </div>
+  </div>
+</script>
+<hawtio-pane position="left" width="300" header="header">
+  <div id="tree-container"
+       ng-controller="Jmx.MBeansController">
+    <div id="artemistree"
+         ng-controller="ARTEMIS.TreeController"></div>
+  </div>
+</hawtio-pane>
+<div class="row-fluid">
+  <ng-include src="'app/jmx/html/subLevelTabs.html'"></ng-include>
+  <div id="properties" ng-view></div>
+</div>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/brokerDiagram.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/brokerDiagram.html b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/brokerDiagram.html
new file mode 100644
index 0000000..9d0fd05
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/brokerDiagram.html
@@ -0,0 +1,313 @@
+<!--
+  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.
+  Architecture
+-->
+<style type="text/css">
+
+.span4.node-panel {
+  margin-top: 10px;
+  margin-left: 10px;
+  width: 33%;
+}
+.node-attributes dl {
+  margin-top: 5px;
+  margin-bottom: 10px;
+}
+.node-attributes dt {
+  width: 150px;
+}
+.node-attributes dd {
+  margin-left: 160px;
+}
+.node-attributes dd a {
+  /** lets make the destination links wrap */
+  -ms-word-break: break-all;
+  word-break: break-all;
+  -webkit-hyphens: auto;
+  -moz-hyphens: auto;
+  hyphens: auto;
+}
+
+ul.viewMenu li {
+  padding-left: 10px;
+  padding-top: 2px;
+  padding-bottom: 2px;
+}
+
+div#pop-up {
+  display: none;
+  position: absolute;
+  color: white;
+  font-size: 14px;
+  background: rgba(0, 0, 0, 0.6);
+  padding: 5px 10px 5px 10px;
+  -moz-border-radius: 8px 8px;
+  border-radius: 8px 8px;
+}
+
+div#pop-up-title {
+  font-size: 15px;
+  margin-bottom: 4px;
+  font-weight: bolder;
+}
+
+div#pop-up-content {
+  font-size: 12px;
+}
+
+rect.graphbox {
+  fill: #FFF;
+}
+
+rect.graphbox.frame {
+  stroke: #222;
+  stroke-width: 2px
+}
+
+/* only things directly related to the network graph should be here */
+
+path.link {
+  fill: none;
+  stroke: #666;
+  stroke-width: 1.5px;  b
+}
+
+marker.broker {
+  stroke: red;
+  fill: red;
+  stroke-width: 1.5px;
+}
+
+circle.broker {
+  fill: #0c0;
+}
+
+circle.brokerSlave {
+  fill: #c00;
+}
+
+circle.notActive {
+  fill: #c00;
+}
+
+path.link.group {
+  stroke: #ccc;
+}
+
+marker#group {
+  stroke: #ccc;
+  fill: #ccc;
+}
+
+circle.group {
+  fill: #eee;
+  stroke: #ccc;
+}
+
+circle.destination {
+  fill: #bbb;
+  stroke: #ccc;
+}
+
+circle.pinned {
+  stroke-width: 4.5px;
+}
+
+path.link.profile {
+  stroke-dasharray: 0, 2 1;
+  stroke: #888;
+}
+
+marker#container {
+}
+
+circle.container {
+  stroke-dasharray: 0, 2 1;
+  stroke: #888;
+}
+
+path.link.container {
+  stroke-dasharray: 0, 2 1;
+  stroke: #888;
+}
+
+circle {
+  fill: #ccc;
+  stroke: #333;
+  stroke-width: 1.5px;
+  cursor: pointer;
+}
+
+circle.closeMode {
+  cursor: crosshair;
+}
+
+path.link.destination {
+  stroke: #ccc;
+}
+
+circle.topic {
+  fill: #c0c;
+}
+
+circle.queue {
+  fill: #00c;
+}
+
+circle.consumer {
+  fill: #cfc;
+}
+
+circle.producer {
+  fill: #ccf;
+}
+
+path.link.producer {
+  stroke: #ccc;
+}
+
+path.link.consumer {
+  stroke: #ccc;
+}
+
+path.link.network {
+  stroke: #ccc;
+}
+
+circle.selected {
+  stroke-width: 3px;
+}
+
+.selected {
+  stroke-width: 3px;
+}
+
+text {
+  font: 10px sans-serif;
+  pointer-events: none;
+}
+
+text.shadow {
+  stroke: #fff;
+  stroke-width: 3px;
+  stroke-opacity: .8;
+}
+</style>
+
+
+<div class="row-fluid mq-page" ng-controller="ARTEMIS.BrokerDiagramController">
+
+  <div ng-hide="inDashboard" class="span12 page-padded">
+    <div class="section-header">
+
+      <div class="section-filter">
+        <input type="text" class="search-query" placeholder="Filter..." ng-model="searchFilter">
+        <i class="icon-remove clickable" title="Clear filter" ng-click="searchFilter = ''"></i>
+      </div>
+
+      <div class="section-controls">
+        <a href="#"
+           class="dropdown-toggle"
+           data-toggle="dropdown">
+          View &nbsp;<i class="icon-caret-down"></i>
+        </a>
+
+        <ul class="dropdown-menu viewMenu">
+          <li>
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.consumer"> Consumers
+            </label>
+          </li>
+          <li>
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.producer"> Producers
+            </label>
+          </li>
+          <li>
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.address"> Addresses
+            </label>
+          </li>
+          <li>
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.queue"> Queues
+            </label>
+          </li>
+          <li class="divider"></li>
+          <li>
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.broker"> Brokers
+            </label>
+          </li>
+          <li>
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.slave"> Slave brokers
+            </label>
+          </li>
+          <li>
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.network"> Networks
+            </label>
+          </li>
+          <li class="divider"></li>
+          <li title="Should we show the details panel on the left">
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.panel"> Details panel
+            </label>
+          </li>
+          <li title="Show the summary popup as you hover over nodes">
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.popup"> Hover text
+            </label>
+          </li>
+          <li title="Show the labels next to nodes">
+            <label class="checkbox">
+              <input type="checkbox" ng-model="viewSettings.label"> Label
+            </label>
+          </li>
+        </ul>
+
+      </div>
+    </div>
+  </div>
+
+
+  <div id="pop-up">
+    <div id="pop-up-title"></div>
+    <div id="pop-up-content"></div>
+  </div>
+
+  <div class="row-fluid">
+    <div class="{{viewSettings.panel ? 'span8' : 'span12'}} canvas broker-canvas">
+      <div hawtio-force-graph graph="graph" selected-model="selectedNode" link-distance="150" charge="-600" nodesize="10" marker-kind="marker-end"
+           style="min-height: 800px">
+      </div>
+    </div>
+    <div ng-show="viewSettings.panel" class="span4 node-panel">
+      <div ng-show="selectedNode" class="node-attributes">
+        <dl ng-repeat="property in selectedNodeProperties" class="dl-horizontal">
+          <dt title="{{property.key}}">{{property.key}}:</dt>
+          <dd ng-bind-html-unsafe="property.value"></dd>
+        </dl>
+      </div>
+    </div>
+  </div>
+
+  <div ng-include="'app/fabric/html/connectToContainerDialog.html'"></div>
+
+</div>
+
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/browseQueue.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/browseQueue.html b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/browseQueue.html
new file mode 100644
index 0000000..650972c
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/browseQueue.html
@@ -0,0 +1,156 @@
+<!--
+  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.
+  Architecture
+-->
+<div ng-controller="ARTEMIS.BrowseQueueController">
+  <div class="row-fluid">
+    <div class="span6">
+      <input class="search-query span12" type="text" ng-model="gridOptions.filterOptions.filterText"
+             placeholder="Filter messages">
+    </div>
+    <div class="span6">
+      <div class="pull-right">
+        <form class="form-inline">
+          <button class="btn" ng-disabled="!gridOptions.selectedItems.length" ng-show="dlq" ng-click="retryMessages()"
+                  title="Moves the dead letter queue message back to its original destination so it can be retried" data-placement="bottom">
+            <i class="icon-reply"></i> Retry
+          </button>
+          <button class="btn" ng-disabled="gridOptions.selectedItems.length !== 1" ng-click="resendMessage()"
+                    title="Edit the message to resend it" data-placement="bottom">
+           <i class="icon-share-alt"></i> Resend
+          </button>
+
+          <button class="btn" ng-disabled="!gridOptions.selectedItems.length" ng-click="moveDialog = true"
+                  title="Move the selected messages to another destination" data-placement="bottom">
+            <i class="icon-share-alt"></i> Move
+          </button>
+          <button class="btn" ng-disabled="!gridOptions.selectedItems.length"
+                  ng-click="deleteDialog = true"
+                  title="Delete the selected messages">
+            <i class="icon-remove"></i> Delete
+          </button>
+          <button class="btn" ng-click="refresh()"
+                  title="Refreshes the list of messages">
+            <i class="icon-refresh"></i>
+          </button>
+        </form>
+      </div>
+    </div>
+  </div>
+
+  <div class="row-fluid">
+    <div class="gridStyle" ng-grid="gridOptions"></div>
+  </div>
+
+  <div hawtio-slideout="showMessageDetails" title="{{row.JMSMessageID}}">
+    <div class="dialog-body">
+
+      <div class="row-fluid">
+        <div class="pull-right">
+          <form class="form-horizontal no-bottom-margin">
+
+            <div class="btn-group"
+                 hawtio-pager="messages"
+                 on-index-change="selectRowIndex"
+                 row-index="rowIndex"></div>
+
+            <button class="btn" ng-disabled="!gridOptions.selectedItems.length" ng-click="moveDialog = true"
+                    title="Move the selected messages to another destination" data-placement="bottom">
+              <i class="icon-share-alt"></i> Move
+            </button>
+
+            <button class="btn btn-danger" ng-disabled="!gridOptions.selectedItems.length"
+                    ng-click="deleteDialog = true"
+                    title="Delete the selected messages">
+              <i class="icon-remove"></i> Delete
+            </button>
+
+            <button class="btn" ng-click="showMessageDetails = !showMessageDetails" title="Close this dialog">
+              <i class="icon-remove"></i> Close
+            </button>
+
+          </form>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+        <div class="expandable closed">
+          <div title="Headers" class="title">
+            <i class="expandable-indicator"></i> Headers & Properties
+          </div>
+          <div class="expandable-body well">
+            <table class="table table-condensed table-striped">
+              <thead>
+              <tr>
+                <th>Header</th>
+                <th>Value</th>
+              </tr>
+              </thead>
+              <tbody ng-bind-html-unsafe="row.headerHtml">
+              </tbody>
+              <!--
+                            <tr ng-repeat="(key, value) in row.headers">
+                              <td class="property-name">{{key}}</td>
+                              <td class="property-value">{{value}}</td>
+                            </tr>
+              -->
+            </table>
+          </div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+        <div>Displaying body as <span ng-bind="row.textMode"></span></div>
+        <div hawtio-editor="row.bodyText" read-only="true" mode='mode'></div>
+      </div>
+
+    </div>
+  </div>
+
+  <div hawtio-confirm-dialog="deleteDialog"
+       ok-button-text="Delete"
+       on-ok="deleteMessages()">
+    <div class="dialog-body">
+      <p>You are about to delete
+        <ng-pluralize count="gridOptions.selectedItems.length"
+                      when="{'1': 'a message!', 'other': '{} messages!'}">
+        </ng-pluralize>
+      </p>
+      <p>This operation cannot be undone so please be careful.</p>
+    </div>
+  </div>
+
+  <div hawtio-confirm-dialog="moveDialog"
+       ok-button-text="Move"
+       on-ok="moveMessages()">
+    <div class="dialog-body">
+      <p>Move
+        <ng-pluralize count="gridOptions.selectedItems.length"
+                      when="{'1': 'message', 'other': '{} messages'}"></ng-pluralize>
+        to: <input type="text" ng-model="queueName" placeholder="Queue name"
+                   typeahead="title.unescapeHTML() for title in queueNames($viewValue) | filter:$viewValue" typeahead-editable='true'></p>
+      <p>
+        You cannot undo this operation.<br>
+        Though after the move you can always move the
+        <ng-pluralize count="gridOptions.selectedItems.length"
+                      when="{'1': 'message', 'other': 'messages'}"></ng-pluralize>
+        back again.
+      </p>
+    </div>
+  </div>
+
+</div>
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/createAddress.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/createAddress.html b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/createAddress.html
new file mode 100644
index 0000000..0eb2d0a
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/createAddress.html
@@ -0,0 +1,44 @@
+<!--
+  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.
+  Architecture
+-->
+<form class="form-horizontal" ng-controller="ARTEMIS.AddressController">
+    <div class="control-group">
+        <label class="control-label" for="addressName"
+                title="The routing name of this address">Address name</label>
+        <div class="controls">
+            <input id="addressName" type="text" maxlength="300" ng-model="addressName" placeholder="Address Name"/>
+        </div>
+    </div>
+
+    <div class="control-group">
+        <label class="control-label" for="routingType">Routing type</label>
+
+        <div class="controls">
+            <select id="routingType" ng-model="routingType">
+                <option value='0'>Multicast</option>
+                <option value='1'>Anycast</option>
+                <option value='2'>Both</option>
+            </select>
+        </div>
+    </div>
+
+    <div class="control-group">
+        <div class="controls">
+            <button type="submit" class="btn btn-info" ng-click="createAddress(addressName, routingType)" ng-disabled="!addressName">Create Address</button>
+        </div>
+    </div>
+</form>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/createQueue.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/createQueue.html b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/createQueue.html
new file mode 100644
index 0000000..1d294fa
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/createQueue.html
@@ -0,0 +1,77 @@
+<!--
+  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.
+  Architecture
+-->
+<form class="form-horizontal" ng-controller="ARTEMIS.QueueController">
+
+    <div class="control-group">
+        <label class="control-label" for="queueName"
+               title="The routing name of this address">Queue name</label>
+        <div class="controls">
+            <input id="queueName" type="text" maxlength="300" ng-model="queueName" placeholder="Queue Name"/>
+        </div>
+    </div>
+
+    <div class="control-group">
+        <label class="control-label" for="routingType">Routing type</label>
+
+        <div class="controls">
+            <select id="routingType" ng-model="routingType">
+                <option value='0'>Multicast</option>
+                <option value='1'>Anycast</option>
+            </select>
+        </div>
+    </div>
+
+
+    <div class="control-group">
+        <label class="control-label" for="durable"
+               title="Whether the queue will be durable">Durable</label>
+        <div class="controls">
+            <input id="durable" type="checkbox" ng-model="durable" value="false">
+        </div>
+    </div>
+
+    <div class="control-group">
+        <label class="control-label" for="filter"
+               title="The user name to be used when connecting to the broker">Filter</label>
+        <div class="controls">
+            <input id="filter" type="text" maxlength="300" ng-model="filter" placeholder="Filter"/>
+        </div>
+    </div>
+
+    <div class="control-group">
+        <label class="control-label" for="maxConsumers"
+               title="The maximum consumers the queue can have">Max Consumers</label>
+        <div class="controls">
+            <input id="maxConsumers" type="number" ng-model="maxConsumers" placeholder="maxConsumers"/>
+        </div>
+    </div>
+
+    <div class="control-group">
+        <label class="control-label" for="purgeWhenNoConsumers"
+               title="Whether or not this queue should be purged (emptied and paused) when there are no consumers">Purge when no consumers</label>
+        <div class="controls">
+            <input id="purgeWhenNoConsumers" type="checkbox" ng-model="purgeWhenNoConsumers" value="false"/>
+        </div>
+    </div>
+
+    <div class="control-group">
+        <div class="controls">
+            <button type="submit" class="btn btn-info" ng-click="createQueue(queueName, routingType, durable, filter, maxConsumers, purgeWhenNoConsumers)" ng-disabled="!queueName">Create Queue</button>
+        </div>
+    </div>
+</form>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/deleteAddress.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/deleteAddress.html b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/deleteAddress.html
new file mode 100644
index 0000000..afa3172
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/deleteAddress.html
@@ -0,0 +1,48 @@
+<!--
+  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.
+  Architecture
+-->
+<div ng-controller="ARTEMIS.AddressController">
+  <div class="row-fluid">
+
+    <div class="control-group">
+      <div class="alert">
+        <button type="button" class="close" data-dismiss="alert">×</button>
+        <strong>Warning:</strong> these operations cannot be undone. Please be careful!
+      </div>
+    </div>
+  </div>
+  <div class="row-fluid">
+    <div class="span4">
+      <div class="control-group">
+        <button type="submit" class="btn btn-warning" ng-click="deleteDialog = true">Delete address '{{name().unescapeHTML()}}'</button>
+        <label>This will remove the address completely.</label>
+      </div>
+    </div>
+  </div>
+
+  <div hawtio-confirm-dialog="deleteDialog"
+       ok-button-text="Delete"
+       on-ok="deleteAddress()">
+    <div class="dialog-body">
+      <p>You are about to delete the <b>{{name().unescapeHTML()}}</b> address</p>
+      <p>This operation cannot be undone so please be careful.</p>
+    </div>
+  </div>
+
+
+
+</div>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/deleteQueue.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/deleteQueue.html b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/deleteQueue.html
new file mode 100644
index 0000000..9caa7c3
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/deleteQueue.html
@@ -0,0 +1,62 @@
+<!--
+  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.
+  Architecture
+-->
+<div ng-controller="ARTEMIS.QueueController">
+  <div class="row-fluid">
+
+    <div class="control-group">
+      <div class="alert">
+        <button type="button" class="close" data-dismiss="alert">×</button>
+        <strong>Warning:</strong> these operations cannot be undone. Please be careful!
+      </div>
+    </div>
+  </div>
+  <div class="row-fluid">
+    <div class="span4">
+      <div class="control-group">
+        <button type="submit" class="btn btn-warning" ng-click="deleteDialog = true">Delete queue '{{name().unescapeHTML()}}'</button>
+        <label>This will remove the queue completely.</label>
+      </div>
+    </div>
+    <div class="span4">
+      <div class="control-group">
+        <button type="submit" class="btn btn-warning" ng-click="purgeDialog = true">Purge queue '{{name().unescapeHTML()}}'</button>
+        <label>Purges all the current messages on the queue.</label>
+      </div>
+    </div>
+  </div>
+
+  <div hawtio-confirm-dialog="deleteDialog"
+       ok-button-text="Delete"
+       on-ok="deleteDestination(true)">
+    <div class="dialog-body">
+      <p>You are about to delete the <b>{{name().unescapeHTML()}}</b> queue</p>
+      <p>This operation cannot be undone so please be careful.</p>
+    </div>
+  </div>
+
+  <div hawtio-confirm-dialog="purgeDialog"
+       ok-button-text="Purge"
+       on-ok="purgeDestination()">
+    <div class="dialog-body">
+      <p>You are about to purge the <b>{{name().unescapeHTML()}}</b> queue</p>
+      <p>This operation cannot be undone so please be careful.</p>
+    </div>
+  </div>
+
+
+</div>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/preferences.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/preferences.html b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/preferences.html
new file mode 100644
index 0000000..10fb619
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/preferences.html
@@ -0,0 +1,69 @@
+<!--
+  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.
+  Architecture
+-->
+<div ng-controller="ARTEMIS.PreferencesController">
+  <form class="form-horizontal">
+
+    <div class="control-group">
+      <label class="control-label" for="artemisUserName"
+             title="The user name to be used when connecting to the broker">User name</label>
+
+      <div class="controls">
+        <input id="artemisUserName" type="text" placeholder="username" ng-model="artemisUserName" autofill/>
+      </div>
+    </div>
+    <div class="control-group">
+      <label class="control-label" for="artemisPassword" title="Password to be used when connecting to the broker">Password</label>
+
+      <div class="controls">
+        <input id="artemisPassword" type="password" placeholder="password" ng-model="artemisPassword" autofill/>
+      </div>
+    </div>
+
+    <div class="control-group">
+      <label class="control-label" for="artemisDLQ" title="The DLQ of the Broker">DLQ</label>
+
+      <div class="controls">
+        <input id="artemisDLQ" type="text" placeholder="DLQ" ng-model="artemisDLQ" autofill/>
+      </div>
+    </div>
+
+    <div class="control-group">
+      <label class="control-label" for="artemisExpiryQueue" title="The Expiry Queue of the Broker">Expiry Queue</label>
+
+      <div class="controls">
+        <input id="artemisExpiryQueue" type="text" placeholder="ExpiryQueue" ng-model="artemisExpiryQueue" autofill/>
+      </div>
+    </div>
+
+    <div class="control-group">
+      <label class="control-label" for="byteMessages">Browse byte messages</label>
+
+      <div class="controls">
+        <select id="byteMessages" ng-model="activemqBrowseBytesMessages">
+          <option value='99'>Off</option>
+          <option value='8'>Decimal</option>
+          <option value='4'>Hex</option>
+          <option value='2'>Decimal and text</option>
+          <option value='1'>Hex and text</option>
+        </select>
+        <span class="help-block">Browsing byte messages should display the message body as</span>
+      </div>
+    </div>
+
+  </form>
+</div>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/sendMessage.html
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/sendMessage.html b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/sendMessage.html
new file mode 100644
index 0000000..002b558
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/html/sendMessage.html
@@ -0,0 +1,135 @@
+<!--
+  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.
+  Architecture
+-->
+<div ng-controller="ARTEMIS.SendMessageController">
+
+  <div class="tabbable" ng-model="tab">
+
+    <div value="compose" class="tab-pane" title="Compose">
+      <!--
+         title="Compose a new message to send"
+      -->
+
+      <div class="row-fluid">
+        <span ng-show="noCredentials" class="alert">
+          No credentials set for endpoint!  Please set your username and password in the <a
+            href="" ng-click="openPrefs()">Preferences</a> page
+        </span>
+
+        <form class="form-inline pull-right">
+          <div class="row-fluid">
+            <div class="controls">
+              <label class="control-label" for="durable" title="Is this message durable">Durable: </label>
+              <input id="durable" type="checkbox" ng-model="durable" value="true">
+            </div>
+          <button class="btn" ng-click="addHeader()" title="Add a new message header"><i
+              class="icon-plus"></i> Header
+          </button>
+          <button type="submit" class="btn btn-primary" ng-click="sendMessage(durable)">Send message</button>
+        </form>
+      </div>
+
+      <form class="form-inline bottom-margin" ng-submit="addHeader()">
+        <ol class="zebra-list header-list">
+          <div class="row-fluid">
+            <li ng-repeat="header in headers">
+              <div class="span4">
+                <input type="text" style="width: 100%" class="headerName"
+                       ng-model="header.name"
+                       typeahead="completion for completion in defaultHeaderNames() | filter:$viewValue"
+                       typeahead-editable='true'
+                       placeholder="Header name">
+              </div>
+              <div class="span6">
+                <input type="text" style="width: 100%" ng-model="header.value"
+                       placeholder="Value of the message header">
+              </div>
+              <div class="span2">
+                <button type="submit" class="btn" title="Add a new message header">
+                  <i class="icon-plus"></i>
+                </button>
+                <button type="button" ng-click="removeHeader(header)" class="btn" title="Removes this message header">
+                  <i class="icon-remove"></i>
+                </button>
+              </div>
+            </li>
+          </div>
+        </ol>
+      </form>
+
+      <div class="row-fluid">
+        <form class="form-inline">
+          <div class="controls">
+            <label class="control-label" for="sourceFormat" title="The text format to use for the message payload">Payload
+              format: </label>
+            <select ng-model="codeMirrorOptions.mode.name" id="sourceFormat">
+              <option value="javascript">JSON</option>
+              <option value="text" selected>Plain text</option>
+              <option value="properties">Properties</option>
+              <option value="xml">XML</option>
+            </select>
+
+            <button class="btn" ng-click="autoFormat()"
+                    title="Automatically pretty prints the message so its easier to read">Auto format
+            </button>
+          </div>
+        </form>
+      </div>
+
+      <div class="row-fluid">
+        <textarea ui-codemirror="codeMirrorOptions" ng-model="message"></textarea>
+      </div>
+    </div>
+    </tab>
+
+    <div ng-switch="showChoose">
+      <div ng-switch-when="true">
+        <div value="choose" class="tab-pane" title="Choose">
+          <!--
+                   title="Choose messages to send from the available files in the Profile configuration for this container">
+          -->
+          <div class="row-fluid bottom-margin">
+        <span ng-show="noCredentials" class="alert">
+          No credentials set for endpoint!  Please set your username and password in the <a
+            href="#/preferences">Preferences</a> page
+        </span>
+            <button type="submit" ng-disabled="!fileSelection().length" class="btn btn-primary pull-right"
+                    ng-click="sendSelectedFiles()">
+              <ng-pluralize count="fileSelection().length"
+                            when="{'0': 'No files selected', '1': 'Send the file','other': 'Send {} files'}">
+              </ng-pluralize>
+            </button>
+          </div>
+
+          <p>Choose which files to send from the profile configuration:</p>
+
+          <div class="control-group inline-block">
+            <input class="search-query" type="text" ng-model="searchText" placeholder="Filter..." autofocus>
+          </div>
+
+          <ul>
+            <li ng-repeat="fileName in profileFileNames | filter:searchText">
+              <input type="checkbox" ng-model="selectedFiles[fileName]"> {{fileName}}
+            </li>
+          </ul>
+        </div>
+      </div>
+
+    </div>
+
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/address.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/address.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/address.js
new file mode 100644
index 0000000..cc0aef1
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/address.js
@@ -0,0 +1,119 @@
+/*
+ * 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 ARTEMIS
+ */
+var ARTEMIS = (function(ARTEMIS) {
+
+    /**
+     * @method AddressController
+     * @param $scope
+     * @param ARTEMISService
+     *
+     * Controller for the Create interface
+     */
+    ARTEMIS.AddressController = function ($scope, workspace, ARTEMISService, jolokia, localStorage) {
+        Core.initPreferenceScope($scope, localStorage, {
+            'routingType': {
+                'value': 0,
+                'converter': parseInt,
+                'formatter': parseInt
+            }
+        });
+        var artemisJmxDomain = localStorage['artemisJmxDomain'] || "org.apache.activemq.artemis";
+        $scope.workspace = workspace;
+        $scope.message = "";
+        $scope.deleteDialog = false;
+        $scope.$watch('workspace.selection', function () {
+            workspace.moveIfViewInvalid();
+        });
+        function operationSuccess() {
+            $scope.addressName = "";
+            $scope.workspace.operationCounter += 1;
+            Core.$apply($scope);
+            Core.notification("success", $scope.message);
+            $scope.workspace.loadTree();
+        }
+        function deleteSuccess() {
+            // lets set the selection to the parent
+            workspace.removeAndSelectParentNode();
+            $scope.workspace.operationCounter += 1;
+            Core.$apply($scope);
+            Core.notification("success", $scope.message);
+            $scope.workspace.loadTree();
+        }
+        $scope.createAddress = function (name, routingType) {
+            var mbean = getBrokerMBean(jolokia);
+            if (mbean) {
+                if (routingType == 0) {
+                    $scope.message = "Created  Multicast Address " + name;
+                    ARTEMIS.log.info($scope.message);
+                    ARTEMISService.artemisConsole.createAddress(mbean, jolokia, name, "MULTICAST", onSuccess(operationSuccess));
+                }
+                else if (routingType == 1) {
+                    $scope.message = "Created Anycast Address " + name;
+                    ARTEMIS.log.info($scope.message);
+                    ARTEMISService.artemisConsole.createAddress(mbean, jolokia, name, "ANYCAST", onSuccess(operationSuccess));
+                }
+                else {
+                    $scope.message = "Created Anycast/Multicast Address " + name;
+                    ARTEMIS.log.info($scope.message);
+                    ARTEMISService.artemisConsole.createAddress(mbean, jolokia, name, "ANYCAST,MULTICAST", onSuccess(operationSuccess));
+                }
+            }
+        };
+        $scope.deleteAddress = function () {
+            var selection = workspace.selection;
+            var entries = selection.entries;
+            var mbean = getBrokerMBean(jolokia);
+            ARTEMIS.log.info(mbean);
+            if (mbean) {
+                if (selection && jolokia && entries) {
+                    var domain = selection.domain;
+                    var name = entries["name"];
+                    name = name.unescapeHTML();
+                    if (name.charAt(0) === '"' && name.charAt(name.length -1) === '"')
+                    {
+                        name = name.substr(1,name.length -2);
+                    }
+                    ARTEMIS.log.info(name);
+                    var operation;
+                    $scope.message = "Deleted address " + name;
+                    ARTEMISService.artemisConsole.deleteAddress(mbean, jolokia, name, onSuccess(deleteSuccess));
+                }
+            }
+        };
+        $scope.name = function () {
+            var selection = workspace.selection;
+            if (selection) {
+                return selection.title;
+            }
+            return null;
+        };
+
+        function getBrokerMBean(jolokia) {
+            var mbean = null;
+            var selection = workspace.selection;
+            var folderNames = selection.folderNames;
+            mbean = "" + folderNames[0] + ":broker=" + folderNames[1];
+            ARTEMIS.log.info("broker=" + mbean);
+            return mbean;
+        }
+    };
+
+    return ARTEMIS;
+} (ARTEMIS || {}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisHelpers.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisHelpers.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisHelpers.js
new file mode 100644
index 0000000..210c52a
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisHelpers.js
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var ARTEMIS;
+(function (ARTEMIS) {
+    ARTEMIS.log = Logger.get("ARTEMIS");
+    ARTEMIS.jmxDomain = 'org.apache.ARTEMIS';
+    function getSelectionQueuesFolder(workspace) {
+        function findQueuesFolder(node) {
+            if (node) {
+                if (node.title === "Queues" || node.title === "Queue") {
+                    return node;
+                }
+                var parent = node.parent;
+                if (parent) {
+                    return findQueuesFolder(parent);
+                }
+            }
+            return null;
+        }
+        var selection = workspace.selection;
+        if (selection) {
+            return findQueuesFolder(selection);
+        }
+        return null;
+    }
+    ARTEMIS.getSelectionQueuesFolder = getSelectionQueuesFolder;
+    function getSelectionTopicsFolder(workspace) {
+        function findTopicsFolder(node) {
+            var answer = null;
+            if (node) {
+                if (node.title === "Topics" || node.title === "Topic") {
+                    answer = node;
+                }
+                if (answer === null) {
+                    angular.forEach(node.children, function (child) {
+                        if (child.title === "Topics" || child.title === "Topic") {
+                            answer = child;
+                        }
+                    });
+                }
+            }
+            return answer;
+        }
+        var selection = workspace.selection;
+        if (selection) {
+            return findTopicsFolder(selection);
+        }
+        return null;
+    }
+    ARTEMIS.getSelectionTopicsFolder = getSelectionTopicsFolder;
+    /**
+     * Sets $scope.row to currently selected JMS message.
+     * Used in:
+     *  - ARTEMIS/js/browse.ts
+     *  - camel/js/browseEndpoint.ts
+     *
+     * TODO: remove $scope argument and operate directly on other variables. but it's too much side effects here...
+     *
+     * @param message
+     * @param key unique key inside message that distinguishes between values
+     * @param $scope
+     */
+    function selectCurrentMessage(message, key, $scope) {
+        // clicking on message's link would interfere with messages selected with checkboxes
+        $scope.gridOptions.selectAll(false);
+        var idx = Core.pathGet(message, ["rowIndex"]);
+        var jmsMessageID = Core.pathGet(message, ["entity", key]);
+        $scope.rowIndex = idx;
+        var selected = $scope.gridOptions.selectedItems;
+        selected.splice(0, selected.length);
+        if (idx >= 0 && idx < $scope.messages.length) {
+            $scope.row = $scope.messages.find(function (msg) { return msg[key] === jmsMessageID; });
+            if ($scope.row) {
+                selected.push($scope.row);
+            }
+        }
+        else {
+            $scope.row = null;
+        }
+    }
+    ARTEMIS.selectCurrentMessage = selectCurrentMessage;
+    /**
+     * - Adds functions needed for message browsing with details
+     * - Adds a watch to deselect all rows after closing the slideout with message details
+     * TODO: export these functions too?
+     *
+     * @param $scope
+     */
+    function decorate($scope) {
+        $scope.selectRowIndex = function (idx) {
+            $scope.rowIndex = idx;
+            var selected = $scope.gridOptions.selectedItems;
+            selected.splice(0, selected.length);
+            if (idx >= 0 && idx < $scope.messages.length) {
+                $scope.row = $scope.messages[idx];
+                if ($scope.row) {
+                    selected.push($scope.row);
+                }
+            }
+            else {
+                $scope.row = null;
+            }
+        };
+        $scope.$watch("showMessageDetails", function () {
+            if (!$scope.showMessageDetails) {
+                $scope.row = null;
+                $scope.gridOptions.selectedItems.splice(0, $scope.gridOptions.selectedItems.length);
+            }
+        });
+    }
+    ARTEMIS.decorate = decorate;
+})(ARTEMIS || (ARTEMIS = {}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisPlugin.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisPlugin.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisPlugin.js
new file mode 100644
index 0000000..6f79169
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisPlugin.js
@@ -0,0 +1,246 @@
+/*
+ * 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 ARTEMIS
+ * @main ARTEMIS
+ *
+ * The main entrypoint for the ARTEMIS module
+ *
+ */
+var ARTEMIS = (function(ARTEMIS) {
+
+   /**
+    * @property pluginName
+    * @type {string}
+    *
+    * The name of this plugin
+    */
+   ARTEMIS.pluginName = "ARTEMIS";
+
+   /**
+    * @property log
+    * @type {Logging.Logger}
+    *
+    * This plugin's logger instance
+    */
+   ARTEMIS.log = Logger.get(ARTEMIS.pluginName);
+
+   /**
+    * @property templatePath
+    * @type {string}
+    *
+    * The top level path to this plugin's partials
+    */
+   ARTEMIS.templatePath = "../artemis-plugin/plugin/html/";
+
+   /**
+    * @property jmxDomain
+    * @type {string}
+    *
+    * The JMX domain this plugin mostly works with
+    */
+   ARTEMIS.jmxDomain = "hawtio"
+
+   /**
+    * @property mbeanType
+    * @type {string}
+    *
+    * The mbean type this plugin will work with
+    */
+   ARTEMIS.mbeanType = "ARTEMISHandler";
+
+   /**
+    * @property mbean
+    * @type {string}
+    *
+    * The mbean's full object name
+    */
+   ARTEMIS.mbean = ARTEMIS.jmxDomain + ":type=" + ARTEMIS.mbeanType;
+
+   /**
+    * @property SETTINGS_KEY
+    * @type {string}
+    *
+    * The key used to fetch our settings from local storage
+    */
+   ARTEMIS.SETTINGS_KEY = 'ARTEMISSettings';
+
+   /**
+    * @property module
+    * @type {object}
+    *
+    * This plugin's angularjs module instance
+    */
+   ARTEMIS.module = angular.module(ARTEMIS.pluginName, ['bootstrap', 'ngResource', 'ui.bootstrap.dialog', 'hawtioCore', 'camel', 'hawtio-ui']);
+
+   // set up the routing for this plugin, these are referenced by the subleveltabs added below
+   ARTEMIS.module.config(function($routeProvider) {
+      $routeProvider
+         .when('/artemis/createAddress', {
+            templateUrl: ARTEMIS.templatePath + 'createAddress.html'
+         })
+         .when('/artemis/deleteAddress', {
+            templateUrl: ARTEMIS.templatePath + 'deleteAddress.html'
+         })
+         .when('/artemis/deleteQueue', {
+            templateUrl: ARTEMIS.templatePath + 'deleteQueue.html'
+         })
+         .when('/artemis/createQueue', {
+            templateUrl: ARTEMIS.templatePath + 'createQueue.html'
+         })
+         .when('/artemis/browseQueue', {
+            templateUrl: ARTEMIS.templatePath + 'browseQueue.html'
+         })
+         .when('/artemis/diagram', {
+            templateUrl: ARTEMIS.templatePath + 'brokerDiagram.html'
+         })
+         .when('/artemis/sendMessage', {
+            templateUrl: ARTEMIS.templatePath + 'sendMessage.html'
+         });
+   });
+
+   ARTEMIS.module.factory('artemisMessage', function () {
+        return { 'message': null };
+    });
+
+   // one-time initialization happens in the run function
+   // of our module
+   ARTEMIS.module.run(function(workspace, viewRegistry, helpRegistry, preferencesRegistry, localStorage, jolokia, ARTEMISService, $rootScope) {
+      // let folks know we're actually running
+      ARTEMIS.log.info("plugin running " + jolokia);
+
+      var artemisJmxDomain = localStorage['artemisJmxDomain'] || "org.apache.activemq.artemis";
+
+      ARTEMISService.initArtemis();
+
+      // tell hawtio that we have our own custom layout for
+      // our view
+      viewRegistry["artemis"] = ARTEMIS.templatePath + "artemisLayout.html";
+
+      helpRegistry.addUserDoc("artemis", "../artemis-plugin/plugin/doc/help.md", function () {
+         return workspace.treeContainsDomainAndProperties(artemisJmxDomain);
+     });
+
+      preferencesRegistry.addTab("Artemis", ARTEMIS.templatePath + "preferences.html", function () {
+         return workspace.treeContainsDomainAndProperties(artemisJmxDomain);
+      });
+
+      // Add a top level tab to hawtio's navigation bar
+      workspace.topLevelTabs.push({
+         id: "artemis",
+         content: "Artemis",
+         title: "Artemis Broker",
+         isValid: function (workspace) {
+            return workspace.treeContainsDomainAndProperties(artemisJmxDomain);
+         },
+         href: function () {
+            return "#/jmx/attributes?tab=artemis";
+         },
+         isActive: function () {
+            return workspace.isLinkActive("artemis");
+         }
+      });
+
+      workspace.subLevelTabs.push({
+         content: '<i class="icon-plus"></i> Create',
+         title: "Create a new address",
+         isValid: function (workspace) {
+            return isBroker(workspace, artemisJmxDomain) || isAddressFolder(workspace, artemisJmxDomain);
+         },
+         href: function () {
+            return "#/artemis/createAddress";
+         }
+      });
+
+      workspace.subLevelTabs.push({
+         content: '<i class="icon-plus"></i> Delete',
+         title: "Delete an address",
+         isValid: function (workspace) {
+            return isAddress(workspace, artemisJmxDomain);
+         },
+         href: function () {
+            return "#/artemis/deleteAddress";
+         }
+      });
+
+      workspace.subLevelTabs.push({
+         content: '<i class="icon-plus"></i> Create',
+         title: "Create a new queue",
+         isValid: function (workspace) {
+            return isAddress(workspace, artemisJmxDomain)
+         },
+         href: function () {
+            return "#/artemis/createQueue"
+         }
+      });
+
+      workspace.subLevelTabs.push({
+         content: '<i class="icon-remove"></i> Delete',
+         title: "Delete or purge this queue",
+         isValid: function (workspace) {
+            return isQueue(workspace, artemisJmxDomain)
+         },
+         href: function () {
+            return "#/artemis/deleteQueue"
+         }
+      });
+
+      workspace.subLevelTabs.push({
+          content: '<i class="icon-envelope"></i> Browse',
+          title: "Browse the messages on the queue",
+          isValid: function (workspace) { return isQueue(workspace, artemisJmxDomain); },
+          href: function () { return "#/artemis/browseQueue"; }
+      });
+
+      workspace.subLevelTabs.push({
+      content: '<i class="icon-pencil"></i> Send',
+      title: "Send a message to this address",
+      isValid: function (workspace) { return isAddress(workspace, artemisJmxDomain) || isQueue(workspace, artemisJmxDomain); },
+      href: function () { return "#/artemis/sendMessage"; }
+      });
+
+      workspace.subLevelTabs.push({
+          content: '<i class="icon-picture"></i> Diagram',
+          title: "View a diagram of the producers, destinations and consumers",
+          isValid: function (workspace) { return workspace.isTopTabActive("artemis") || workspace.selectionHasDomain(artemisJmxDomain); },
+          href: function () { return "#/artemis/diagram"; }
+      });
+});
+
+
+   function isBroker(workspace, domain) {
+      return workspace.hasDomainAndProperties(domain, {'broker': 'Broker'}, 3);
+   }
+
+   function isAddressFolder(workspace, domain) {
+      return workspace.selectionHasDomainAndLastFolderName(domain, 'addresses');
+   }
+                                                                                          
+   function isAddress(workspace, domain) {
+      return workspace.hasDomainAndProperties(domain, {'component': 'addresses'}) && !workspace.hasDomainAndProperties(domain, {'subcomponent': 'queues'});
+   }
+
+   function isQueue(workspace, domain) {
+      return workspace.hasDomainAndProperties(domain, {'subcomponent': 'queues'});
+   }
+
+   return ARTEMIS;
+}(ARTEMIS || {}));
+
+// Very important!  Add our module to hawtioPluginLoader so it
+// bootstraps our module
+hawtioPluginLoader.addModule(ARTEMIS.pluginName);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fa7b247d/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisService.js
----------------------------------------------------------------------
diff --git a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisService.js b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisService.js
new file mode 100644
index 0000000..3d7aa55
--- /dev/null
+++ b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/artemisService.js
@@ -0,0 +1,44 @@
+/*
+ * 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 ARTEMIS
+ */
+var ARTEMIS = (function(ARTEMIS) {
+
+  ARTEMIS.SERVER = 'Server Messages';
+
+
+  // The ARTEMIS service handles the connection to
+  // the Artemis Jolokia server in the background
+  ARTEMIS.module.factory("ARTEMISService", function(jolokia, $rootScope) {
+    var self = {
+      artemisConsole: undefined,
+
+      getVersion: function(jolokia) {
+        ARTEMIS.log.info("Connecting to ARTEMIS service: " + self.artemisConsole.getServerAttributes(jolokia));
+      } ,
+      initArtemis: function(broker) {
+        ARTEMIS.log.info("*************creating Artemis Console************");
+        self.artemisConsole = new ArtemisConsole();
+      }
+    };
+
+    return self;
+  });
+
+  return ARTEMIS;
+}(ARTEMIS || {}));


[6/6] activemq-artemis git commit: This closes #1385

Posted by cl...@apache.org.
This closes #1385


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

Branch: refs/heads/master
Commit: bc2670a543ce1911fecc3e6812896bc4e7871392
Parents: 2b64ce4 12942a6
Author: Clebert Suconic <cl...@apache.org>
Authored: Tue Aug 1 16:17:56 2017 -0400
Committer: Clebert Suconic <cl...@apache.org>
Committed: Tue Aug 1 16:17:56 2017 -0400

----------------------------------------------------------------------
 .gitignore                                      |    3 +
 .../artemis/cli/commands/etc/artemis.profile    |    2 +-
 .../cli/commands/etc/artemis.profile.cmd        |    2 +-
 .../cli/commands/etc/bootstrap-web-settings.txt |    3 +
 artemis-distribution/pom.xml                    |   23 +-
 artemis-distribution/src/main/assembly/dep.xml  |   27 +
 .../src/main/resources/licenses/bin/LICENSE     |  190 ++
 artemis-hawtio/activemq-branding/pom.xml        |  260 ++
 .../hawtio/branding/PluginContextListener.java  |   71 +
 .../src/main/resources/WEB-INF/web.xml          |   57 +
 .../src/main/webapp/index.html                  |   27 +
 .../src/main/webapp/plugin/css/activemq.css     | 2453 ++++++++++++++++++
 .../src/main/webapp/plugin/css/branding.css     |   43 +
 .../src/main/webapp/plugin/doc/welcome.md       |   16 +
 .../src/main/webapp/plugin/img/activemq.png     |  Bin 0 -> 21601 bytes
 .../plugin/img/checkbox-background-checked.png  |  Bin 0 -> 355 bytes
 .../plugin/img/checkbox-background-hover.png    |  Bin 0 -> 244 bytes
 .../webapp/plugin/img/checkbox-background.png   |  Bin 0 -> 228 bytes
 .../src/main/webapp/plugin/img/favicon.png      |  Bin 0 -> 25918 bytes
 .../main/webapp/plugin/img/input-background.png |  Bin 0 -> 149 bytes
 .../plugin/img/login-screen-background.png      |  Bin 0 -> 5658 bytes
 .../webapp/plugin/img/login-screen-logo.png     |  Bin 0 -> 28774 bytes
 .../src/main/webapp/plugin/js/plugin.js         |   66 +
 artemis-hawtio/artemis-console/pom.xml          |  196 ++
 .../src/main/webapp/app/core/doc/about.md       |   53 +
 .../src/main/webapp/app/core/html/help.html     |   38 +
 .../src/main/webapp/app/jvm/html/connect.html   |  104 +
 artemis-hawtio/artemis-plugin/README.md         |    3 +
 artemis-hawtio/artemis-plugin/pom.xml           |  263 ++
 .../hawtio/plugin/PluginContextListener.java    |   71 +
 .../src/main/resources/WEB-INF/web.xml          |   57 +
 .../src/main/resources/log4j.properties         |   23 +
 .../src/main/webapp/plugin/doc/help.md          |   19 +
 .../main/webapp/plugin/html/artemisLayout.html  |   42 +
 .../main/webapp/plugin/html/brokerDiagram.html  |  313 +++
 .../main/webapp/plugin/html/browseQueue.html    |  156 ++
 .../main/webapp/plugin/html/createAddress.html  |   44 +
 .../main/webapp/plugin/html/createQueue.html    |   77 +
 .../main/webapp/plugin/html/deleteAddress.html  |   48 +
 .../main/webapp/plugin/html/deleteQueue.html    |   62 +
 .../main/webapp/plugin/html/preferences.html    |   69 +
 .../main/webapp/plugin/html/sendMessage.html    |  135 +
 .../src/main/webapp/plugin/js/address.js        |  119 +
 .../src/main/webapp/plugin/js/artemisHelpers.js |  126 +
 .../src/main/webapp/plugin/js/artemisPlugin.js  |  246 ++
 .../src/main/webapp/plugin/js/artemisService.js |   44 +
 .../src/main/webapp/plugin/js/brokerDiagram.js  |  665 +++++
 .../src/main/webapp/plugin/js/browse.js         |  499 ++++
 .../main/webapp/plugin/js/jmsHeaderSchema.js    |   62 +
 .../src/main/webapp/plugin/js/preferences.js    |   54 +
 .../src/main/webapp/plugin/js/queue.js          |  152 ++
 .../src/main/webapp/plugin/js/send.js           |  211 ++
 .../src/main/webapp/plugin/js/tree.js           |   76 +
 .../main/webapp/plugin/lib/artemis-console.js   |   82 +
 artemis-hawtio/pom.xml                          |  105 +
 .../activemq/artemis/ActiveMQWebLogger.java     |    4 +
 .../artemis/component/WebServerComponent.java   |    7 +
 artemis-website/pom.xml                         |    2 +
 artemis-website/src/main/resources/index.html   |    1 +
 pom.xml                                         |    4 +
 60 files changed, 7472 insertions(+), 3 deletions(-)
----------------------------------------------------------------------