Yes, I agree. I was also thinking that the URLTemplateDescriptor was looking an aweful lot like a wrapper that didn't do much other than have the URLTemplatesFactory object as member data. I think that URLTemplateDescriptor could go away and we'd just have the URLTemplatesFactory (as a top-level object as you pointed out) with the TemplatedURLFormatter. I like that they are both attributes on the ServletContext
I will also add some javadoc that the default TemplatedURLFormatter needs to be implemented in a thread-safe manner so the URLRewriterService can use the same instance from the context for multiple simultaneous requests. Thanks for the help. Carlin On 6/21/05, Rich Feit <[EMAIL PROTECTED]> wrote: > Would it make sense for the TemplatedURLFormatter (seems like the > top-level thing) to live in the ServletContext? > > And (taking the collapsing further), could it be that we'd have only two > top-level objects: the TemplatedURLFormatter and the URLTemplatesFactory > (or URLTemplateFactory)? > > Rich > > Carlin Rogers wrote: > > > One other thought on this... > > > > To avoid adding code with knowledge of ConfigUtils and > > beehive-netui-config.xml into the URLRewriterService, I > > think the per-webapp, TemplatedURLFormatter should also > > be available from the ServletContext. > > > > So, whatever object is put as an attribute of the context, > > we should be able to get a template (via the factory) > > and the class name of a TemplatedURLFormatter. > > > > Just wanted to mention this in case it had impact on decisions > > about collapsing classes together and the functions of > > the object we set as an attribute of the context. > > > > Carlin > > > > Carlin Rogers wrote: > > > >> Hi Rich, > >> > >> Thanks for the feedback. Yes, your summary below is mostly > >> accurate. One comment... > >> > >> > URLTemplates: a set of URLTemplates. URLTemplateDescriptor > >> > keeps a single copy of this. > >> > >> Yes, at the moment. However, the proposed change is for the > >> URLTemplatesFactory to always return a URLTemplate and that > >> URLTemplateDescriptor would not have a copy of URLTemplates. > >> That way, a container-specific factory implementation > >> could support features like runtime reload of the file > >> if required. > >> > >> So, your observation about combining makes some sense. There's > >> no real need for the URLTemplates object if the > >> URLTemplateDescriptor no longer hangs onto a URLTemplates, > >> just goes to the URLTemplatesFactory. > >> > >> The URLTemplateDescriptor would be the object set as the > >> attribute of the context. > >> > >> Maybe there is more room for collapsing the classes together. > >> > >> Thanks, > >> Carlin > >> > >> > >> Rich Feit wrote: > >> > >>> Hi Carlin, > >>> > >>> This sounds good to me, but first I'd just like to clarify all the > >>> moving pieces here. This is what I (think I) understand: > >>> > >>> TemplatedURLFormatter: the code that is called by URLRewriterService > >>> to apply any relevant templates to a URL, after all other rewriting > >>> has been done on the URL. There is a default implementation of > >>> this, and it can also be overridden in one of two ways: > >>> 1) per-webapp, in beehive-netui-config.xml (with a class name) > >>> 2) per-request, if during a particular request, a certain > >>> implementation should be used. > >>> > >>> URLTemplateDescriptor: a single webapp-scoped instance that the > >>> TemplatedURLFormatter uses to look up URL templates. > >>> > >>> URLTemplate: a single URL template that can be applied to a URL. > >>> > >>> URLTemplates: a set of URLTemplates. URLTemplateDescriptor keeps a > >>> single copy of this. > >>> > >>> URLTemplatesFactory: the factory that provides the URLTemplates to > >>> URLTemplateDescriptor. There is a default implementation, but it > >>> can be overridden per-container through ServletContainerAdapter. > >>> This would allow a container-specific implementation to read from > >>> something other than the standard XML file. > >>> > >>> First, is that correct? Second, it looks like URLTemplateDescriptor > >>> and URLTemplates could be combined (i.e., there could be a single > >>> URLTemplates object kept in the ServletContext, in place of > >>> URLTemplateDescriptor. Would this make sense, or should there > >>> really be some distinction between the two? > >>> > >>> Thanks, > >>> Rich > >>> > >>> Carlin Rogers wrote: > >>> > >>>> I have some changes I'd like to propose for the > >>>> beehive-url-template-config.xml support and the use of a > >>>> default TemplatedURLFormatter class. I'm interested > >>>> in providing a hook for container specific ways to > >>>> read/load the URL templates config file and web app > >>>> specific default formatting behavior. > >>>> > >>>> When loading the templates at start up time, a container > >>>> specific URLTemplatesFactory could handle reading/parsing > >>>> the template config file. This could allow for support > >>>> of deployment plans, etc. > >>>> > >>>> Rather than have the URLTemplateDescriptor pass a parser to the > >>>> URLTemplatesFactory and have a one time > >>>> call to the Factory to get the URLTemplates, I'd like the factory > >>>> itself be passed to the URLTemplateDescriptor > >>>> and always be called for the templates. The factory > >>>> really is what manages/returns the URLTemplates. > >>>> > >>>> The ServletContainerAdapter interface would have a > >>>> method to get the container specific URLTemplatesFactory. > >>>> During the Servlet.init() process we would get the factory > >>>> and pass it into the URLTemplatesFactory. > >>>> To support the various ways a factory may manage the > >>>> templates, we should make URLTemplates an abstract class, > >>>> with abstract methods getTemplate() and getTemplateNameByRef(). > >>>> > >>>> The Factory implementation may want to verify the set > >>>> of known and required tokens for the templates. I feel > >>>> that a default app specific TemplatedURLFormatter should > >>>> contain the collection of tokens. This collection would > >>>> be passed to the factory first so the factory could use > >>>> them to verify templates. > >>>> > >>>> It would be nice if the application could define the default > >>>> TemplatedURLFormatter rather than always fall back into > >>>> the NetUI implementation and the known/req. tokens we have. > >>>> An application or even a container (portal) may have additional > >>>> tokens for the same page flow templates, something that > >>>> our default NetUI formatter may not know how to handle. > >>>> > >>>> A different default formatter could be declared in the config file, > >>>> beehive-netui-config.xml. We would then use ConfigUtils > >>>> to check for and get the default formatter. If one is not > >>>> defined, then we would use our NetUI implementation. We can > >>>> then get the known and required tokens from this object for the > >>>> factory to use when verifying the templates (above). > >>>> > >>>> At runtime, the actual URL formatting step in > >>>> URLRewriterService.getTemplatedURL() may also call ConfigUtils to > >>>> get the default TemplatedURLFormatter as needed. First > >>>> getTemplatedURL() will see if a TemplatedURLFormatter was > >>>> registered for the given request and use it. If there is > >>>> no registered request, then we will see if there is a app specific > >>>> default formatter from ConfigUtils. Finally, > >>>> if we still have no formatter, then we will use the NetUI > >>>> implementation of TemplatedURLFormatter. > >>>> > >>>> Since these formatters need to get the desired templates from > >>>> the URLTemplateDescriptor (in turn, the factory of the template > >>>> descriptor), At load time, the URLTemplateDescriptor can be > >>>> set on the ServletContext. Then the context will have a reference > >>>> to this object to ensure it remains available. A runtime call > >>>> to URLRewriterService.getTemplatedURL() will include the > >>>> ServletContext so any given formatter can get the template > >>>> descriptor object and request the desired template. > >>>> > >>>> Summary of changes... > >>>> Start Up: > >>>> - get a URLTemplatesFactory from the container adapter. > >>>> - get a default TemplatedURLFormatter from the config. > >>>> - get known/req tokens from default TemplatedURLFormatter and > >>>> pass to factory. > >>>> - pass factory to the URLTemplateDescriptor. > >>>> - load the templates URLTemplateDescriptor/URLTemplatesFactory. > >>>> - set the URLTemplateDescriptor on the ServletContext. > >>>> > >>>> Runtime: > >>>> - Check for TemplatedURLFormatter for the request, then > >>>> - check for default TemplatedURLFormatter from the config, then > >>>> - use the NetUI default TemplatedURLFormatter. > >>>> > >>>> > >>>> Let me know what you think. Thanks, > >>>> Carlin > >>>> > >>>> > >>>> > >>> > >>> > >> > > > > >