The current screen widget view handler creates a Writer instance and passes it to the screen renderer. That in turn passes the Writer instance to the screen's sub-widgets.

Some of the sub-widgets render to a StringBuffer first, then output the StringBuffer contents to the Writer instance. This has led to an inconsistent API in the screen widget library - some methods take a Writer argument, others take a StringBuffer argument. (Take a look at the HtmlWidgetRenderer class - two versions of each method are needed.)

One of the problems with screen widget renderers outputting to a Writer instance is when an error or exception occurs. The error message is mangled or unreadable - depending upon where in the Writer stream the error occurred. I'm sure most of the developers have seen this - where an exception is rendered inside a table element, or inside a drop-down list box, or inside a menu item, etc.

Here's my idea: Have the screen widget view handler create a StringBuilder instance and pass that to the screen renderer. All screen sub-widgets render to the StringBuilder instance. If the entire process completes without errors, then the view handler outputs the StringBuilder contents to the Writer. If an error occurs, the view handler discards the StringBuilder contents and constructs a simple page to render the error message.

The StringBuilder class should provide faster rendering, because it's not synchronized like the StringBuffer class. Synchronization is not an issue in this case.

The screen widget library API would be simplified.

What do you think?

-Adrian

Reply via email to