[rhmessaging-commits] rhmessaging commits: r3111 - in mgmt/trunk/basil: python/basil and 1 other directory.

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Mon Feb 9 17:49:51 EST 2009


Author: justi9
Date: 2009-02-09 17:49:51 -0500 (Mon, 09 Feb 2009)
New Revision: 3111

Added:
   mgmt/trunk/basil/python/basil/model.py
   mgmt/trunk/basil/python/basil/page.py
   mgmt/trunk/basil/python/basil/page.strings
   mgmt/trunk/basil/python/basil/server.py
   mgmt/trunk/basil/python/basil/widgets.py
   mgmt/trunk/basil/python/basil/widgets.strings
Modified:
   mgmt/trunk/basil/bin/basil
   mgmt/trunk/basil/python/basil/__init__.py
Log:
Initial check in of basil web

Modified: mgmt/trunk/basil/bin/basil
===================================================================
--- mgmt/trunk/basil/bin/basil	2009-02-06 16:28:59 UTC (rev 3110)
+++ mgmt/trunk/basil/bin/basil	2009-02-09 22:49:51 UTC (rev 3111)
@@ -1,43 +1,50 @@
 #!/usr/bin/env python
 
 import sys, os
-from code import InteractiveConsole
 
-from basil import *
+from basil.server import *
 
 def usage():
-    print "Usage: basil [BROKER-ADDRESS]"
+    print "Usage: basil [BROKER-HOST:BROKER-PORT]"
     print "Example: basil localhost:5672"
     sys.exit(1)
 
-def do_main(spec, host, port):
-    model = BasilModel(spec)
+def do_main(host, port):
+    app = BasilApplication()
+    server = BasilServer(app, host, port)
 
-    conn = BasilConnection(model, host, port)
-    conn.open()
+    print "Initializing"
 
-    console = InteractiveConsole(locals())
+    app.init()
+    app.start()
 
     try:
-        console.interact()
+        print "Starting web service at %s:%i" % (host, port)
+
+        try:
+            server.start()
+        finally:
+            server.stop()
     finally:
-        conn.close()
+        app.stop()
 
 def main():
     try:
         addr = sys.argv[1]
     except IndexError:
-        addr = "localhost:5672"
+        addr = "localhost:55672"
 
-    host, port = addr.split(":")
+    try:
+        host, port = addr.split(":")
+        port = int(port)
+    except:
+        print "Error: Malformed address"
+        usage()
 
-    spec = os.environ.get("AMQP_SPEC", "/usr/share/amqp/amqp.0-10.xml")
-
     try:
-        do_main(spec, host, int(port))
+        do_main(host, port)
     except KeyboardInterrupt:
         pass
 
 if __name__ == "__main__":
     main()
-    

Modified: mgmt/trunk/basil/python/basil/__init__.py
===================================================================
--- mgmt/trunk/basil/python/basil/__init__.py	2009-02-06 16:28:59 UTC (rev 3110)
+++ mgmt/trunk/basil/python/basil/__init__.py	2009-02-09 22:49:51 UTC (rev 3111)
@@ -8,7 +8,7 @@
 
 from util import *
 
-class BasilModel(object):
+class OldBasilModel(object):
     def __init__(self, spec_path):
         self.spec = qpid.spec.load(spec_path)
 

