[rhmessaging-commits] rhmessaging commits: r3171 - mgmt/trunk/wooly/python/wooly.

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Wed Mar 18 17:17:16 EDT 2009


Author: justi9
Date: 2009-03-18 17:17:16 -0400 (Wed, 18 Mar 2009)
New Revision: 3171

Modified:
   mgmt/trunk/wooly/python/wooly/__init__.py
   mgmt/trunk/wooly/python/wooly/forms.py
   mgmt/trunk/wooly/python/wooly/pages.py
Log:
Make Page rather than Application responsible for keeping global
widget and parameter state.

Introduce WidgetPage, to encapsulate frame-based state preservation.
This way we don't have things like CssPage thinking about that.

Add methods on Page to pass control during widget and parameter
initialization back to the page.



Modified: mgmt/trunk/wooly/python/wooly/__init__.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/__init__.py	2009-03-18 18:45:18 UTC (rev 3170)
+++ mgmt/trunk/wooly/python/wooly/__init__.py	2009-03-18 21:17:16 UTC (rev 3171)
@@ -22,7 +22,9 @@
         self.path = None
 
     def init(self):
-        if self.widget.path:
+        #print "Initializing %s" % str(self)
+
+        if self.widget and self.widget.path:
             self.path = ".".join((self.widget.path, self.name))
         else:
             self.path = self.name
@@ -64,8 +66,11 @@
         self.is_collection = False
         self.is_dictionary = False
 
-        app.add_parameter(self)
+    def init(self):
+        super(Parameter, self).init()
 
+        self.widget.page.init_parameter(self)
+
     def marshal(self, object):
         if object == None:
             string = ""
@@ -107,14 +112,6 @@
 
         self.__main_tmpl = Template(self, "html")
 
-        app.add_widget(self)
-
-        # XXX eliminate this
-        for cls in self.__class__.__mro__:
-            app.add_widget_class(cls)
-            if cls is Widget:
-                break
-
     def init(self):
         #print "Initializing %s" % str(self)
 
@@ -138,11 +135,12 @@
         pelems.append(self.name)
         self.path = ".".join(pelems[1:])
 
-        assert isinstance(self.ancestors[-1], Page)
         self.page = self.ancestors[-1]
 
-        self.page.widgets_by_path[self.path] = self
+        assert isinstance(self.page, Page)
 
+        self.page.init_widget(self)
+
         self.sealed = True
 
         self.init_children()
@@ -315,17 +313,15 @@
     def __init__(self, app, name):
         super(Page, self).__init__(app, name)
 
+        self.page_widgets = list()
+        self.page_widgets_by_path = dict()
+
+        self.page_parameters = list()
+        self.page_parameters_by_path = dict()
+
         self.redirect = Attribute(app, "redirect")
         self.add_attribute(self.redirect)
 
-        self.current_frame = self.FrameParameter(app, "frame")
-        self.add_parameter(self.current_frame)
-        self.set_default_frame(self)
-
-        self.widgets_by_path = dict()
-
-        self.__saved_params = dict()
-
         self.agent = Attribute(app, "agent")
         self.add_attribute(self.agent)
 
@@ -338,13 +334,38 @@
         self.page = self
         self.frame = self
 
+        self.init_children()
+
         self.sealed = True
 
-        self.init_children()
+    def init_widget(self, widget):
+        assert not self.sealed
+        assert isinstance(widget, Widget)
 
-    def render_id(self, session, *args):
-        return self.name
+        self.page_widgets.append(widget)
+        self.page_widgets_by_path[widget.path] = widget
 
