Factory for creating model objects is a good idea. Allows opportunity to subclass them.
Marc Morin Emforium Group Inc. ALL-IN Software 519-772-6824 ext 201 mmo...@emforium.com ----- "Adrian Crum" <adrian.c...@yahoo.com> wrote: > Marc, > > Do you have any thoughts on the first two ideas I proposed? > > -Adrian > > --- On Sat, 5/15/10, Marc Morin <m...@emforium.com> wrote: > > > From: Marc Morin <m...@emforium.com> > > Subject: Re: Screen Widget Ideas > > To: dev@ofbiz.apache.org > > Date: Saturday, May 15, 2010, 4:11 AM > > Pure model objects with no behavior > > in them, and a visitor pattern to externalize the > > behavior.... man, that's music to my ears! > > > > We've added a visitor pattern to all the "model" objects, > > screens, forms, menus, entity,.... > > > > It has proven invaluable to enable walking and manipulating > > the model, without increasing the complexity of the > > underlying model objects. > > > > Also, as your specific example indicates, the "renderers" > > are a perfect use case for visitors, as the rendered is > > technically and interpreter of the model objects. > > > > Marc > > ----- "Adrian Crum" <adrian.c...@yahoo.com> > > wrote: > > > > > --- On Fri, 5/14/10, Scott Gray <scott.g...@hotwaxmedia.com> > > wrote: > > > > On 15/05/2010, at 3:43 PM, Adrian > > > > Crum wrote: > > > > > > > > > I've been thinking about some improvements > > to the > > > > screen widgets, and I thought I would offer some > > ideas and > > > > see if there is any interest. I'm kind of > > thinking out loud > > > > here, so the ideas are not fully developed. > > Please comment > > > > or add your suggestions. > > > > > > > > > > 1. Use the factory pattern to create model > > widgets. > > > > Right now model widget construction is handled > > internally > > > > with a pre-defined set of classes. The idea is to > > move the > > > > model widget creation to a factory method that > > accepts a > > > > candidate XML element. If a matching model widget > > is found, > > > > return it, otherwise throw an exception. The > > factory > > > > supports user-created model widgets, so the > > screen widgets > > > > are extensible. In other words, you can create > > your own > > > > model widgets, register them with the factory, > > and the > > > > screen renderer will use them just like any other > > widget. > > > > You could even create your own replacement > > implentations of > > > > existing OFBiz screen widgets. User-created > > widgets can use > > > > namespaces on the XML side to avoid XML parsing > > errors. > > > > > > > > That's crazy, I've been looking into this > > today. I > > > > had figured on using an include-widget tag. > > > > I was also thinking about the PITA way that we > > pass widget > > > > renderers around and wondering if we couldn't > > just have a > > > > render method on the model that takes a writer, > > the context > > > > and a content type. The model then has an > > internal > > > > factory that gets the configured renderer based > > on the > > > > content type. > > > > > > At least we're basically on the same page. My > > perspective all along is > > > that the screen widgets should be nothing more than > > data structures in > > > memory that support the visitor pattern. Renderers > > implement the > > > visitor interface. Implementations of the visitor > > interface could be > > > anything: HTML renderers, Swing renderers, artifact > > gatherers, layout > > > managers (an intermediate form of renderer), pretty > > printers, etc. > > > > > > There is so much room for improvement, but experience > > has shown that > > > the screen widgets have become a sort of sacred cow, > > so changes like > > > that will be met with a lot of resistance. > > > > > > > > 2. Add Groovy support to the > > <include-screen> > > > > widget. If the location attribute ends with > > ".groovy" pass > > > > control to the specified Groovy script. The > > script would > > > > behave like a screen widget and it will have > > access to all > > > > model widgets - so existing widget code can still > > be used. > > > > This could help in certain cases where screen > > widgets can't > > > > fulfill a particular need. It has been suggested > > that CDATA > > > > elements be allowed in screen widgets so that > > free-form code > > > > can be inserted in widget XML - this is an > > alternative > > > > solution to that. The benefit is you can leverage > > the power > > > > of Groovy in controlling screen output. The > > drawback is any > > > > such script will break the structure of screen > > widgets and > > > > it will start to look like JSP - where data > > preparation code > > > > is mixed with presentation code. > > > > > > > > This sounds more like a custom renderer rather > > than > > > > something that should go into the model. > > > > > > It's not a custom renderer - the output is still the > > same as the > > > original view. It's just a different way of looking at > > screen > > > rendering. Instead of screen widgets calling scripts, > > a script calls > > > screen widgets. In other words, instead of > > XML-generated-widgets being > > > in charge of Groovy, Groovy is in charge of the > > XML-generated-widgets. > > > Think about it. > > > > > > -Adrian > >