Added: mgmt/trunk/basil/python/basil/model.py
===================================================================
--- mgmt/trunk/basil/python/basil/model.py	                        (rev 0)
+++ mgmt/trunk/basil/python/basil/model.py	2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,85 @@
+from qmf.console import *
+from threading import Lock
+
+class BasilModel(object):
+    def __init__(self):
+        super(BasilModel, self).__init__()
+
+        self.broker_urls = set()
+
+        self.console = BasilConsole(self)
+        self.session = Session(self.console, manageConnections=True)
+
+        self.lock = Lock()
+
+        self.packages = set()
+        self.classes_by_package = dict()
+        self.objects_by_class = dict()
+        self.objects_by_id = dict()
+        self.stats_by_id = dict()
+
+    def add_broker_url(self, url):
+        self.broker_urls.add(url)
+
+    def init(self):
+        pass
+
+    def start(self):
+        for url in self.broker_urls:
+            self.session.addBroker(url)
+
+    def stop(self):
+        # XXX hack necessary for shutdown; bug rafi
+
+        for url in self.broker_urls:
+            self.session.delBroker(url)
+
+    def __repr__(self):
+        return "%s(%s)" % (self.__class__.__name__, self.session)
+
+class BasilConsole(Console):
+    def __init__(self, model):
+        #Console.__init__(self)
+        #super(BasilConsole, self).__init__()
+
+        self.model = model
+
+    def newPackage(self, name):
+        self.model.lock.acquire()
+
+        try:
+            self.model.packages.add(name)
+        finally:
+            self.model.lock.release()
+
+    def newClass(self, kind, classKey):
+        self.model.lock.acquire()
+
+        try:
+            pkgid = classKey.getPackageName()
+            classes = self.model.classes_by_package.setdefault(pkgid, dict())
+            classes[classKey.getHashString()] = classKey
+        finally:
+            self.model.lock.release()
+
+    def objectProps(self, broker, object):
+        self.model.lock.acquire()
+
+        try:
+            clsid = object.getClassKey().getHashString()
+            objects = self.model.objects_by_class.setdefault(clsid, dict())
+            objects[str(object.getObjectId())] = object
+
+            self.model.objects_by_id[str(object.getObjectId())] = object
+        finally:
+            self.model.lock.release()
+
+    def objectStats(self, broker, object):
+        self.model.lock.acquire()
+
+        try:
+            objid = str(object.getObjectId())
+            stats = self.model.stats_by_id.setdefault(objid, list())
+            stats.append(object)
+        finally:
+            self.model.lock.release()