+    def init_parameter(self, param):
+        assert not self.sealed
+        assert isinstance(param, Parameter)
+
+        self.page_parameters.append(param)
+        self.page_parameters_by_path[param.path] = param
+
+    def get_page_parameter_by_path(self, path):
+        param = self.page_parameters_by_path.get(path)
+
+        # check for partial match for dictparameters
+        if not param:
+            if DictParameter.sep() in path:
+                dict_key = key.split(DictParameter.sep(), 1)[0]
+                param = self.page_parameters_by_path.get(dict_key)
+
+        return param
+
+    def get_page_parameters(self, session):
+        return self.page_parameters
+
     def get_last_modified(self, session):
         return datetime.utcnow()
 
@@ -378,54 +399,12 @@
     def get_redirect_url(self, session):
         return self.redirect.get(session)
 
-    # XXX take "current" out of these
-    def set_current_frame(self, session, frame):
-        self.current_frame.set(session, frame)
-        return frame
-
-    def get_current_frame(self, session):
-        return self.current_frame.get(session)
-
-    def pop_current_frame(self, session):
-        frame = self.get_current_frame(session)
-        #print "Popping current frame", frame
-        self.set_current_frame(session, frame.frame)
-
     def set_agent(self, session, agent):
         self.agent.set(session, agent)
 
-    def set_default_frame(self, frame):
-        self.current_frame.default = frame
+    def render_id(self, session, *args):
+        return self.name
 
-    def get_saved_parameters(self, session):
-        """
-        Gets a list of parameters saved for this page and its current
-        frame.
-
-        This, combined with [gs]et_current_frame, serves to discard
-        state that is out of scope.  The current pattern is to
-        preserve the state of parameters in the current frame and all
-        of its ancestor frames.
-        """
-
-        frame = self.get_current_frame(session)
-
-        try:
-            params = self.__saved_params[frame]
-        except KeyError:
-            params = list()
-            self.save_parameters(session, params)
-            self.__saved_params[frame] = params
-
-        return params
-
-    class FrameParameter(Parameter):
-        def do_marshal(self, frame):
-            return frame.path
-
-        def do_unmarshal(self, path):
-            return self.app.get_widget(path)
-
 from parameters import DictParameter
 
 class Application(object):
@@ -433,14 +412,6 @@
         self.pages = dict()
         self.default_page = None
 
-        self.widgets = list()
-        self.widget_index = None
-
-        self.widget_classes = set()
-
-        self.parameters = list()
-        self.parameter_index = None
-
         self.finder = ResourceFinder()
 
         self.debug = None
@@ -464,57 +435,12 @@
 
         self.pages[page.name] = page
 
+        # XXX I don't think this should be triggered here
         page.init()
 
     def set_default_page(self, page):
         self.pages[""] = page
 
-    def add_widget(self, widget):
-        if self.widget_index:
-            raise Exception()
-
-        self.widgets.append(widget)
-
-    def add_widget_class(self, cls):
-        self.widget_classes.add(cls)
-
-    def get_widget(self, key):
-        if not self.widget_index:
-            index = dict()
-
-            for widget in self.widgets:
-                index[widget.path] = widget
-
-            self.widget_index = index
-
-        return self.widget_index.get(key)
-
-    def add_parameter(self, param):
-        if self.parameter_index:
-            raise Exception()
-
-        self.parameters.append(param)
-
-    def get_parameter(self, page, key):
-        if not self.parameter_index:
-            index = dict()
-
-            for param in self.parameters:
-                if param.widget:
-                    index[(param.widget.page, param.path)] = param
-
-            self.parameter_index = index
-
-        param = self.parameter_index.get((page, key))
-
-        # check for partial match for dictparameters
-        if not param:
-            if DictParameter.sep() in key:
-                dict_key = key.split(DictParameter.sep(), 1)[0]
-                param = self.parameter_index.get((page, dict_key))
-
-        return param
-
     def add_resource_dir(self, dir):
         self.finder.add_dir(dir)
 
@@ -627,7 +553,7 @@
         return url
 
     def marshal_url_vars(self, separator=";"):
-        params = self.page.get_saved_parameters(self)
+        params = self.page.get_page_parameters(self)
         vars = list()
 
         for param in params:
@@ -694,7 +620,7 @@
                 key = unquote(skey)
                 value = unquote_plus(svalue)
 
-                param = self.app.get_parameter(self.page, key)
+                param = self.page.get_page_parameter_by_path(key)
 
                 if param:
                     if param.is_dictionary:

Modified: mgmt/trunk/wooly/python/wooly/forms.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/forms.py	2009-03-18 18:45:18 UTC (rev 3170)
+++ mgmt/trunk/wooly/python/wooly/forms.py	2009-03-18 21:17:16 UTC (rev 3171)
@@ -36,7 +36,7 @@
         if not self.origin.get(session):
             self.origin.set(session, session.get_origin())
 
-        params = set(session.page.get_saved_parameters(session))
+        params = set(session.page.get_page_parameters(session))
         params.difference_update(self.form_params)
 
         for param in params:

Modified: mgmt/trunk/wooly/python/wooly/pages.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/pages.py	2009-03-18 18:45:18 UTC (rev 3170)
+++ mgmt/trunk/wooly/python/wooly/pages.py	2009-03-18 21:17:16 UTC (rev 3171)
@@ -6,8 +6,75 @@
 
 strings = StringCatalog(__file__)
 
-class HtmlPage(Page):
+class WidgetPage(Page):
     def __init__(self, app, name):
+        super(WidgetPage, self).__init__(app, name)
+
+        self.widget_classes = set()
+
+        self.__frame = self.FrameParameter(app, "frame")
+        self.add_parameter(self.__frame)
+
+        self.set_default_frame(self)
+
+        self.__saved_params = dict()
+
+    def init_widget(self, widget):
+        super(WidgetPage, self).init_widget(widget)
+
+        for cls in widget.__class__.__mro__:
+            self.widget_classes.add(cls)
+
+            if cls is Widget:
+                break
+
+    # XXX take "current" out of these
+    def set_current_frame(self, session, frame):
+        self.__frame.set(session, frame)
+        return frame
+
+    def get_current_frame(self, session):
+        return self.__frame.get(session)
+
+    def pop_current_frame(self, session):
+        frame = self.get_current_frame(session)
+        #print "Popping current frame", frame
+        self.set_current_frame(session, frame.frame)
+
+    def set_default_frame(self, frame):
+        self.__frame.default = frame
+
+    def get_page_parameters(self, session):
+        """
+        Gets a list of parameters saved for this page and its current
+        frame.
+
+        This, combined with [gs]et_current_frame, serves to discard
+        state that is out of scope.  The current pattern is to
+        preserve the state of parameters in the current frame and all
+        of its ancestor frames.
+        """
+
+        frame = self.get_current_frame(session)
+
+        try:
+            params = self.__saved_params[frame]
+        except KeyError:
+            params = list()
+            self.save_parameters(session, params)
+            self.__saved_params[frame] = params
+
+        return params
+
+    class FrameParameter(Parameter):
+        def do_marshal(self, frame):
+            return frame.path
+
+        def do_unmarshal(self, path):
+            return self.widget.page.page_widgets_by_path.get(path)
+
+class HtmlPage(WidgetPage):
+    def __init__(self, app, name):
         super(HtmlPage, self).__init__(app, name)
 
         self.updates = self.UpdatesAttribute(app, "updates")
@@ -118,7 +185,7 @@
         if not self.__css:
             writer = Writer()
 
-            for cls in sorted(self.app.widget_classes):
+            for cls in sorted(self.html_page.widget_classes):
                 strs = cls.get_module_strings()
 
                 if strs:
@@ -153,7 +220,7 @@
         if not self.__javascript:
             writer = Writer()
 
-            for cls in sorted(self.app.widget_classes):
+            for cls in sorted(self.html_page.widget_classes):
                 strs = cls.get_module_strings()
 
                 if strs:




More information about the rhmessaging-commits mailing list