[rhmessaging-commits] rhmessaging commits: r2224 - mgmt/trunk/cumin/python/cumin.
rhmessaging-commits at lists.jboss.org
rhmessaging-commits at lists.jboss.org
Fri Jul 25 15:35:19 EDT 2008
Author: eallen
Date: 2008-07-25 15:35:19 -0400 (Fri, 25 Jul 2008)
New Revision: 2224
Modified:
mgmt/trunk/cumin/python/cumin/queue.py
mgmt/trunk/cumin/python/cumin/queue.strings
Log:
Added Queue Add and Remove
Modified: mgmt/trunk/cumin/python/cumin/queue.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.py 2008-07-25 19:34:31 UTC (rev 2223)
+++ mgmt/trunk/cumin/python/cumin/queue.py 2008-07-25 19:35:19 UTC (rev 2224)
@@ -60,6 +60,14 @@
self.__purge = self.Purge(app, "purge", self)
self.add_child(self.__purge)
+ self.__remove = self.Remove(app, "remove", self)
+ self.add_child(self.__remove)
+
+ def render_add_queue_url(self, session, vhost):
+ branch = session.branch()
+ self.frame.show_queue_add(branch)
+ return branch.marshal()
+
def get_args(self, session):
reg = self.frame.get_object(session)
return (reg.getDefaultVhost(),)
@@ -88,7 +96,21 @@
def render_content(self, session):
return "Purge"
+
+ class Remove(FormButton):
+ def process_submit(self, session):
+ ids = self.parent.ids.get(session)
+ self.parent.ids.clear(session)
+ branch = session.branch()
+ frame = self.frame.show_queues_remove(branch)
+ frame.ids.set(branch, ids)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def render_content(self, session):
+ return "Remove"
+
+
class NameColumn(SqlTableColumn):
def render_title(self, session, data):
return "Name"
@@ -180,6 +202,10 @@
self.purge = QueuePurge(app, "purge")
self.add_mode(self.purge)
+ remove = QueueRemove(app, "remove")
+ self.add_mode(remove)
+ self.set_remove_mode(remove)
+
def show_purge(self, session):
return self.show_mode(session, self.purge)
@@ -282,13 +308,122 @@
self.durable = DurabilityField(app, "durable", self)
self.add_field(self.durable)
+
+ self.exclusive = ExclusivityField(app, "exclusive", self)
+ self.add_field(self.exclusive)
+
+ self.autodelete = AutoDeleteField(app, "autodelete", self)
+ self.add_field(self.autodelete)
+ self.bindings = ExchangeKeysField(app, "bindings", self)
+ self.add_field(self.bindings)
+
+
+class ExchangeKeysInput(FormInput):
+ def __init__(self, app, name, form):
+ super(ExchangeKeysInput, self).__init__(app, name, form)
+
+ self.name_param = Parameter(app, "name_param");
+ self.add_parameter(self.name_param)
+ form.add_form_parameter(self.name_param)
+
+ self.names = ListParameter(app, "name", self.name_param)
+ self.add_parameter(self.names)
+ form.add_form_parameter(self.names)
+
+ self.binding_param = Parameter(app, "binding_param")
+ self.add_parameter(self.binding_param)
+ form.add_form_parameter(self.binding_param)
+
+ self.bindings = ListParameter(app, "binding", self.binding_param)
+ self.add_parameter(self.bindings)
+ form.add_form_parameter(self.bindings)
+
+ self.extra_param = Parameter(app, "extra_param")
+ self.add_parameter(self.extra_param)
+ form.add_form_parameter(self.extra_param)
+
+ self.extras = ListParameter(app, "extra", self.extra_param)
+ self.add_parameter(self.extras)
+ form.add_form_parameter(self.extras)
+
+ self.exchangekey_tmpl = Template(self, "exchangekey_html")
+
+ # info to help create the <input> elements for various exchange types
+ self.binding_typemap = {"direct":{"type":"text",
+ "enable":"disabled='disabled'"},
+ "topic":{"type":"text", "enable":None},
+ "fanout":{"type":"hidden", "enable":None},
+# "headers":{"type":"text", "enable":None},
+# "xml":{"type":"hidden", "enable":None},
+ }
+ # exchange names to suppress
+ self.binding_omit_by_name = ("", "qpid.management", "amq.match")
+ self.binding_omit_by_type = ("xml", "headers")
+
+ def do_render(self, session, *args):
+ writer = Writer()
+ # get the registration from the broker frame
+ reg = self.frame.frame.get_object(session)
+ vhost = reg.getDefaultVhost()
+
+ sortedExchanges = sorted_by(vhost.exchanges)
+ # render a row for each exchange we support
+ for exchange in sortedExchanges:
+ if not exchange.name in self.binding_omit_by_name:
+ if not exchange.type in self.binding_omit_by_type:
+ self.exchangekey_tmpl.render(writer, session, exchange)
+
+ return writer.to_string()
+
+ def render_exchange_name(self, session, exchange):
+ return exchange.name
+
+ def render_exchange_fmt_name(self, session, exchange):
+ return fmt_shorten(exchange.name)
+
+ def render_exchange_path(self, session, *args):
+ return self.names.path
+
+ def render_exchange_id(self, session, exchange):
+ return exchange.id
+
+ def render_binding_path(self, session, exchange):
+ return self.bindings.path
+
+ def render_exchange_type(self, session, exchange):
+ return exchange.type
+
+ def render_binding_input_type(self, session, exchange):
+ return self.binding_typemap[exchange.type]["type"]
+
+ def render_binding_disabled(self, session, exchange):
+ return self.binding_typemap[exchange.type]["enable"]
+
+class ExchangeKeysField(FormField):
+ def __init__(self, app, name, form):
+ super(ExchangeKeysField, self).__init__(app, name, form)
+
+ self.__input = ExchangeKeysInput(app, "inputs", form)
+ self.add_child(self.__input)
+ self.inputs = self.__input
+
+ def render_title(self, session):
+ return "Exchange Bindings:"
+
+ def render_exchange_keys(self, session, *args):
+ return self.__input.render(session)
+
+ def render_exchange_path(self, session, *args):
+ return self.inputs.names.path
+
+ def render_queue_name_path(self, session, *args):
+ return self.inputs.form.namef.get_parameter().path
+
class QueueAdd(QueueForm):
def process_cancel(self, session):
branch = session.branch()
- self.page.pop_current_frame(branch)
- self.page.pop_current_frame(branch)
- self.page.get_current_frame(branch).show_view(branch)
+ self.frame.show_view(branch)
self.page.set_redirect_url(session, branch.marshal())
def process_submit(self, session):
@@ -297,20 +432,77 @@
if errors:
pass
else:
- reg = self.frame.frame.get_object(session)
+ reg = self.frame.get_object(session)
vhost = reg.getDefaultVhost()
- name = self.namef.get(session)
+ queue_name = self.namef.get(session)
durable = self.durable.get(session)
+ exclusive = self.exclusive.get(session)
+ autodelete = self.autodelete.get(session)
+ binding_names = self.bindings.inputs.names.get(session)
+ binding_keys = self.bindings.inputs.bindings.get(session)
+ #assumes a 1:1 correlation between names and keys
+ exchange_keys = dict(zip(binding_names, binding_keys))
- log.info("Adding queue '%s'" % name)
+ # sanity check: this should have been handled by the javascript
+ # on the form submit
+ for binding_name in binding_names:
+ exchange = self.__get_exchange_named(binding_name, vhost.exchanges)
+ if exchange.type == 'direct':
+ exchange_keys[exchange.name] = queue_name
+
+ args = {
+ "queue": queue_name,
+ "durable": durable,
+ "exclusive": exclusive,
+ "auto_delete": autodelete,
+ "exchange_keys": exchange_keys
+ }
+ log.info("Adding queue:\n\tname: \
+ '%s'\n\tdurablility: \
+ %s\n\texclusivity: \
+ %s\n\tlongevity: %s" % \
+ (queue_name, durable, exclusive, autodelete) )
+ action = self.app.model.queue.add
+ action.invoke(reg, args)
+
+ # navigate back to main queue frame
self.process_cancel(session)
- def render_title(self, session):
- reg = self.frame.frame.get_object(session)
- return "Add Queue to Broker '%s'" % reg.name
+ def render_title(self, session, *args):
+ reg = self.frame.get_object(session)
+ return "Add Queue to the Broker '%s'" % reg.name
+ def __get_exchange_named(self, name, exchanges):
+ for exchange in exchanges:
+ if exchange.name == name:
+ return exchange
+
+class QueueRemove(CuminConfirmForm):
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def render_title(self, session, queue):
+ return "Remove Queue '%s'" % queue.name
+
+ def process_cancel(self, session, queue):
+ branch = session.branch()
+ self.frame.show_view(branch)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def process_submit(self, session, queue):
+ action = self.app.model.queue.remove
+ action.invoke(queue)
+
+ self.process_cancel(session, queue)
+
+ def render_submit_content(self, session, queue):
+ return "Yes, Remove Queue '%s'" % queue.name
+
+ def render_cancel_content(self, session, queue):
+ return "No, Cancel"
+
class QueuePurge(CuminConfirmForm):
def get_args(self, session):
return self.frame.get_args(session)
@@ -353,6 +545,24 @@
def render_item_content(self, session, id):
return "Purge Queue '%s'" % Queue.get(id).name
+class QueueSetRemove(CuminBulkActionForm):
+ def process_return(self, session):
+ branch = session.branch()
+ self.frame.show_view(branch)
+ self.page.set_current_frame(branch, self.frame)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def process_item(self, session, id):
+ queue = Queue.get(id)
+ action = self.app.model.queue.remove
+ action.invoke(queue)
+
+ def render_title(self, session):
+ return "Remove Queues"
+
+ def render_item_content(self, session, id):
+ return "Remove Queue '%s'" % Queue.get(id).name
+
class QueueBindingAdd(CuminForm):
def __init__(self, app, name):
super(QueueBindingAdd, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/queue.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.strings 2008-07-25 19:34:31 UTC (rev 2223)
+++ mgmt/trunk/cumin/python/cumin/queue.strings 2008-07-25 19:35:19 UTC (rev 2224)
@@ -36,13 +36,16 @@
[QueueSet.html]
<form id="{id}" method="post" action="?">
+
+ <ul class="actions">
+ <li><a class="nav" href="{add_queue_url}">Add New Queue</a></li>
+ </ul>
<div class="rfloat">{phase}</div>
-
{unit}
<div class="sactions">
<h2>Act on Selected Queues:</h2>
- {purge}
+ {purge} {remove}
</div>
<table class="mobjects">
@@ -57,7 +60,7 @@
</thead>
<tbody>{items}</tbody>
</table>
- {hidden_inputs}
+ <div>{hidden_inputs}</div>
</form>
[QueueStatus.javascript]
@@ -102,7 +105,7 @@
</tr>
</table>
</div>
-<script>
+<script type="text/javascript">
cumin.objectListeners["{id}"] = updateQueueStatus
</script>
@@ -167,7 +170,7 @@
{cancel}
</div>
</form>
-<script defer="defer">
+<script type="text/javascript" defer="defer">
(function() {
var elem = wooly.doc().elembyid("{id}").node.elements[1];
elem.focus();
@@ -276,3 +279,106 @@
<td class="ralign">{item_bytes_consumed}</td>
<td class="ralign">{item_unacked_messages}</td>
</tr>
+
+[QueueAdd.css]
+td.exchange_type {
+ font-style: italic;
+}
+
+[QueueAdd.javascript]
+var direct_keys = [];
+var queue_name_field = null;
+
+function attach_submit() {
+ var theForm = document.forms[0];
+ addEvent(theForm, "submit", associate_keys);
+
+ // get list of binding key fields that are 'direct'
+ // and add a listener to echo the queue_name
+ var inputs = document.getElementsByTagName("input");
+ if (inputs) {
+ for (var i=0; i<inputs.length; i++) {
+ if (inputs[i].className.indexOf("binding_class_direct") != -1) {
+ direct_keys[direct_keys.length] = inputs[i];
+ }
+ }
+ var oQueueName = document.forms[0].elements[queue_name];
+ if (oQueueName) {
+ addEvent(oQueueName, "blur", echo_queue_name);
+ addEvent(oQueueName, "keyup", echo_queue_name);
+ queue_name_field = oQueueName;
+ }
+ }
+
+}
+// When the form is submitted, make sure we can correctly associate
+// the input boxes with the checkboxes
+function associate_keys() {
+
+ // get the list of exchange chechboxes
+ var exchanges = document.forms[0].elements[exchange_path];
+ if (exchanges) {
+ for (var i=0; i<exchanges.length; i++) {
+ var chk_value = exchanges[i].value;
+ // get the associated input box
+ var oInput = document.getElementById(chk_value);
+ if (oInput) {
+ oInput.disabled = false; // disabled inputs don't get submitted
+ // so there should be a 1:1 relationship
+ // between checked boxes and input values
+ if (!exchanges[i].checked) {
+ oInput.disabled = true;
+ oInput.value = '';
+ }
+ }
+ }
+ }
+}
+
+// echos the queue_name field into the binding key fields of type 'direct'
+function echo_queue_name() {
+ if (queue_name_field) {
+ for (var i=0; i<direct_keys.length; i++) {
+ direct_keys[i].value = queue_name_field.value;
+ }
+ }
+}
+
+[ExchangeKeysInput.exchangekey_html]
+ <tr>
+ <td><input type="checkbox"
+ id="{id}.{exchange_id}"
+ name="{exchange_path}" value="{exchange_name}" size="15"
+ tabindex="100"/></td>
+ <td><label for="{id}.{exchange_id}">{exchange_fmt_name}</label></td>
+ <td class="exchange_type">{exchange_type}</td>
+ <td><input class="binding_class_{exchange_type}"
+ type="{binding_input_type}"
+ name="{binding_path}" id="{exchange_name}"
+ value="" size="32" maxlength="256" tabindex="100" {binding_disabled}/></td>
+ </tr>
+
+[ExchangeKeysField.html]
+<div class="field">
+ <div class="title">{title}</div>
+
+<div class="inputs">
+<table class="mobjects">
+ <thead>
+ <tr>
+ <th colspan="2">Exchange Name</th>
+ <th>Exchange Type</th>
+ <th>Binding Key</th>
+ </tr>
+ </thead>
+ <tbody>
+ {exchange_keys}
+ </tbody>
+</table>
+</div>
+</div>
+<script type="text/javascript">
+ var exchange_path="{exchange_path}";
+ var queue_name="{queue_name_path}";
+ addEvent(window, 'load', attach_submit);
+</script>
More information about the rhmessaging-commits
mailing list