Added: mgmt/trunk/basil/python/basil/page.py
===================================================================
--- mgmt/trunk/basil/python/basil/page.py	                        (rev 0)
+++ mgmt/trunk/basil/python/basil/page.py	2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,182 @@
+import struct
+
+from wooly import *
+from wooly.tables import *
+from wooly.resources import *
+
+from widgets import *
+
+strings = StringCatalog(__file__)
+
+class BasilPage(Page):
+    def __init__(self, app, page):
+        super(BasilPage, self).__init__(app, page)
+
+        self.main = MainView(app, "main")
+        self.add_child(self.main)
+
+    def render_title(self, session):
+        return "Basil"
+
+class MainView(Widget):
+    def __init__(self, app, name):
+        super(MainView, self).__init__(app, name)
+
+        self.tabs = TabbedModeSet(app, "tabs")
+        self.add_child(self.tabs)
+
+        objects = ObjectBrowser(app, "objects")
+        self.tabs.add_tab(objects)
+
+class ObjectBrowser(Widget):
+    def __init__(self, app, name):
+        super(ObjectBrowser, self).__init__(app, name)
+
+        self.pkgid = Parameter(app, "package")
+        self.add_parameter(self.pkgid)
+
+        self.clsid = Parameter(app, "class")
+        self.add_parameter(self.clsid)
+
+        self.objid = Parameter(app, "object")
+        self.add_parameter(self.objid)
+
+        packages = PackageSet(app, "packages", self.pkgid)
+        self.add_child(packages)
+
+        classes = ClassSet(app, "classes", self.pkgid, self.clsid)
+        self.add_child(classes)
+
+        objects = ObjectSet(app, "objects", self.clsid, self.objid)
+        self.add_child(objects)
+
+        view = ObjectView(app, "view", self.objid)
+        self.add_child(view)
+
+    def render_title(self, session):
+        return "Objects"
+
+class PackageSet(ItemTable):
+    def __init__(self, app, name, pkgid):
+        super(PackageSet, self).__init__(app, name)
+
+        self.pkgid = pkgid
+        
+        col = self.NameColumn(app, "name", self.pkgid)
+        self.add_column(col)
+
+    def do_get_items(self, session):
+        return sorted(self.app.model.packages)
+
+    def render_title(self, session):
+        return "Packages"
+
+    class NameColumn(SelectableNameColumn):
+        def get_id(self, name):
+            return name
+
+class ClassSet(ItemTable):
+    def __init__(self, app, name, pkgid, clsid):
+        super(ClassSet, self).__init__(app, name)
+
+        self.pkgid = pkgid
+        self.clsid = clsid
+
+        col = self.NameColumn(app, "name", self.clsid)
+        self.add_column(col)
+
+    def do_get_items(self, session):
+        package = self.pkgid.get(session)
+
+        if package:
+            classes = self.app.model.classes_by_package[package].values()
+            return sorted(classes)
+
+    def render_title(self, session):
+        return "Classes"
+
+    class NameColumn(SelectableNameColumn):
+        def get_id(self, clacc):
+            return clacc.getHashString()
+
+        def get_name(self, clacc):
+            name = clacc.getClassName()
+            hash = "%08x" % struct.unpack("!L", clacc.getHash()[:4])
+            return "%s (%s)" % (name, hash)
+
+class ObjectSet(ItemTable):
+    def __init__(self, app, name, clsid, objid):
+        super(ObjectSet, self).__init__(app, name)
+
+        self.clsid = clsid
+        self.objid = objid
+
+        col = self.NameColumn(app, "name", self.objid)
+        self.add_column(col)
+
+    def do_get_items(self, session):
+        clsid = self.clsid.get(session)
+
+        if clsid:
+            objects = self.app.model.objects_by_class.get(clsid)
+
+            if objects:
+                return sorted(objects.values())
+
+    def render_title(self, session):
+        return "Classes"
+
+    class NameColumn(SelectableNameColumn):
+        def get_id(self, object):
+            return str(object.getObjectId())
+
+        def get_name(self, object):
+            return object.getIndex()
+
+#            if hasattr(object, "name"):
+#                return getattr(object, "name")
+#            else:
+#                return self.get_id(object)
+            #return getattr(object, "name", self.get_id(object)) # XXX use this
+
+class ObjectView(Widget):
+    def __init__(self, app, name, objid):
+        super(ObjectView, self).__init__(app, name)
+
+        self.objid = objid
+
+        self.props = ObjectProperties(app, "props", self.objid)
+        self.add_child(self.props)
+
+        self.stats = ObjectStatistics(app, "stats", self.objid)
+        self.add_child(self.stats)
+
+class BaseObjectProperties(PropertySet):
+    def __init__(self, app, name, objid):
+        super(BaseObjectProperties, self).__init__(app, name)
+
+        self.objid = objid
+
+    def do_get_items(self, session):
+        id = self.objid.get(session)
+        obj = self.app.model.objects_by_id.get(id)
+
+        if obj:
+            return self.get_properties(obj)
+
+    def get_properties(self, object):
+        return object.getProperties()
+
+    def get_item_name(self, item):
+        return str(item[0])
+
+    def get_item_value(self, item):
+        return str(item[1])
+
+class ObjectProperties(BaseObjectProperties):
+    def get_properties(self, object):
+        return object.getProperties()
+
+class ObjectStatistics(BaseObjectProperties):
+    def get_properties(self, object):
+        return object.getStatistics()

Added: mgmt/trunk/basil/python/basil/page.strings
===================================================================
--- mgmt/trunk/basil/python/basil/page.strings	                        (rev 0)
+++ mgmt/trunk/basil/python/basil/page.strings	2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,59 @@
+[BasilPage.css]
+a {
+  text-decoration: none;
+  color: blue;
+}
+
+a.selected {
+  color: black;
+  background-color: #ff6;
+}
+
+[BasilPage.html]
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+  <head>
+    <title>{title}</title>
+    <link rel="stylesheet" type="text/css" href="index.css"/>
+  </head>
+  <body>
+    {content}
+  </body>
+</html>
+
+[ObjectBrowser.css]
+table.ObjectBrowser tr td {
+  vertical-align: top;
+}
+
+table.ObjectBrowser tr td.view {
+  width: 50%;
+}
+
+[ObjectBrowser.html]
+<table class="ObjectBrowser">
+  <tr>
+    <td>{packages}</td>
+    <td>{classes}</td>
+    <td>{objects}</td>
+    <td class="view">{view}</td>
+  </tr>
+</table>
+
+[ObjectView.html]
+{prev_link} {next_link}
+
+<h2>{name}</h2>
+
+<h3>Agent</h3>
+
+<h3>Timestamps</h3>
+
+<h3>Properties</h3>
+
+{props}
+
+<h3>Statistics</h3>
+
+{stats}

Added: mgmt/trunk/basil/python/basil/server.py
===================================================================
--- mgmt/trunk/basil/python/basil/server.py	                        (rev 0)
+++ mgmt/trunk/basil/python/basil/server.py	2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,37 @@
+from qmf.console import *
+from wooly import Application
+from wooly.server import WebServer
+from wooly.pages import CssPage
+
+from model import BasilModel
+from page import BasilPage
+
+class BasilServer(WebServer):
+    def authorized(self, session):
+        return True
+
+class BasilApplication(Application):
+    def __init__(self):
+        super(BasilApplication, self).__init__()
+
+        self.model = BasilModel()
+        self.model.add_broker_url("amqp://north-15.lab.bos.redhat.com")
+
+        self.main_page = BasilPage(self, "index.html")
+
+        self.add_page(self.main_page)
+        self.set_default_page(self.main_page)
+
+        page = CssPage(self, "index.css")
+        self.add_page(page)
+
+        self.enable_debug()
+
+    def init(self):
+        self.model.init()
+
+    def start(self):
+        self.model.start()
+
+    def stop(self):
+        self.model.stop()

Added: mgmt/trunk/basil/python/basil/widgets.py
===================================================================
--- mgmt/trunk/basil/python/basil/widgets.py	                        (rev 0)
+++ mgmt/trunk/basil/python/basil/widgets.py	2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,61 @@
+from xml.sax.saxutils import escape
+from wooly import *
+from wooly.tables import *
+from wooly.resources import *
+
+strings = StringCatalog(__file__)
+
+class SelectableNameColumn(ItemTableColumn):
+    def __init__(self, app, name, param):
+        super(SelectableNameColumn, self).__init__(app, name)
+
+        self.param = param
+
+    def render_content(self, session, object):
+        id = self.get_id(object)
+        name = self.get_name(object)
+
+        selected = self.param.get(session) == id
+        class_attr = selected and "class=\"selected\"" or ""
+
+        branch = session.branch()
+        self.param.set(branch, id)
+
+        return "<a %s href=\"%s\">%s</a>" % \
+            (class_attr, branch.marshal(), name)
+
+    def get_id(self, object):
+        return object.id
+
+    def get_name(self, object):
+        return self.get_id(object)
+
+class PropertySet(ItemTable):
+    def __init__(self, app, name):
+        super(PropertySet, self).__init__(app, name)
+
+        self.name_column = self.NameColumn(app, "name")
+        self.add_column(self.name_column)
+
+        self.value_column = self.ValueColumn(app, "value")
+        self.add_column(self.value_column)
+
+    def get_item_name(self, item):
+        pass
+
+    def get_item_value(self, item):
+        pass
+
+    class NameColumn(ItemTableColumn):
+        def render_title(self, session, item):
+            return "Name"
+
+        def render_content(self, session, item):
+            return escape(self.parent.get_item_name(item))
+
+    class ValueColumn(ItemTableColumn):
+        def render_title(self, session, item):
+            return "Value"
+
+        def render_content(self, session, item):
+            return escape(self.parent.get_item_value(item))

Added: mgmt/trunk/basil/python/basil/widgets.strings
===================================================================




More information about the rhmessaging-commits mailing list