[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