Commit 5500a900 authored by Dele Olajide's avatar Dele Olajide

jmxweb plugin version 0.0.1

parent ea81dc86
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>JmxWeb Changelog</title>
<style type="text/css">
BODY {
font-size : 100%;
}
BODY, TD, TH {
font-family : tahoma, verdana, arial, helvetica, sans-serif;
font-size : 0.8em;
}
H2 {
font-size : 10pt;
font-weight : bold;
padding-left : 1em;
}
A:hover {
text-decoration : none;
}
H1 {
font-family : tahoma, arial, helvetica, sans-serif;
font-size : 1.4em;
font-weight: bold;
border-bottom : 1px #ccc solid;
padding-bottom : 2px;
}
TT {
font-family : courier new;
font-weight : bold;
color : #060;
}
PRE {
font-family : courier new;
font-size : 100%;
}
</style>
</head>
<body>
<h1>
</h1>
<p><b>0.0.0.1 -- January 9th 2015</p>
<ul>
<li>Initial Version</li>
</ul
</body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<class>com.ifsoft.jmxweb.plugin.JmxWebPlugin</class>
<name>JmxWeb Plugin</name>
<description>JmxWeb plugin is web based platform for managing and monitoring openfire via JMX.</description>
<version>0.0.1</version>
<licenseType>Apache 2.0</licenseType>
<date>01/09/2015</date>
<minServerVersion>3.9.9</minServerVersion>
<author>igniterealtime.org</author>
</plugin>
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>JmxWeb Plugin Readme</title>
<style type="text/css">
BODY {
font-size: 100%;
}
BODY, TD, TH {
font-family: tahoma, verdana, arial, helvetica, sans-serif;
font-size: 0.8em;
}
H2 {
font-size: 10pt;
font-weight: bold;
}
A:hover {
text-decoration: none;
}
H1 {
font-family: tahoma, arial, helvetica, sans-serif;
font-size: 1.4em;
font-weight: bold;
border-bottom: 1px #ccc solid;
padding-bottom: 2px;
}
TT {
font-family: courier new;
font-weight: bold;
color: #060;
}
PRE {
font-family: courier new;
font-size: 100%;
}
.events TH {
font-size: 8pt;
font-family: verdana;
font-weight: bold;
text-align: left;
background-color: #eee;
border-bottom: 1px #ccc solid;
}
.events .event {
font-weight: bold;
}
.events .description {
font-size: 8pt;
font-family: verdana;
}
.events TD {
border-bottom: 1px #ccc dotted;
vertical-align: top;
}
</style>
</head>
<body>
<h1>
JmxWeb Plugin Readme
</h1>
<p>
JmxWeb plugin is web based platform for managing and monitoring openfire via JMX. It includes hawtio, a lightweight and modular HTML5 web console with lots of plugins and jolokia a JMX-HTTP bridge providing a web based alternative to JSR-160 connectors.
It also includes the mbeans from the java-monitor probe for openfire.
</p>
<h2>Prerequesites</h2>
<p>
</p>
<h2>Installation</h2>
<ol>
<li>Stop Openfire.</li>
<li>Copy the jmxweb.jar file to the OPENFIRE_HOME/plugins directory.</li>
<li>Restart Openfire.</li>
</ol>
<h2>Configuration</h2>
<p>If you want to monitor openfire JMX mbeans, enable JMX by adding the following to System Properties via the Web Admin Console or add into the table ofproperty.</p>
<ul>
<li>xmpp.jmx.enabled (true or false)</li>
<li>xmpp.jmx.secure (true or false)</li>
</ul>
<p><img src="http://community.igniterealtime.org/servlet/JiveServlet/downloadImage/38-1735-33840/Image2.jpg" style="width: 620px; height: 349px;" __jive_id="33840" /></p>
<h2>How to use</h2>
<p><span>To access hawtio, point your browser at </span><a href="http://your-server:7070/hawtio" rel="nofollow" target="_blank">http://your-server:7070/hawtio</a></p>
<p><span>To access jolokia rest api from your javascript applications use URL </span><a href="http://your-server:7070/jolokia" rel="nofollow" target="_blank">http://your-server:7070/jolokia</a><span>. Make sure you provide headers for basic authentication.</span></p>
<p></p>
<p><img src="http://community.igniterealtime.org/servlet/JiveServlet/downloadImage/38-1735-33841/Image3.jpg" style="width: 620px; height: 391px;" __jive_id="33841" /></p>
</body>
</html>
Manifest-Version: 1.0
Bnd-LastModified: 1416851303898
Build-Jdk: 1.7.0_55
Build-Timestamp: Mon, 24 Nov 2014 17:38:55 +0000
Built-By: jenkins
Bundle-ClassPath: .,WEB-INF/lib/jolokia-core-1.2.3.jar,WEB-INF/lib/json-
simple-1.1.1.jar,WEB-INF/lib/hawtio-core-1.4.37.jar,WEB-INF/lib/hawtio-
util-1.4.37.jar,WEB-INF/lib/slf4j-api-1.6.6.jar,WEB-INF/lib/hawtio-syst
em-1.4.37.jar,WEB-INF/lib/httpclient-4.3.4.jar,WEB-INF/lib/httpcore-4.3
.2.jar,WEB-INF/lib/commons-httpclient-3.1.jar,WEB-INF/lib/commons-io-2.
2.jar,WEB-INF/lib/commons-fileupload-1.3.1.jar,WEB-INF/lib/commons-code
c-1.6.jar,WEB-INF/lib/hawtio-git-1.4.37.jar,WEB-INF/lib/commons-logging
-1.0.3.jar
Bundle-Description: hawtio :: hawtio-web
Bundle-DocURL: http://www.jboss.org
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion: 2
Bundle-Name: hawtio :: hawtio-web
Bundle-SymbolicName: io.hawt.hawtio-web
Bundle-Vendor: JBoss by Red Hat
Bundle-Version: 1.4.37
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: *;scope=compile|runtime;artifactId=!org.osgi.enterpris
e|org.osgi.core
Embed-Directory: WEB-INF/lib
Embed-Transitive: true
Embedded-Artifacts: WEB-INF/lib/jolokia-core-1.2.3.jar;g="org.jolokia";a
="jolokia-core";v="1.2.3",WEB-INF/lib/json-simple-1.1.1.jar;g="com.goog
lecode.json-simple";a="json-simple";v="1.1.1",WEB-INF/lib/hawtio-core-1
.4.37.jar;g="io.hawt";a="hawtio-core";v="1.4.37",WEB-INF/lib/hawtio-uti
l-1.4.37.jar;g="io.hawt";a="hawtio-util";v="1.4.37",WEB-INF/lib/slf4j-a
pi-1.6.6.jar;g="org.slf4j";a="slf4j-api";v="1.6.6",WEB-INF/lib/hawtio-s
ystem-1.4.37.jar;g="io.hawt";a="hawtio-system";v="1.4.37",WEB-INF/lib/h
ttpclient-4.3.4.jar;g="org.apache.httpcomponents";a="httpclient";v="4.3
.4",WEB-INF/lib/httpcore-4.3.2.jar;g="org.apache.httpcomponents";a="htt
pcore";v="4.3.2",WEB-INF/lib/commons-httpclient-3.1.jar;g="commons-http
client";a="commons-httpclient";v="3.1",WEB-INF/lib/commons-io-2.2.jar;g
="commons-io";a="commons-io";v="2.2",WEB-INF/lib/commons-fileupload-1.3
.1.jar;g="commons-fileupload";a="commons-fileupload";v="1.3.1",WEB-INF/
lib/commons-codec-1.6.jar;g="commons-codec";a="commons-codec";v="1.6",W
EB-INF/lib/hawtio-git-1.4.37.jar;g="io.hawt";a="hawtio-git";v="1.4.37",
WEB-INF/lib/commons-logging-1.0.3.jar;g="commons-logging";a="commons-lo
gging";v="1.0.3"
Ignore-Package: org.slf4j.impl,keypairgen,org.apache.log,org.apache.log4
j,javax.portlet,userauth,signature
Implementation-Title: hawtio-web
Implementation-URL: http://hawt.io/hawtio-web/
Implementation-Vendor: JBoss by Red Hat
Implementation-Vendor-Id: io.hawt
Implementation-Version: 1.4.37
Import-Package: io.hawt.git;resolution:=optional;version="[1.4,2)",io.ha
wt.util;resolution:=optional;version="[1.4,2)",io.hawt.util.introspect;
resolution:=optional;version="[1.4,2)",io.hawt.util.introspect.support;
resolution:=optional;version="[1.4,2)",javax.crypto,javax.crypto.interf
aces,javax.crypto.spec,javax.management,javax.management.openmbean,java
x.management.relation,javax.naming,javax.net,javax.net.ssl,javax.securi
ty.auth,javax.security.auth.callback,javax.security.auth.login,javax.se
curity.auth.spi,javax.security.auth.x500,javax.servlet,javax.servlet.ht
tp,javax.xml.datatype,javax.xml.parsers,org.apache.commons.logging;reso
lution:=optional,org.eclipse.jetty.plus.jaas.callback;resolution:=optio
nal,org.eclipse.jetty.plus.jaas.spi;resolution:=optional,org.ietf.jgss,
org.osgi.framework;version="[1.6,2)",org.osgi.util.tracker;version="[1.
4,2)",org.slf4j;resolution:=optional;version="[1.6,2)",org.w3c.dom,org.
xml.sax,org.xml.sax.helpers
Java-Vendor: Oracle Corporation
Java-Version: 1.7.0_55
Os-Arch: amd64
Os-Name: Linux
Os-Version: 2.6.32-504.1.3.el6.x86_64
Scm-Connection: scm:git:git@github.com:hawtio/hawtio.git/hawtio-web
Scm-Revision: df46f1714d4bee6d8ee0023410019a866c08eaa4
Scm-Url: git@github.com:hawtio/hawtio.git/hawtio-web
Specification-Title: hawtio-web
Specification-Vendor: JBoss by Red Hat
Specification-Version: 1.4.37
Tool: Bnd-1.50.0
Web-ContextPath: /hawtio
Webapp-Context: /hawtio
# the properties file used to override blueprint configuration properties:
#�http://aries.apache.org/modules/blueprintweb.html
#
# for hawtio configuration options see:
# https://github.com/hawtio/hawtio/blob/master/docs/Configuration.md
# lets avoid cloning or pulling the remote git repo for configuration
# on startup
hawtio.config.pullOnStartup = false
hawtio.config.cloneOnStartup = false
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2009-2011 Roland Huss
~
~ Licensed 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.
-->
<restrict>
<!-- List of remote hosts which are allowed to access this agent. The name can be
given as IP or FQDN. If any of the given hosts matches, access will be allowed
(respecting further restrictions, though). If <remote> ... </remote> is given
without any host no access is allowed at all (probably not what you want).
You can also specify a subnetmask behind a numeric IP adress in which case any
host within the specified subnet is allowed to access the agent. The netmask can
be given either in CIDR format (e.g "/16") or as a full netmask (e.g. "/255.255.0.0")
-->
<!--
<remote>
<host>127.0.0.1</host>
<host>localhost</host>
<host>10.0.0.0/16</host>
</remote>
-->
<!--
Access restriction based on the HTTP method with which an Jolokia request was received.
The following example allows only HTTP POST requests. If the section is missing, all
HTTP requests methods are allowed.
-->
<!--
<http>
<method>post</method>
</http>
-->
<!--
List of allowed commands.
If this sections is present, it influence the following section.
For each command type present, the principle behaviour is allow this command for all
MBeans. To remove an MBean (attribute/operation), a <deny> section has to be added.
For each command type missing, the command is disabled by default. For certain MBeans
it can be selectively by enabled by using an <allow> section below
Known types are:
* read
* write
* exec
* list
* version
* search
A missing <commands> section implies that every operation type is allowed (and can
be selectively controlled by a <deny> section)
-->
<commands>
<command>read</command>
<command>write</command>
<command>exec</command>
<command>list</command>
<command>version</command>
<command>search</command>
</commands>
<!-- For each command type missing in a given <commands> section, for certain MBeans (which
be a pattern, too) an command be alloed. Note that an <allow> entry e.g. for reading
an attribute of an certain MBean has no influence if reading is enabled globally anyway -->
<!--
<allow>
<mbean>
<name>jolokia:type=Config</name>
<operation>*</operation>
<attribute>*</attribute>
</mbean>
<mbean>
<name>java.lang:type=Threading</name>
<operation>findDeadlockedThreads</operation>
</mbean>
</allow>
-->
<!-- MBean access can be restricted by a <deny> section for commands enabled in a <commands> section
(or when the <commands> section is missing completely in which case all commands are allowed)
-->
<deny>
<mbean>
<!-- Exposes user/password of data source, so we forbid this one -->
<name>com.mchange.v2.c3p0:type=PooledDataSource,*</name>
<attribute>properties</attribute>
</mbean>
</deny>
<cors>
<!-- Allow cross origin access -->
<allow-origin>*</allow-origin>
</cors>
</restrict>
springBatchServerList=localhost\\:8080/spring-batch-admin-sample/,localhost\\:8181/
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2009-2013 Roland Huss
~
~ Licensed 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 version="2.4" 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">
<display-name>JSON JMX Agent</display-name>
<servlet>
<servlet-name>jolokia-agent</servlet-name>
<servlet-class>org.jolokia.http.AgentServlet</servlet-class>
<init-param>
<description>
Class names (comma separated) of RequestDispatcher used in addition
to the LocalRequestDispatcher
</description>
<param-name>dispatcherClasses</param-name>
<param-value>org.jolokia.jsr160.Jsr160RequestDispatcher</param-value>
</init-param>
<init-param>
<description>
Debugging state after startup. Can be changed via
the Config MBean during runtime
</description>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<description>
Entries to keep in the history. Can be changed during
runtime via the config MBean
</description>
<param-name>historyMaxEntries</param-name>
<param-value>10</param-value>
</init-param>
<init-param>
<description>
Maximum number of entries to keed in the local
debug history if switched on. Can be change via
the config MBean during runtime.
</description>
<param-name>debugMaxEntries</param-name>
<param-value>100</param-value>
</init-param>
<init-param>
<description>
Maximum depth when traversing bean properties.
If set to 0, depth checking is disabled
</description>
<param-name>maxDepth</param-name>
<param-value>15</param-value>
</init-param>
<init-param>
<description>
Maximum size of collections returned when
serializing to JSON. When set to 0, not
collections are truncated.
</description>
<param-name>maxCollectionSize</param-name>
<param-value>1000</param-value>
</init-param>
<init-param>
<description>
Maximum number of objects which is traversed
when serializing a single response. Use this
as airbag to avoid boosting your memory and
network traffic. Nevertheless, when set to 0
not limit is used.
</description>
<param-name>maxObjects</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<description>
Options specific for certain application
server detectors. Detectors can evaluate these
options and perform a specific initialization based
on these options. The value is a JSON object with
the detector's name as key and the options as value.
E.g. '{glassfish: {bootAmx: false}}' would prevent
the booting of the AMX subsystem on a glassfish with
is done by default.
</description>
<param-name>detectorOptions</param-name>
<param-value>{}</param-value>
</init-param>
<init-param>
<description>
This option specifies in which order the key-value properties within
ObjectNames as returned by "list" or "search" are returned. By default
this is the so called 'canonical order' in which the keys are sorted
alphabetically. If this option is set to "false", then the natural
order is used, i.e. the object name as it was registered. This option
can be overridden with a query parameter of the same name.
</description>
<param-name>canonicalNaming</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>
Whether to include a stacktrace of an exception in case
of an error. By default it it set to "true" in which case
the stacktrace is always included. If set to "false", no
stacktrace is included. If the value is "runtime" a stacktrace
is only included for RuntimeExceptions. This global option
can be overridden with a query parameter.
</description>
<param-name>includeStackTrace</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>
When this parameter is set to "true", then an exception thrown
will be serialized as JSON and included in the response
under the key "error_value". By default it is "false". This global
option can be overridden by a query parameter of the same name.
</description>
<param-name>serializeException</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<description>
If discoveryEnabled is set to true, then this servlet will listen
for multicast discovery request and responds with its agent URL and
other server specific information. Instead of setting this confog variable,
discovery can be also enabled via the system property "jolokia.discoveryEnabled"
or the environment variable "JOLOKIA_DISCOVERY_ENABLED".
In addition the config parameter "discoveryAgentUrl" can be used to set the the agent's URL.
By default, auto detection (after the first request was processed by the servlet)) of the URL is used.
If the URL is set, then discovery is automatically enabled (i.e. there is
no need to set "discoveryEnabled=true"). This configuration option
is especially useful if the WAR is used in a proxy setup. Instead of setting the URL
here, it can be set also either via the system property "jolokia.discoveryAgentUrl" or the
environment variable "JOLOKIA_DISCOVERY_AGENT_URL".
</description>
<param-name>discoveryEnabled</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jolokia-agent</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!--
Example Configuration for switching on BASIC security. The role 'Jolokia'
must be mapped to real users with passwords on the Appserver side:
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Jolokia</realm-name>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>Jolokia-Agent Access</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>Jolokia</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>Jolokia</role-name>
</security-role>
-->
</web-app>
<!--
Copyright 2009-2010 Roland Huss
Licensed 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.
-->
### ActiveMQ
Click [ActiveMQ](#/jmx/attributes?tab=activmemq) in the top navigation bar to see the ActiveMQ specific plugin. (The ActiveMQ tab won't appear if there is no broker in this JVM). The ActiveMQ plugin works very much the same as the JMX plugin however with a focus on interacting with an ActiveMQ 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 ActiveMQ that you can inspect via the **Attributes** tab.
You can then click on the **Queue** node to see the queues and **Topic** node to see the topics. From either of these nodes you should see **Create Queue** or **Create Topic** tabs to be able to create new destinations.
Once you have selected a destination you should be able to **Send** to it, **Browse** a queue or view the **Attributes** or **Charts**
You can also see a graphical view of all producers, destinations and consumers for all queues (or if you select a Topic folder then topics) using the **Diagram** tab. Selecting a single queue or topic shows just all the producers and consumers on that destination. This diagram makes it easy to spot if producers are sending messages when there are no consumers, or that consumers are on the wrong destination etc.
<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="ActiveMQ.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.queue"> Queues
</label>
</li>
<li>
<label class="checkbox">
<input type="checkbox" ng-model="viewSettings.topic"> Topics
</label>
</li>
<li class="divider"></li>
<li ng-show="isFmc">
<label class="checkbox">
<input type="checkbox" ng-model="viewSettings.group"> Broker groups
</label>
</li>
<li ng-show="isFmc">
<label class="checkbox">
<input type="checkbox" ng-model="viewSettings.profile"> Profiles
</label>
</li>
<li>
<label class="checkbox">
<input type="checkbox" ng-model="viewSettings.broker"> Brokers
</label>
</li>
<li ng-show="isFmc">
<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 ng-show="isFmc">
<label class="checkbox">
<input type="checkbox" ng-model="viewSettings.container"> Containers
</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>
<a ng-show="isFmc" ng-href="#/fabric/mq/brokers{{hash}}" title="View the broker and container diagram">
<i class="icon-edit"></i> Configuration
</a>
</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>
<div ng-controller="ActiveMQ.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" 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 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>
<form class="form-horizontal" ng-controller="ActiveMQ.DestinationController">
<fieldset>
<div class="control-group">
<label class="pull-left" style="margin-top:5px;"> {{destinationTypeName}} name:</label>
<input class="span10 pull-left" type="text" size="60" style="margin-left:15px;" maxlength="300" name="destinationName" ng-model="destinationName" placeholder="{{destinationTypeName}} name"/>
</div>
<div class="alert alert-warning">
The JMS API does not define a standard address syntax. Although a standard address syntax was considered, it was decided that the differences in address semantics between existing message-oriented middleware (MOM) products were too wide to bridge with a single syntax.
</div>
<div class="control-group">
<label class="checkbox">
<input type="radio" ng-model="queueType" value="true"> Queue
</label>
<label class="checkbox">
<input type="radio" ng-model="queueType" value=""> Topic
</label>
</div>
<div class="control-group">
<button type="submit" class="btn btn-info" ng-click="createDestination(destinationName, queueType)"
ng-disabled="!destinationName">Create {{destinationTypeName}}
</button>
</div>
</fieldset>
</form>
<form class="form-horizontal" ng-controller="ActiveMQ.DestinationController">
<div class="control-group">
<label class="pull-left" style="margin-top:5px;"> Queue name:</label>
<input class="span10 pull-left" type="text" size="60" style="margin-left:15px;" maxlength="300" name="destinationName" ng-model="destinationName" placeholder="Queue name"/>
</div>
<div class="alert alert-warning">
The JMS API does not define a standard address syntax. Although a standard address syntax was considered, it was decided that the differences in address semantics between existing message-oriented middleware (MOM) products were too wide to bridge with a single syntax.
</div>
<div class="control-group">
<button type="submit" class="btn btn-info" ng-click="createDestination(destinationName, true)" ng-disabled="!destinationName">Create queue</button>
</div>
</form>
<form class="form-horizontal" ng-controller="ActiveMQ.DestinationController">
<div class="control-group">
<label class="pull-left" style="margin-top:5px;"> Topic name:</label>
<input class="span10 pull-left" type="text" size="60" style="margin-left:15px;" maxlength="300" name="destinationName" ng-model="destinationName" placeholder="Topic name"/>
</div>
<div class="alert alert-warning">
The JMS API does not define a standard address syntax. Although a standard address syntax was considered, it was decided that the differences in address semantics between existing message-oriented middleware (MOM) products were too wide to bridge with a single syntax.
</div>
<div class="control-group">
<button type="submit" class="btn btn-info" ng-click="createDestination(destinationName, false)" ng-disabled="!destinationName">Create topic</button>
</div>
</form>
<div ng-controller="ActiveMQ.DestinationController">
<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()}}'</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()}}'</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()">
<div class="dialog-body">
<p>You are about to delete the <b>{{name()}}</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()}}</b> queue</p>
<p>This operation cannot be undone so please be careful.</p>
</div>
</div>
</div>
<form class="form-horizontal" ng-controller="ActiveMQ.DestinationController">
<div class="control-group">
<div class="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Warning!</strong> You are about to delete topic '{{name()}}'.
<br/>
This operation cannot be undone!
</div>
</div>
<div class="control-group">
<button type="submit" class="btn btn-warning" ng-click="deleteDestination()">Delete topic '{{name()}}'</button>
</div>
</form>
<div ng-controller="ActiveMQ.DurableSubscriberController">
<div class="row-fluid">
<div class="span12">
<div class="pull-right">
<form class="form-inline">
<button class="btn" ng-click="createSubscriberDialog.open()"
title="Create durable subscriber">
<i class="icon-plus"></i> Create
</button>
<button class="btn" ng-click="deleteSubscriberDialog.open()"
title="Destroy durable subscriber" ng-disabled="gridOptions.selectedItems.length != 1">
<i class="icon-exclamation"></i> Destroy
</button>
<button class="btn" ng-click="refresh()"
title="Refreshes the list of subscribers">
<i class="icon-refresh"></i>
</button>
</form>
</div>
</div>
</div>
<div class="row-fluid">
<div class="gridStyle" ng-grid="gridOptions"></div>
</div>
<div modal="createSubscriberDialog.show">
<form name="createSubscriber" class="form-horizontal no-bottom-margin" ng-submit="doCreateSubscriber(clientId, subscriberName, topicName, subSelector)">
<div class="modal-header"><h4>Create Durable Subscriber</h4></div>
<div class="modal-body">
<label>Client Id: </label>
<input name="clientId" class="input-xlarge" type="text" ng-model="clientId" required>
<label>Subscriber name: </label>
<input name="subscriberName" class="input-xlarge" type="text" ng-model="subscriberName" required>
<label>Topic name: </label>
<input name="topicName" class="input-xlarge" type="text" ng-model="topicName" required typeahead="title for title in topicNames($viewValue) | filter:$viewValue" typeahead-editable='true'>
<label>Selector: </label>
<input name="subSelector" class="input-xlarge" type="text" ng-model="subSelector">
</div>
<div class="modal-footer">
<input class="btn btn-success" type="submit" value="Create">
<input class="btn btn-primary" type="button" ng-click="createSubscriberDialog.close()" value="Cancel">
</div>
</form>
</div>
<div hawtio-slideout="showSubscriberDialog.show" title="Details">
<div class="dialog-body">
<div class="row-fluid">
<div class="pull-right">
<form class="form-inline">
<button class="btn btn-danger" ng-disabled="showSubscriberDialog.subscriber.Status == 'Active'"
ng-click="deleteSubscriberDialog.open()"
title="Delete subscriber">
<i class="icon-remove"></i> Delete
</button>
<button class="btn" ng-click="showSubscriberDialog.close()" title="Close this dialog">
<i class="icon-remove"></i> Close
</button>
</form>
</div>
</div>
<div class="row-fluid">
<div class="expandable-body well">
<table class="table table-condensed table-striped">
<thead>
<tr>
<th>Property</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td class="property-name">Client Id</td>
<td class="property-value">{{showSubscriberDialog.subscriber["ClientId"]}}</td>
</tr>
<tr>
<td class="property-name">Subscription Name</td>
<td class="property-value">{{showSubscriberDialog.subscriber["SubscriptionName"]}}</td>
</tr>
<tr>
<td class="property-name">Topic Name</td>
<td class="property-value">{{showSubscriberDialog.subscriber["DestinationName"]}}</td>
</tr>
<tr>
<td class="property-name">Selector</td>
<td class="property-value">{{showSubscriberDialog.subscriber["Selector"]}}</td>
</tr>
<tr>
<td class="property-name">Status</td>
<td class="property-value">{{showSubscriberDialog.subscriber.Status}}</td>
</tr>
<tr>
<td class="property-name">Enqueue Counter</td>
<td class="property-value">{{showSubscriberDialog.subscriber["EnqueueCounter"]}}</td>
</tr>
<tr>
<td class="property-name">Dequeue Counter</td>
<td class="property-value">{{showSubscriberDialog.subscriber["DequeueCounter"]}}</td>
</tr>
<tr>
<td class="property-name">Dispatched Counter</td>
<td class="property-value">{{showSubscriberDialog.subscriber["DispatchedCounter"]}}</td>
</tr>
<tr>
<td class="property-name">Pending Size</td>
<td class="property-value">{{showSubscriberDialog.subscriber["PendingQueueSize"]}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div hawtio-confirm-dialog="deleteSubscriberDialog.show" ok-button-text="Yes" cancel-button-text="No" on-ok="deleteSubscribers()">
<div class="dialog-body">
<p>Are you sure you want to delete the subscriber</p>
</div>
</div>
</div>
\ No newline at end of file
<div ng-controller="ActiveMQ.JobSchedulerController">
<div class="row-fluid">
<div class="span12">
<div class="pull-right">
<form class="form-inline">
<button class="btn" ng-disabled="!gridOptions.selectedItems.length"
ng-click="deleteJobsDialog.open()"
title="Delete the selected jobs">
<i class="icon-remove"></i> Delete
</button>
<button class="btn" ng-click="refresh()"
title="Refreshes the list of subscribers">
<i class="icon-refresh"></i>
</button>
</form>
</div>
</div>
</div>
<div class="row-fluid">
<div class="gridStyle" ng-grid="gridOptions"></div>
</div>
<div hawtio-confirm-dialog="deleteJobsDialog.show" ok-button-text="Yes" cancel-button-text="No" on-ok="deleteJobs()">
<div class="dialog-body">
<p>Are you sure you want to delete the jobs</p>
</div>
</div>
</div>
\ No newline at end of file
<script type="text/ng-template" id="header">
<div class="tree-header" ng-controller="ActiveMQ.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="activemqtree"
ng-controller="ActiveMQ.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>
<div ng-controller="ActiveMQ.PreferencesController">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="activemqUserName"
title="The user name to be used when connecting to the broker">User name</label>
<div class="controls">
<input id="activemqUserName" type="text" placeholder="username" ng-model="activemqUserName" autofill/>
</div>
</div>
<div class="control-group">
<label class="control-label" for="activemqPassword" title="Password to be used when connecting to the broker">Password</label>
<div class="controls">
<input id="activemqPassword" type="password" placeholder="password" ng-model="activemqPassword" autofill/>
</div>
</div>
<div class="control-group">
<label class="control-label">Filter advisory topics</label>
<div class="controls">
<input type="checkbox" ng-model="activemqFilterAdvisoryTopics">
<span class="help-block">Whether to exclude advisory topics in tree/table</span>
</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>
This diff is collapsed.
### API
This plugin supports viewing the APIs of [WSDL](http://www.w3.org/TR/wsdl) and [WADL](https://wadl.java.net/) documents on [Apache CXF](http://cxf.apache.org/) based web service endpoints.
For example in Fuse Fabric you can then view the available APIs:
![Endpoints](app/api/doc/img/api-browse.png "Browse APIs")
Then for a given endpoint you can browse its API (in this case WADL but this works for Swagger and WSDL too)
![WADL API](app/api/doc/img/wadl.png "API")
This diff is collapsed.
<link rel="stylesheet" href="app/api/css/api.css" type="text/css"/>
<div class="row-fluid" ng-controller="API.WsdlViewController">
<div class="log-main">
<div ng-class="isInDashboardClass()">
<div class="swagger-ui-wrap">
<div class="info">
<div ng-repeat="resource in services | filter:searchText">
<ul class="resources">
<li class="resource active">
<div class="heading">
<h2>
<a ng-click="toggleResourcesFor(resource)">{{resource.name}}</a>
: {{resource.targetNamespace}}
</h2>
<!-- TODO
{{service.portName}}
<a href="{{service.pathHref}}">{{service.path}}</a>
-->
<ul class="options">
<li>
<a ng-click="showHide(resource)">Show/Hide</a>
</li>
<li>
<a ng-click="showOperations(resource)">
List Operations
</a>
</li>
<li>
<a ng-click="expandOperations(resource)">
Expand Operations
</a>
</li>
<li>
<a target="raw" href="{{url}}">Raw</a>
</li>
</ul>
</div>
<ul class="endpoints" style="display: block;">
<li class="endpoint" ng-hide="resource.hide">
<ul class="operations">
<li ng-repeat="method in resource.operations | filter:searchText" class="get operation">
<div class="expandable closed" model="method">
<div class="heading title">
<h3>
<span class="http_method">{{method.name}}</span>
</h3>
<ul class="options">
<li>
<a href="#" class="toggleOperation">{{method.description}}</a>
</li>
</ul>
</div>
<div class="content expandable-body">
<div class="inputs" ng-show="method.inputs.length">
<form accept-charset="UTF-8" class="sandbox">
<div style="margin:0;padding:0;display:inline"></div>
<h4>Inputs</h4>
<table class="fullwidth">
<thead>
<tr>
<th style="width: 100px; max-width: 100px">Name</th>
<th style="width: 310px; max-width: 310px">Type</th>
<th style="width: 200px; max-width: 200px">Description</th>
</tr>
</thead>
<tbody class="operation-params">
<tr ng-repeat="kind in method.inputs">
<td>{{kind.name}}</td>
<td>
<div class="model-signature" ng-show="kind.schema">
<div class="signature-container">
<div class="description" style="display: block;">
<span class="strong" title="java class: {{rep.javaClass}}
element name: {{rep.element}}">{{kind.typeName}} {</span>
<div ng-repeat="(key, value) in kind.schema.properties">
<span class="propName propOpt">{{key}}</span>
(<span class="propType">{{value.type}}</span><span class="propOptKey"
ng-show="value.optional">, optional</span>)
<span class="propDesc" ng-show="value.description">: {{value.description}}</span>
</div>
<span class="strong">}</span>
</div>
</div>
</div>
</td>
<td>{{kind.description}}</td>
</tr>
</tbody>
</table>
</form>
</div>
<div class="outputs" ng-show="method.outputs.length">
<form accept-charset="UTF-8" class="sandbox">
<div style="margin:0;padding:0;display:inline"></div>
<h4>Return Value</h4>
<table class="fullwidth">
<thead>
<tr>
<th style="width: 100px; max-width: 100px">Name</th>
<th style="width: 310px; max-width: 310px">Type</th>
<th style="width: 200px; max-width: 200px">Description</th>
</tr>
</thead>
<tbody class="operation-params">
<tr ng-repeat="kind in method.outputs">
<td>{{kind.name}}</td>
<td>
<div class="model-signature" ng-show="kind.schema">
<div class="signature-container">
<div class="description" style="display: block;">
<span class="strong" title="java class: {{rep.javaClass}}
element name: {{rep.element}}">{{kind.typeName}} {</span>
<div ng-repeat="(key, value) in kind.schema.properties">
<span class="propName propOpt">{{key}}</span>
(<span class="propType">{{value.type}}</span><span class="propOptKey"
ng-show="value.optional">, optional</span>)
<span class="propDesc" ng-show="value.description">: {{value.description}}</span>
</div>
<span class="strong">}</span>
</div>
</div>
</div>
</td>
<td>{{kind.description}}</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
</div>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="footer">
<br>
<br>
<h4 style="color: #999">[ <span style="font-variant: small-caps">base url</span>: {{root.base}},
<!--
<span style="font-variant: small-caps">api version</span>: 1.0.0
-->
]</h4>
</div>
</div>
</div>
</div>
</div>
### Apollo
This plugin helps you manage [Apache Apollo](http://activemq.apache.org/apollo/)
\ No newline at end of file
<div class="row-fluid">
<div class="span12" style="padding-bottom:1em">
<select class="nomargin">
<option class="ember-view" value="apollo.xml" selected="selected">apollo.xml</option>
<option class="ember-view" value="black-list.txt">black-list.txt</option>
<option class="ember-view" value="groups.properties">groups.properties</option>
<option class="ember-view" value="keystore">keystore</option>
<option class="ember-view" value="log4j.properties">log4j.properties</option>
<option class="ember-view" value="login.config">login.config</option>
<option class="ember-view" value="users.properties">users.properties</option>
</select>
</div>
</div>
\ No newline at end of file
<div>
<div class="form-horizontal">
<div class="control-group">
<label class="control-label"><strong style="font-size:170%">Connector:</strong></label>
<div class="controls">
<select><option value="tls">tls</option><option value="61616">61616</option><option value="tcp" selected="selected">tcp</option><option value="ws">ws</option><option value="wss">wss</option></select>
<button class="btn btn-warning"><i class="icon-stop"></i> Stop</button>
</div>
</div>
</div>
<div class="row-fluid">
<div class="span4">
<div class="well" style="padding: 8px 8px">
<div class="well-title">Details</div>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Started Since: </strong>6/13/2013 2:27:52 PM</td></tr>
<tr><td><strong>Bound to: </strong>/0:0:0:0:0:0:0:0%0:61613</td></tr>
<tr><td><strong>Protocol: </strong>any</td></tr>
<tr><td><strong>Currently Connected: </strong>1</td></tr>
<tr><td><strong>Connection Counter: </strong>2</td></tr>
<tr><td><strong>Outbound Messages: </strong>0</td></tr>
<tr><td><strong>Inbound Messages: </strong>0</td></tr>
<tr><td><strong>Data Transferred In: </strong>396 bytes</td></tr>
<tr><td><strong>Data Transferred Out: </strong>252 bytes</td></tr>
</tbody>
</table>
</div>
</div>
<div class="span8">
<h3>Connections</h3>
<div class="well">
<div class="form-inline">
Page 1 of 1:
</div>
</div>
<table class="details table table-bordered table-striped" style="">
<tbody>
<tr>
<th><input type="checkbox"></th>
<th>Remote Address</th>
<th>Protocol</th>
<th>User</th>
<th>Data In</th>
<th>Data Out</th>
<th>Msgs In</th>
<th>Msgs out</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td><i class=" icon-zoom-in"></i>/0:0:0:0:0:0:0:1%0:57122</td><td>stomp</td><td>admin</td><td>198 bytes</td><td>126 bytes</td><td>0</td><td>0</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
\ No newline at end of file
<div ng-controller="Apollo.ApolloController">
<div class="row-fluid">
<div id="content-holder" class="row"></div>
<div>
<div class="span12" ng-controller="Core.NavBarController">
<ul class="nav nav-tabs">
<li ng-class='{active : isActive("#/apollo/virtual-hosts")}'>
<a ng-href="{{link('#/apollo/virtual-hosts')}}">Virtual Hosts</a>
</li>
<li ng-class='{active : isActive("#/apollo/connectors")}'>
<a ng-href="{{link('#/apollo/connectors')}}">Connectors</a>
</li>
<li ng-class='{active : isActive("#/apollo/operating-environment")}'>
<a ng-href="{{link('#/apollo/operating-environment')}}">Operating Environment</a>
</li>
<li ng-class='{active : isActive("#/apollo/configuration")}'>
<a ng-href="{{link('#/apollo/configuration')}}">Configuration</a>
</li>
</ul>
<ng-include ng-if='isActive("#/apollo/virtual-hosts")' src="'app/apollo/html/virtual_hosts.html'"></ng-include>
<ng-include ng-if='isActive("#/apollo/connectors")' src="'app/apollo/html/connectors.html'"></ng-include>
<ng-include ng-if='isActive("#/apollo/operating-environment")' src="'app/apollo/html/operating-environment.html'"></ng-include>
<ng-include ng-if='isActive("#/apollo/configuration")' src="'app/apollo/html/configuration.html'"></ng-include>
</div>
</div>
</div>
</div>
<div class="row-fluid">
<div class="span4">
<div class="well" style="padding: 8px 8px">
<div class="well-title">Apache Apollo</div>
<table class="details table table-bordered table-striped">
<tbody>
<tr>
<td><strong>Version: </strong>99-trunk-SNAPSHOT</td>
</tr>
<tr>
<td><strong>Install Directory: </strong></td>
</tr>
<tr>
<td><strong>Instance Directory: </strong>/Users/chirino/opt/apollo-01</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="span4">
<div class="well" style="padding: 8px 8px">
<div class="well-title">Java Virtual Machine</div>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Version: </strong>Java HotSpot(TM) 64-Bit Server VM 1.6.0_45 (Apple Inc.)</td></tr>
<tr><td><strong>Up Time: </strong>76720.56 seconds</td></tr>
<tr><td><strong>Heap Memory: </strong>39.70 mb / 180.69 mb</td></tr>
<tr><td><strong>Non-Heap Memory: </strong>54.86 mb / 55.13 mb</td></tr>
<tr><td><strong>Threads: </strong>42</td></tr>
<tr><td><strong>CPU Time: </strong>244.990 seconds</td></tr>
</tbody>
</table>
</div>
</div>
<div class="span4">
<div class="well" style="padding: 8px 8px">
<div class="well-title">Operating System</div>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Name: </strong>Mac OS X 10.8.3</td></tr>
<tr><td><strong>Architecture: </strong>x86_64</td></tr>
<tr><td><strong>Processor Cores: </strong>8</td></tr>
<tr><td><strong>Memory Free/Total: </strong>3.29 gb / 16.00 gb</td></tr>
<tr><td><strong>Swap Used/Available: </strong>0 bytes / 3.00 gb </td></tr>
<tr><td><strong>FD Open/Max: </strong>211 / 10240</td></tr>
<tr><td><strong>Load Average</strong>2.5869140625</td></tr>
</tbody>
</table>
</div>
</div>
</div>
\ No newline at end of file
<div class="row-flow" style="margin:0 1em">
<ul class="nav nav-tabs">
<li class="active">
<a data-toggle="tab">
<strong>Queue:</strong> test
<strong><i class="icon-remove-sign"></i></strong>
</a>
</li>
</ul>
<div class="span4">
<div class="well" style="padding: 8px 8px">
<div class="well-title">Details</div>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Up Since: </strong>6/14/2013 11:52:58 AM</td></tr>
<tr><td><strong>Queue Size: </strong>10001 messages</td></tr>
<tr><td><strong>Enqueued: </strong>10001 items / 3.76 mb
<a href="#" data-original-title="6/14/2013 11:52:59 AM"><i class="icon-time"></i></a>
</td></tr>
<tr><td><strong>Dequeued: </strong>0 / 0 bytes
<a href="#" data-original-title="6/14/2013 11:52:58 AM"><i class="icon-time"></i></a>
</td></tr>
<tr><td><strong>Nacked: </strong>0 / 0 bytes
<a href="#" data-original-title="6/14/2013 11:52:58 AM"><i class="icon-time"></i></a>
</td></tr>
<tr><td><strong>Expired: </strong>0 / 0 bytes
<a href="#" data-original-title="6/14/2013 11:52:58 AM"><i class="icon-time"></i></a>
</td></tr>
<tr><td><strong>Enqueue Rate Throttle: </strong></td></tr>
<tr><td><strong>Swapped In: </strong>0 msgs 0 bytes</td></tr>
<tr><td><strong>Swapping Out: </strong>0 bytes</td></tr>
<tr><td><strong>Swapping In: </strong>0 bytes</td></tr>
<tr><td><strong>Total Swap Ins: </strong>25 msgs 3.76 mb</td></tr>
<tr><td><strong>Total Swap Outs: </strong>10001 msgs 9.56 kb</td></tr>
</tbody>
</table>
</div>
</div>
<div class="span7">
<ul class="nav nav-tabs">
<li class="active"><a href="#TAB_Messages" data-toggle="tab">Messages (0)</a></li>
<li><a href="#TAB_Producers" data-toggle="tab">Producers (0)</a></li>
<li><a href="#TAB_Consumers" data-toggle="tab">Consumers (0)</a></li>
</ul>
<div class="tabbable">
<div class="tab-content">
<div class="tab-pane active" id="TAB_Messages">
<!--
<div class="well form-horizontal">
<label class="control-label"><strong>Message: </strong></label>
<div class="controls">
<input class="input-xlarge" placeholder="body" type="text"></input>
<a class="btn" href="#">Send</a>
</div>
</div>
-->
<div class="well">
<div class="form-inline">
<span style="padding-right:1em;">
Browse From:
<input class="input-number" type="text" value="1">
</span>
<span style="padding-right:1em;">
Max:
<input class="input-number" type="text" value="25">
</span>
<span style="padding-right:3em;">
<button class="btn"><i class="icon-repeat"></i> Go</button>
</span>
<button class="btn">Prev</button>
<button class="btn">Next</button>
</div>
</div>
<table class="details table table-bordered" style="">
<tbody>
<tr>
<th>&nbsp;</th>
<th>Sequence</th>
<th>Codec</th>
<th>Persistent</th>
<th>Expires</th>
<th>Prefetched</th>
<th>Acquirer</th>
<th width="100%">Size</th>
</tr>
<tr>
<td>
<a>
<i class="icon-caret-right"></i>
</a>
</td>
<td>1</td>
<td>stomp</td>
<td>true</td>
<td>no</td>
<td>false</td>
<td> </td>
<td>391 bytes</td>
</tr>
<tr>
<td>
<a>
<i class="icon-caret-right"></i>
</a>
</td>
<td>2</td>
<td>stomp</td>
<td>true</td>
<td>no</td>
<td>false</td>
<td> </td>
<td>391 bytes</td>
</tr>
<tr>
<td>
<a>
<i class="icon-caret-right"></i>
</a>
</td>
<td>3</td>
<td>stomp</td>
<td>true</td>
<td>no</td>
<td>false</td>
<td> </td>
<td>391 bytes</td>
</tr>
<tr>
<td>
<a>
<i class="icon-caret-right"></i>
</a>
</td>
<td>4</td>
<td>stomp</td>
<td>true</td>
<td>no</td>
<td>false</td>
<td> </td>
<td>391 bytes</td>
</tr>
<tr>
<td>
<a>
<i class="icon-caret-right"></i>
</a>
</td>
<td>5</td>
<td>stomp</td>
<td>true</td>
<td>no</td>
<td>false</td>
<td> </td>
<td>391 bytes</td>
</tr>
</tbody>
</table>
</div>
<div class="tab-pane" id="TAB_Producers">
<div style="padding-left:2em;">No producers are attached.</div>
</div>
<div class="tab-pane" id="TAB_Consumers">
<div style="padding-left:2em;">No consumers are attached.</div>
</div>
</div>
</div>
</div>
</div>
\ No newline at end of file
<div>
<div class="well center">
<form action="" class="nomargin form-inline">
<strong>Name: </strong>
<input placeholder="name" type="text" value="">
<input type="submit" value="Create" class="btn btn-primary">
</form>
</div>
<div class="well">
<div class="form-inline">
Page 1 of 1:
</div>
</div>
<table class="details table table-bordered table-striped" style="">
<tbody>
<tr>
<th><input type="checkbox"></th>
<th>Name</th>
<th>Messages</th>
<th>Size</th>
<th>Producers</th>
<th>Consumers</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td><a href="#"><i class=" icon-zoom-in"></i> foo</a></td>
<td>0</td><td>0 bytes</td><td>0</td><td>0</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td><a href="#"><i class=" icon-zoom-in"></i> test</a></td>
<td>0</td><td>0 bytes</td><td>0</td><td>0</td>
</tr>
</tbody>
</table>
</div>
\ No newline at end of file
<div class="well" style="padding: 8px 8px">
<div class="well-title">
<a>
<i class="icon-caret-down"></i>
</a>
Store Status
</div>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Store Type: </strong>LevelDB</td></tr>
<tr><td><strong>Location: </strong>/Users/chirino/opt/apollo-01/data</td></tr>
<tr><td><strong>Disk Usage: </strong>100.25 mb</td></tr>
<tr><td><strong>Messages Stored:</strong>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Pending: </strong>0</td></tr>
<tr><td><strong>Canceled: </strong>0</td></tr>
<tr><td><strong>Flushed: </strong>0</td></tr>
</tbody>
</table>
</td></tr>
<tr><td><strong>Enqueues Stored:</strong>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Canceled: </strong>0</td></tr>
<tr><td><strong>Flushed: </strong>0</td></tr>
</tbody>
</table>
</td></tr>
<tr><td><strong>Index snapshot at: </strong>0x6d1</td></tr>
<tr><td><strong>Log append position: </strong>0x96a</td></tr>
<tr><td style="max-width:100px"><strong>Log Details: </strong>
<pre style="color:#333; font-size:80%; overflow:auto; word-wrap: normal; white-space:pre;">Log File | Msg Refs | File Size
00000000000006d1.log | 0 | 100.000 mb
--- Pending Stores Details ---
flush_source suspended: false
</pre>
</td></tr>
<tr><td style="max-width:100px"><strong>Index Details: </strong>
<pre style="color:#333; font-size:80%; overflow:auto; word-wrap: normal; white-space:pre;"> Compactions
Level Files Size(MB) Time(sec) Read(MB) Write(MB)
--------------------------------------------------
0 2 0 0 0 0
1 1 0 0 0 0
</pre>
</td></tr>
<tr><td><strong>Message Load Latency: </strong>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Count: </strong>0</td></tr>
<tr><td><strong>Total: </strong>0 ms</td></tr>
<tr><td><strong>Max: </strong>0 ms</td></tr>
<tr><td><strong>Min: </strong>0 ms</td></tr>
</tbody>
</table>
</td></tr>
<tr><td><strong>Message Flush Latency: </strong>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Count: </strong>0</td></tr>
<tr><td><strong>Total: </strong>0 ms</td></tr>
<tr><td><strong>Max: </strong>0 ms</td></tr>
<tr><td><strong>Min: </strong>0 ms</td></tr>
</tbody>
</table>
</td></tr>
</tbody>
</table>
</div>
\ No newline at end of file
<div ng-controller="Apollo.VirtualHostController"
ng-init="init(apollo.selected_virtual_host)"
ng-if='apollo.selected_virtual_host'
class="row-fluid">
<div class="span4">
<div class="well" style="padding: 8px 8px">
<div class="well-title">Details</div>
<table class="details table table-bordered table-striped">
<tbody>
<tr><td><strong>Up Since: </strong>{{virtual_host.state_since}}</td></tr>
<tr><td><strong>Host Names: </strong>
<ul>
<li ng:repeat="name in virtual_host.host_names">{{name}}</li>
</ul>
</td></tr>
</tbody>
</table>
</div>
<ng-include ng-if='virtual_host.store' src="'app/apollo/html/store.html'"></ng-include>
</div>
<div class="span8">
<ul class="nav nav-tabs"><li class="active"><a href="#">Queues</a></li><li><a href="#">Topics</a></li><li><a href="#">Durable Subs</a></li></ul>
<ng-include src="'app/apollo/html/queues.html'"></ng-include>
</div>
</div>
<div class="tab-pane active">
<div class="form-horizontal">
<div class="control-group">
<label class="control-label"><strong style="font-size:170%">Virtual host:</strong></label>
<div class="controls">
<select ng-model="apollo.selected_virtual_host" ng-options="v for v in broker.virtual_hosts">
</select>
<!-- <a class="btn" href="#"><i class="icon-stop icon-white"></i> Stop</a> -->
</div>
</div>
</div>
<ng-include ng-if='route() == "/apollo/virtual-hosts"' src="'app/apollo/html/virtual_host.html'"></ng-include>
<ng-include ng-if='route().startsWith("/apollo/virtual-hosts/queue")' src="'app/apollo/html/queue.html'"></ng-include>
</div>
This diff is collapsed.
This diff is collapsed.
<div class="row-fluid">
<div class="span6" ng-controller="Camel.AttributesToolBarController">
<div class="control-group">
<button class="btn" ng-disabled="!anySelectionHasState(['stop', 'suspend'])" ng-click="start()"><i
class="icon-play-circle"></i> Start
</button>
<button class="btn" ng-disabled="!anySelectionHasState('start')" ng-click="pause()"><i class="icon-pause"></i>
Pause
</button>
<button class="btn" ng-disabled="!anySelectionHasState(['start', 'suspend'])" ng-click="deleteDialog = true"><i
class="icon-remove"></i> Destroy
</button>
</div>
<div hawtio-confirm-dialog="deleteDialog"
ok-button-text="Delete"
on-ok="stop()">
<div class="dialog-body">
<p>You are about to delete this Camel Context.</p>
<p>This operation cannot be undone so please be careful.</p>
</div>
</div>
</div>
<div class="span6">
<div class="control-group">
<input class="span12 search-query" type="text" ng-model="$parent.gridOptions.filterOptions.filterText" placeholder="search">
</div>
</div>
</div>
<div class="row-fluid">
<div class="span6">
<div class="control-group" ng-controller="Camel.AttributesToolBarController">
<button class="btn" ng-disabled="!anySelectionHasState(['stop', 'suspend'])" ng-click="start()"><i class="icon-play-circle"></i> Start</button>
<button class="btn" ng-disabled="!anySelectionHasState('start')" ng-click="pause()"><i class="icon-pause"></i> Pause</button>
<button class="btn" ng-disabled="!anySelectionHasState(['start', 'suspend'])" ng-click="stop()"><i class="icon-off"></i> Stop</button>
<button class="btn" ng-disabled="!everySelectionHasState('stop')" ng-click="delete()"><i class="icon-remove"></i> Delete</button>
</div>
</div>
<div class="span6">
<div class="control-group">
<input type="text" class="span12 search-query" ng-model="$parent.gridOptions.filterOptions.filterText" placeholder="search">
</div>
</div>
</div>
<div class="logbar logbar-wiki" ng-controller="Camel.BreadcrumbBarController">
<div class="wiki logbar-container">
<ul class="nav nav-tabs">
<li class="" >
<a class="breadcrumb-link">
<span class="contained c-medium">Camel Contexts</span>
</a>
</li>
<li class="dropdown" ng-repeat="breadcrumb in breadcrumbs">
<a ng-show="breadcrumb.items.length > 0" href="#" class="breadcrumb-link dropdown-toggle" data-toggle="dropdown"
data-placement="bottom" title="{{breadcrumb.tooltip}}">
{{breadcrumb.name}}
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li ng-repeat="item in breadcrumb.items">
<a ng-href="{{item.link}}{{hash}}"
title="Switch to {{item.name}} "
data-placement="bottom">
{{item.name}}</a>
</li>
</ul>
</li>
<li class="pull-right" ng-show="treeViewLink" title="Switch to the tree based explorer view">
<a href="{{treeViewLink}}"><i class="icon-resize-full"></i></a>
</li>
</ul>
</div>
</div>
<div ng-controller="Camel.BrowseEndpointController">
<div ng-hide="isJmxTab">
<ng-include src="'app/camel/html/breadcrumbBar.html'"></ng-include>
</div>
<div ng-class="{'wiki-fixed' : !isJmxTab}">
<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-click="forwardDialog.open()"
title="Forward the selected messages to another endpoint" data-placement="bottom">
<i class="icon-forward"></i> Forward
</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.id}}">
<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="forwardDialog.open()"
title="Forward the selected messages to another endpoint" data-placement="bottom">
<i class="icon-forward"></i> Forward
</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
</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>
</table>
</div>
</div>
<div class="row-fluid">
<div hawtio-editor="row.body" read-only="true" mode="mode"></div>
</div>
</div>
</div>
</div>
</div>
<div modal="forwardDialog.show" close="forwardDialog.close()" options="forwardDialog.options">
<form class="form-horizontal no-bottom-margin" ng-submit="forwardDialog.close()">
<div class="modal-header">
<h4>Forward
<ng-pluralize count="selectedItems.length"
when="{'1': 'a message', 'other': 'messages'}"></ng-pluralize>
</h4>
</div>
<div class="modal-body">
<p>Forward
<ng-pluralize count="selectedItems.length"
when="{'1': 'a message', 'other': '{} messages'}"></ng-pluralize>
to: <input type="text" style="width: 100%" ng-model="endpointUri" placeholder="Endpoint URI"
typeahead="title for title in endpointUris() | filter:$viewValue" typeahead-editable='true'></p>
</div>
<div class="modal-footer">
<input id="submit" class="btn btn-primary add" type="submit" ng-click="forwardMessagesAndCloseForwardDialog()"
value="Forward">
<button class="btn btn-warning cancel" type="button" ng-click="forwardDialog.close()">Cancel</button>
</div>
</form>
</div>
</div>
<div ng-switch="messageDialog.show">
<div ng-switch-when="false">
<div class="row-fluid">
<div class="gridStyle" ng-grid="gridOptions"></div>
<!--
<div class="gridStyle" hawtio-datatable="gridOptions"></div>
-->
</div>
</div>
<div ng-switch-when="true">
<div class="row-fluid">
<div class="span8">
<h4>{{row.id}}</h4>
</div>
<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-click="messageDialog.close()" title="Closes the message detail view">
<i class="icon-eject"></i></button>
</form>
</div>
</div>
<div class="row-fluid">
<div class="expandable closed">
<div title="Headers" class="title">
<i class="expandable-indicator"></i> Headers
</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>
</table>
</div>
</div>
<div class="row-fluid">
<div hawtio-editor="row.body" read-only="true" mode="mode"></div>
</div>
</div>
</div>
</div>
<ng-include src="'app/camel/html/browseMessageTemplate.html'"></ng-include>
<div class="row-fluid">
<div class="gridStyle" ng-grid="gridOptions"></div>
<!--
<div class="gridStyle" hawtio-datatable="gridOptions"></div>
-->
</div>
\ No newline at end of file
<div ng-controller="Camel.EndpointController" ng-switch="hasComponentNames">
<div ng-switch-when="true">
<tabs>
<pane heading="URL">
<ng-include src="'app/camel/html/createEndpointURL.html'"></ng-include>
</pane>
<pane heading="Components">
<ng-include src="'app/camel/html/createEndpointWizard.html'"></ng-include>
</pane>
</tabs>
</div>
<div ng-switch-default="false">
<ng-include src="'app/camel/html/createEndpointURL.html'"></ng-include>
</div>
</div>
<form class="form-horizontal">
<div class="control-group">
<input class="span12" type="text" size="255" ng-model="endpointName" placeholder="Endpoint URI"/>
</div>
<div class="control-group">
<button type="submit" class="btn btn-info" ng-click="createEndpoint(endpointName)"
ng-disabled="!endpointName">
Create endpoint
</button>
</div>
</form>
<div ng-controller="Camel.EndpointController">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="componentName">Component</label>
<div class="controls">
<select id="componentName" ng-model="selectedComponentName"
ng-options="componentName for componentName in componentNames"></select>
</div>
</div>
<div ng-show="selectedComponentName">
<div class="control-group">
<label class="control-label" for="endpointPath">Endpoint</label>
<div class="controls">
<input id="endpointPath" class="span10" type="text" ng-model="endpointPath" placeholder="name"
typeahead="title for title in endpointCompletions($viewValue) | filter:$viewValue" typeahead-editable='true'
min-length="1">
</div>
</div>
<div simple-form name="formEditor" entity='endpointParameters' data='endpointSchema' schema="schema"></div>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn btn-info" ng-click="createEndpointFromData()"
ng-disabled="!endpointPath || !selectedComponentName">
Create endpoint
</button>
</div>
</div>
</div>
</form>
</div>
<div ng-controller="Camel.DebugRouteController" ng-switch="debugging">
<div ng-switch-when="true">
<div class="row-fluid">
<div class="span10">
<div ng-include src="graphView">
</div>
</div>
<div class="span2">
<div class="btn-toolbar pull-right">
<div class="btn-group">
<div ng-switch="hasBreakpoint">
<button ng-switch-when="true" class="btn" ng-disabled="!selectedDiagramNodeId"
ng-click="removeBreakpoint()" title="Remove the breakpoint on the selected node"><i
class="icon-remove"></i>
</button>
<button ng-switch-default="false" class="btn" ng-disabled="!selectedDiagramNodeId"
ng-click="addBreakpoint()" title="Add a breakpoint on the selected node"><i class="icon-plus"></i>
</button>
</div>
</div>
<div class="btn-group">
<button class="btn" type="submit" ng-click="stopDebugging()" title="Stops the debugger">Close
</button>
</div>
</div>
<div class="btn-toolbar pull-right">
<div class="btn-group">
<button class="btn" ng-click="step()" ng-disabled="!stopped" title="Step into the next node"><img
ng-src="app/camel/doc/img/debug/step.gif"></button>
<button class="btn" ng-click="resume()" ng-disabled="!stopped" title="Resume running"><img
ng-src="app/camel/doc/img/debug/resume.gif"></button>
<button class="btn" ng-click="suspend()" ng-disabled="stopped"
title="Suspend all threads in this route"><img ng-src="app/camel/doc/img/debug/suspend.gif"></button>
</div>
</div>
<div class="span12 well">
<form>
<div class="table-header">Breakpoints:</div>
<ul>
<li class="table-row" ng-repeat="b in breakpoints">
{{b}}
</li>
</ul>
<div class="table-row">Suspended:</div>
<ul>
<li class="table-row" ng-repeat="b in suspendedBreakpoints">
{{b}}
</li>
</ul>
</form>
</div>
</div>
</div>
<div ng-include src="tableView">
</div>
</div>
<div class="span12 well" ng-switch-default="false">
<form>
<p>Debugging allows you to step through camel routes to diagnose issues</p>
<button class="btn btn-info" type="submit" ng-click="startDebugging()">Start debugging</button>
</form>
</div>
</div>
\ No newline at end of file
<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;
}
marker.context {
stroke: red;
fill: red;
stroke-width: 1.5px;
}
circle.context {
fill: #0c0;
}
circle.route {
fill: #c0c;
stroke-width: 1.3px;
}
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.endpoint, circle.endpoints {
fill: #00c;
}
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="Camel.FabricDiagramController">
<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.endpoint"> Endpoint
</label>
</li>
<li>
<label class="checkbox">
<input type="checkbox" ng-model="viewSettings.route"> Route
</label>
</li>
<li>
<label class="checkbox">
<input type="checkbox" ng-model="viewSettings.context"> Context
</label>
</li>
<!--
<li>
<label class="checkbox">
<input type="checkbox" ng-model="viewSettings.profile"> Profiles
</label>
</li>
-->
<li>
<label class="checkbox">
<input type="checkbox" ng-model="viewSettings.container"> Containers
</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>
<!--
<a ng-href="#/fabric/mq/contexts{{hash}}" title="View the context and container diagram">
<i class="icon-edit"></i> Configuration
</a>
-->
</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 ng-show="containerCount">
<div class="{{viewSettings.panel ? 'span8' : 'span12'}} canvas context-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 class="hero-unit" ng-show="containerCount === 0 && isFmc">
<p>There are currently no Camel routes running in this fabric</p>
<p>To try out the EIP browser try create one of the example <a
href="#/wiki/branch/{{versionId}}/view/fabric/profiles/example/quickstarts">quickstarts</a></p>
<p>e.g. Try creating a container for:
<a class="btn btn-primary"
href="#/fabric/containers/createContainer?profileIds=example-quickstarts-cbr&versionId={{versionId}}">
Content Based Router Quickstart
</a>
<a class="btn btn-primary"
href="#/fabric/containers/createContainer?profileIds=example-quickstarts-eip&versionId={{versionId}}">
EIP Quickstart
</a>
</p>
</div>
<div class="hero-unit" ng-show="containerCount === 0 && !isFmc">
<p>There are currently no Camel routes running in this JVM</p>
<p>To try out the Camel diagram try create one more Camel routes</p>
</div>
</div>
<div ng-include="'app/fabric/html/connectToContainerDialog.html'"></div>
</div>
<script type="text/ng-template" id="header">
<div class="camel tree-header" ng-controller="Camel.TreeHeaderController">
<div class="left">
<div class="section-filter">
<input id="camelContextIdFilter"
class="search-query"
type="text"
ng-model="contextFilterText"
title="filter camel context IDs"
placeholder="Filter...">
<i class="icon-remove clickable"
title="Clear filter"
ng-click="contextFilterText = ''"></i>
</div>
</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 class="camel-tree"
ng-controller="Camel.TreeController">
<div id="cameltree"></div>
</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>
<div simple-form name="formEditor" entity='nodeData' data='model' schema="schema"></div>
<div simple-form name="formViewer" mode='view' entity='nodeData' data='model' schema="schema"></div>
<div ng-controller="Camel.PreferencesController">
<form class="form-horizontal">
<label class="control-label">Maximum body length</label>
<div class="control-group">
<div class="controls">
<input type="number" ng-model="camelMaximumTraceOrDebugBodyLength" min="0">
<span class="help-block">The maximum length of the body before its clipped when using the tracer and debugger</span>
</div>
</div>
<label class="control-label">Maximum label length</label>
<div class="control-group">
<div class="controls">
<input type="number" ng-model="camelMaximumLabelWidth" min="0">
<span class="help-block">The maximum length of a label in Camel diagrams before it is clipped</span>
</div>
</div>
<label class="control-label">Do not use ID for label</label>
<div class="control-group">
<div class="controls">
<input type="checkbox" ng-model="camelIgnoreIdForLabel">
<span class="help-block">If enabled then we will ignore the ID value when viewing a pattern in a Camel diagram; otherwise we will use the ID value as the label (the tooltip will show the actual detail)</span>
</div>
</div>
</form>
</div>
<div class="row-fluid" ng-controller="Camel.ProfileRouteController">
<div class="row-fluid">
<div class="pull-right">
<form class="form-inline no-bottom-margin">
<fieldset>
<div class="control-group inline-block">
<input type="text" class="search-query" placeholder="Filter..." ng-model="gridOptions.filterOptions.filterText">
</div>
</fieldset>
</form>
</div>
</div>
<div class="row-fluid" ng-show="data.length > 0">
<div class="gridStyle" ng-grid="gridOptions"></div>
</div>
<div class="row-fluid" ng-show="data.length == 0">
Loading...
</div>
</div>
<div ng-controller="Camel.PropertiesController">
<div ng-include="viewTemplate"></div>
</div>
<style>
#node-CLOSED rect {
stroke-width: 1px;
fill: #f88;
}
.node:hover {
cursor: pointer;
opacity: 0.6;
}
.node.selected rect {
fill: url(#rect-select-gradient);
}
path.edge {
fill: none;
stroke: #666;
stroke-width: 3px;
}
.edge:hover {
cursor: pointer;
opacity: 0.4;
}
text.counter {
stroke: #080;
}
</style>
<div ng-class="{'wiki-fixed' : !isJmxTab}" id="canvas" ng-controller="Camel.RouteController">
<div ng-hide="isJmxTab">
<ng-include src="'app/camel/html/breadcrumbBar.html'"></ng-include>
</div>
<svg class="camel-diagram" width=0 height=0>
<defs>
<marker id="arrowhead"
viewBox="0 0 10 10"
refX="8"
refY="5"
markerUnits="strokeWidth"
markerWidth="4"
markerHeight="3"
orient="auto"
style="fill: #333">
<path d="M 0 0 L 10 5 L 0 10 z"></path>
</marker>
<filter id="drop-shadow" width="300%" height="300%">
<feGaussianBlur in="SourceAlpha" result="blur-out" stdDeviation="19"/>
<feOffset in="blur-out" result="the-shadow" dx="2" dy="2"/>
<feComponentTransfer xmlns="http://www.w3.org/2000/svg">
<feFuncA type="linear" slope="0.2"/>
</feComponentTransfer>
<feMerge xmlns="http://www.w3.org/2000/svg">
<feMergeNode/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<linearGradient id="rect-gradient" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:rgb(254,254,255);stop-opacity:1"/>
<stop offset="100%" style="stop-color:rgb(247,247,255);stop-opacity:1"/>
</linearGradient>
<linearGradient id="rect-select-gradient" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color: #ffffa0; stop-opacity: 0.7"/>
<stop offset="100%" style="stop-color: #f0f0a0; stop-opacity: 0.7"/>
</linearGradient>
</defs>
</svg>
</div>
<div ng-controller="Camel.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">
<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()">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 value="choose" class="tab-pane" title="Choose" ng-hide="!showChoose">
<!--
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 class="form-horizontal" ng-controller="Camel.SourceController">
<div class="row-fluid">
<div class="span12">
<button class="pull-right btn btn-primary"
ng-click="saveRouteXml()"><i class="icon-save"></i> Update</button>
</div>
</div>
<p></p>
<div class="row-fluid">
<div class="span12">
<div hawtio-editor="source" mode="mode"></div>
</div>
</div>
</div>
<div ng-controller="Camel.TraceRouteController">
<div class="span12 well" ng-hide="tracing">
<form>
<p>Tracing allows you to send messages to a route and then step through and see the messages flow through a route
to aid debugging and to help diagnose issues.</p>
<p>Once you start tracing, you can send messages to the input endpoints, then come back to this page and see the
flow of messages through your route.</p>
<p>As you click on the message table, you can see which node in the flow it came through; moving the selection up and down in the message table lets you see the flow of the message through the diagram.</p>
<button class="btn btn-info" type="submit" ng-click="startTracing()">Start tracing</button>
</form>
</div>
<div ng-show="tracing">
<form>
<button class="btn btn-info pull-right" type="submit" ng-click="stopTracing()">Stop tracing</button>
</form>
<div ng-include src="graphView">
</div>
<form>
<button class="btn btn-info pull-right" type="submit" ng-click="clear()">Clear messages</button>
</form>
<div>&nbsp;</div>
<div ng-include src="tableView">
</div>
</div>
</div>
\ No newline at end of file
<div class="row-fluid" ng-controller="Camel.TypeConverterController">
<!-- the dl need to be wider so we can see the labels -->
<style>
.dl-horizontal dt {
width: 260px;
}
.dl-horizontal dd {
margin-left: 280px;
}
</style>
<div ng-show="selectedMBean">
<div class="row-fluid">
<div class="pull-right">
<form class="form-inline no-bottom-margin">
<fieldset>
<div class="controls control-group inline-block controls-row">
<div class="btn-group">
<button
class="btn" ng-click="resetStatistics()" title="Reset statistics">
<i class="icon-refresh"></i></button>
<button
ng-disabled="mbeanAttributes.StatisticsEnabled"
class="btn" ng-click="enableStatistics()" title="Enable statistics">
<i class="icon-play-circle"></i></button>
<button
ng-disabled="!mbeanAttributes.StatisticsEnabled"
class="btn" ng-click="disableStatistics()" title="Disable statistics">
<i class="icon-off"></i></button>
</div>
</div>
</fieldset>
</form>
</div>
<div>
<dl class="dl-horizontal">
<dt>Number of Type Converters</dt>
<dd>{{mbeanAttributes.NumberOfTypeConverters}}</dd>
<dt># Attempts</dt>
<dd>{{mbeanAttributes.AttemptCounter}}</dd>
<dt># Hit</dt>
<dd>{{mbeanAttributes.HitCounter}}</dd>
<dt># Miss</dt>
<dd>{{mbeanAttributes.MissCounter}}</dd>
<dt># Failed</dt>
<dd>{{mbeanAttributes.FailedCounter}}</dd>
<dt>Statistics Enabled</dt>
<dd>{{mbeanAttributes.StatisticsEnabled}}</dd>
</dl>
</div>
</div>
<div class="row-fluid">
<div class="pull-right">
<form class="form-inline no-bottom-margin">
<fieldset>
<div class="control-group inline-block">
<input type="text" class="search-query" placeholder="Filter..."
ng-model="gridOptions.filterOptions.filterText">
</div>
</fieldset>
</form>
</div>
</div>
<div class="row-fluid" ng-show="data.length > 0">
<table class="table table-condensed table-striped" hawtio-simple-table="gridOptions"></table>
</div>
<div class="row-fluid" ng-show="data.length == 0">
Loading...
</div>
</div>
</div>
## Camin plugin
This plugin is used to render Gantt sequence diagrams of Camel routes.
<div class="row-fluid controller-section" style="margin-top:10px" ng-controller="Camin.Controller">
<div class="row-fluid">
<div class="row-fluid">
Exchange id: <input ng-model="query" style="width: 400px" ng-change="onQueryChange()">
</div>
<div class="row-fluid">
<div style="color: red;" ng-bind-html-unsafe="result"></div>
</div>
<div class="row-fluid">
<div id="gantt"></div>
</div>
<div class="row-fluid">
<div id="diagram"></div>
</div>
</div>
</div>
<div class="row-fluid">
<div ng-view></div>
</div>
This diff is collapsed.
### Change Log
#### 1.4.2
* New pane used for JMX/Camel/ActiveMQ tabs that allows resizing or hiding the JMX tree
* New terminal theme
* Restyled container list page in Fabric8 runtime view
* Switch from ng-grid to hawtio-simple-table for JMX attributes view
* Fixes [these 84 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=13&state=closed)
#### 1.4.1
* Using new hawtio logo
* Quick bugfix release
#### 1.4.0
* Theme support with two available themes, Default and Dark
* Better pluggable branding support
* Refactored preferences page into a slide out preferences panel, made preference tabs pluggable
* Relocated perspective switcher and incorporated it into the main navigation bar
* Perspective switcher now also maintains a list of 5 recently used connections automatically
* Added [fabric8](http://fabric8.io/) branding plugin
* Fixed some minor bugs and issues in the fabric plugin.
* Upgraded to [Jolokia](http://jolokia.org/) 1.2.1
* Fixes [these 18 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=11&state=closed)
#### 1.3.1
* Quick bugfix release
* Fixes [these 13 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=5&page=1&state=closed)
#### 1.3.0
* [Hawtio Directives](http://hawt.io/directives/index.html) is now released as a separate JS file so its easy to consume in other angularjs based projects.
* Separate [IRC plugin example](https://github.com/hawtio/hawtio/tree/master/hawtio-plugin-examples/irc-client-plugin) to show how to develop external plugins for hawtio
* Upgraded to [Jolokia](http://jolokia.org/) 1.2 so that hawtio can discover other Jolokia processes via multicast
* ActiveMQ plugin now defaults to [showing all the real time attributes for queues](https://github.com/hawtio/hawtio/issues/1175) to avoid folks having to find the Queues folder.
* Updated to support the new package name of [fabric8 mbeans](http://fabric8.io/)
* Fixes [these 51 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=10&state=closed)
#### 1.2.3
* new [hawtio Chrome Extension](http://hawt.io/getstarted/index.html) for easier connection to remote JVMs from your browser without having to run a hawtio server or connect through a web proxy
* Upgraded to TypeScript 0.9.5 which is faster
* [threads](https://github.com/hawtio/hawtio/tree/master/hawtio-web/src/main/webapp/app/threads) plugin to monitor JVM thread usage and status.
* Moved java code from hawtio-web into hawtio-system
* Clicking a line in the log plugin now shows a detail dialog with much more details.
* ActiveMQ plugin can now browse byte messages.
* Improved look and feel in the Camel route diagram.
* Breadcrumb navigation in Camel plugin to make it easier and faster to switch between CamelContext and routes in the selected view.
* Added Type Converter sub tab (requires Camel 2.13 onwards).
* Better support for older Internet Explorer browsers.
* Lots of polishing to work much better as the console for [fabric8](http://fabric8.io/)
* Fixes [these 175 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=9&state=closed)
#### 1.2.2
* Added welcome page to aid first time users, and being able to easily dismiss the welcome page on startup.
* Added preference to configure the order/enabling of the plugins in the navigation bar, and to select a plugin as the default on startup.
* Added support for Apache Tomcat security using the conf/tomcat-users.xml file as user database.
* Added [quartz](http://hawt.io/plugins/quartz/) plugin to manage quartz schedulers.
* Allow to configure the HTTP session timeout used by hawtio. hawtio now uses the default timeout of the web container, instead of hardcoded value of 900 seconds.
* The [JMX](http://hawt.io/plugins/jmx/) plugin can now edit JMX attributes.
* the [osgi](http://hawt.io/plugins/osgi/) plugin now supports OSGi Config Admin and uses OSGi MetaType metadata for generating nicer forms (if the io.fabric8/fabric-core bundle is deployed which implements an MBean for introspecting the OSGi MetaType).
* Fixes [these 75 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=8&state=closed)
#### 1.2.1
* New [Maven plugin](http://hawt.io/maven/) for running hawtio in your maven project; running Camel, Spring, Blueprint or tests.
* New plugins:
* [JUnit](http://hawt.io/plugins/junit/) for viewing/running test cases
* [API](http://hawt.io/plugins/api/) for viewing APIs from [Apache CXF](http://cxf.apache.org/) endpoints; currently only usable in a Fuse Fabric
* [IDE](http://hawt.io/plugins/ide/) for generating links to open files in your IDE; currently IDEA the only one supported so far ;)
* Site plugin for using hawtio to view and host your project website
* Improved the camel editor with a new properties panel on the right
* Fixes [these 51 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=3&state=closed)
#### 1.2.0
* Connectivity
* New _JVMs_ tab lets you connect to remote JVMs on your local machine; which if a JVM does not have jolokia installed it will install it on the fly. (Requires tools.jar in the classpath)
* New _Connect_ tab to connect to a remote JVM running jolokia (and its now been removed from the Preferences page)
* ActiveMQ gets huge improvements in its tooling
* we can more easily page through messages on a queue
* move messages from one queue to another
* delete messages
* retry messages on a DLQ (in 5.9.x of ActiveMQ onwards)
* purge queues
* Camel
* Neater message tracing; letting you zoom into a message and step through the messages with video player controls
* Can now forward messages on any browseable camel enpdoint to any other Camel endpoints
* Fabric
* Redesigned fabric view allows quick access to versions, profiles and containers, mass-assignment/removal of profiles to containers
* Easier management of features deployed in a profile via the "Edit Features" button.
* Several properties now editable on container detail view such as local/public IP and hostname
* General
* Secured embedded jolokia, performs authentication/authorization via JAAS
* New login page
* Redesigned help pages
* Tons more stuff we probably forgot to list here but is mentioned in [the issues](https://github.com/hawtio/hawtio/issues?milestone=4&state=closed) :)
* Fixes [these 407 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=4&state=closed)
#### 1.1
* Added the following new plugins:
* [forms](https://github.com/hawtio/hawtio/blob/master/hawtio-web/src/main/webapp/app/forms/doc/developer.md) a developer plugin for automatically creating tables and forms from json-schema models
* [infinispan](http://hawt.io/plugins/infinispan/) for viewing metrics for your Infinispan caches or using the CLI to query or update them
* [jclouds](http://hawt.io/plugins/jclouds/) to help make your cloud hawt
* [maven](http://hawt.io/plugins/maven/) to let you search maven repositories, find versions, view source or javadoc
* [tree](https://github.com/hawtio/hawtio/blob/master/hawtio-web/src/main/webapp/app/tree/doc/developer.md) a developer plugin to make it easier to work with trees
* Added a new real time Camel profile view and the first version of a web based wiki based camel editor along with improvements to the diagram rendering
* Added more flexible documentation system so that plugins are now self documenting for users and developers
* Fixes [these 80 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=2&state=closed)
#### 1.0
* First main release of hawtio with [lots of hawt plugins](http://hawt.io/plugins/index.html).
* Fixes [these 74 issues and enhancements](https://github.com/hawtio/hawtio/issues?milestone=1&state=closed)
#### In Progress
We love contributions! We really need your help to make [hawtio](http://hawt.io/) even more hawt, so please [join our community](http://hawt.io/community/index.html)!
Many thanks to all of our [existing contributors](https://github.com/hawtio/hawtio/graphs/contributors)! But we're greedy, we want more! hawtio is _hawt_, but it can be _hawter_! :). We have [lots of plugins](http://hawt.io/plugins/index.html) but they can be improved and we want more plugins!
Here's some notes to help you get started:
## Getting Started
* Make sure you have a [GitHub account](https://github.com/signup/free) as you'll need it to submit issues, comments or pull requests.
* Got any ideas for how we can improve hawtio? Please [submit an issue](https://github.com/hawtio/hawtio/issues?state=open) with your thoughts. Constructive criticism is always greatly appreciated!
* Fancy submitting [any nice screenshots of how you're using hawtio?](https://github.com/hawtio/hawtio/tree/master/website/src/images/screenshots) A quick Youtube screencast would be even _hawter_ or a blog post/article we can link to? Just [submit an issue](https://github.com/hawtio/hawtio/issues?state=open) (or fork and patch the [website](https://github.com/hawtio/hawtio/tree/master/website/src/) or any Markdown docs in our repository directly) and we'll merge it into our website.
* Fancy submitting your cool new dashboard configuration or some wiki docs? See below on how to do that...
* Search [our issue tracker](https://github.com/hawtio/hawtio/issues?state=open) and see if there's been any ideas or issues reported for what you had in mind; if so please join the conversation in the comments.
* Submit any issues, feature requests or improvement ideas [our issue tracker](https://github.com/hawtio/hawtio/issues?state=open).
* Clearly describe the issue including steps to reproduce when it is a bug.
* Make sure you fill in the earliest version that you know has the issue.
### Fancy hacking some code?
* If you fancy working on some code, check out the these lists of issues:
* [open apprentice tasks](https://github.com/hawtio/hawtio/issues?labels=apprentice+tasks&page=1&sort=updated&state=open) - which are moderately easy to fix and tend to have links to which bits of the code to look at to fix it or
* [all open issues](https://github.com/hawtio/hawtio/issues?state=open) if you fancy being more adventurous.
* [hawt ideas](https://github.com/hawtio/hawtio/issues?labels=hawt+ideas&page=1&sort=updated&state=open) if you're feeling like a ninja and fancy tackling our harder issues that tend to add really _hawt_ new features!
* To make code changes, fork the repository on GitHub then you can hack on the code. We love any contribution such as:
* fixing typos
* improving the documentation or embedded help
* writing new test cases or improve existing ones
* adding new features
* improving the layout / design / CSS
* creating a new [plugin](http://hawt.io/plugins/index.html)
## Submitting changes to hawtio
* Push your changes to your fork of the [hawtio repository](https://github.com/hawtio/hawtio).
* Submit a pull request to the repository in the **hawtio** organization.
* If your change references an existing [issue](https://github.com/hawtio/hawtio/issues?state=open) then use "fixes #123" in the commit message (using the correct issue number ;).
## Submitting changes dashboard and wiki content
Hawtio uses the [hawtio-config repository](https://github.com/hawtio/hawtio-config) to host its runtime configuration. When you startup hawtio by default it will clone this repository to the configuration directory (see the [configuration document](https://github.com/hawtio/hawtio/blob/master/docs/Configuration.md) or more detail).
In development mode if you are running hawtio via the **hawtio-web** directory, then your local clone of the [hawtio-config repository](https://github.com/hawtio/hawtio-config) will be in the **hawtio/hawtio-web/hawtio-config directory**. If you've added some cool new dashboard or editted any files via the hawtio user interface then your changes will be committed locally in this directory.
If you are a committer and want to submit any changes back just type:
cd hawtio-config
git push
Otherwise if you want to submit pull requests for your new dashboard or wiki content then fork the [hawtio-config repository](https://github.com/hawtio/hawtio-config) then update your hawtio-config directory to point to this directory. e.g. edit the hawtio-config/.git/config file to point to your forked repository.
Now perform a git push as above and then submit a pull request on your forked repo.
# Additional Resources
* [hawtio FAQ](http://hawt.io/faq/index.html)
* [General GitHub documentation](http://help.github.com/)
* [GitHub create pull request documentation](hhttps://help.github.com/articles/creating-a-pull-request)
* [Here is how to build the code](http://hawt.io/building/index.html)
* [More information for developers in terms of hawtio technologies, tools and code walkthroughs](http://hawt.io/developers/index.html)
* [join the hawtio community](http://hawt.io/community/index.html)
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment