[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [jetty-dev] Servlet-3.0 WebApp configuration
|
Greg,
maybe it's the classic "around" aop-y trilogy:
interface WebAppConfiguration
{
void preConfigure(WebAppContext context);
void configure(WebAppContext context);
void postConfigure(WebAppContext context);
}
?
Jan
Greg Wilkins wrote:
> Jan Bartel wrote:
>> Greg,
>>
>> Some comments. A bit stream-of-consciousness, sorry.
>
>>
>>> WebInfConfiguration:
>>> --------------------
>>>
>>> discover WEB-INF/classes and add to class-path
>>>
>>> discover WEB-INF/lib/*.jar and for each:
>>> a) add to class-path
>>> b) scan jar index for
>>> i) META-INF/web-fragment.xml
>>> parse (not process) for name and partial orderings
>>> ii) META-INF/*.tld add to list of tlds
>>> iii) META-INF/resources add to resource base.
>>>
>>> set Thread context classloader
>>
>> If we parse all the web-fragements at this stage, we might
>> do useless processing, as if metadata-complete is true in
>> web.xml we don't need to - and shouldn't - look at any
>> web fragments.
>
> OK - so perhaps split this into
> WebInfConfiguration
> WebFragmentConfiguration (which is done after WebXmlConfiguration)
>
>
>>
>>> WebXmlConfiguration
>>> -------------------
>>>
>>> discover defaultweb.xml, WEB-INF/web.xml and override web.xml
>>> a) parse (but not process) to determine
>>> i) if meta-data complete
>>> ii) if there is a web-fragment ordering
>>>
>>> Apply orderings to list of WEB-INF/lib/*.jar
>>> Store list of jars as attribute for later configurations.
>>
>> Shouldn't we store the list of jars as an attribute back
>> in WebInfConfiguration when we load them onto the classpath?
>
> yes
>
>
>>> Use meta-data-complete and orderings to merge
>>> * defaultweb.xml
>>> * web.xml
>>> * web-fragment.xml s
>>> * override web.xml
>>>
>>> to obtain an effective web.xml that respects
>>> main merging rules. Store resulting parse
>>> tree as attribute for use by subsequent configuration
>>
>> Good. I like having the effective web.xml. We can even
>> spit that out as a diagnostic.
>
> yep
>
>
>>> process effective web.xml standard configuration
>>>
>>>
>>> EnvConfiguration
>>> ----------------
>>> Process the effective web.xml looking for resources
>>> and other JNDI type stuff.
>>>
>>> Process jetty-env.xml
>>
>> This would have to be done in the other order. jetty-env.xml
>> defines resources in the container's environment that you want
>> to be able to hook into the webapp via <resource> entries in
>> web.xml or annotations. So you need to process jetty-env.xml
>> first. Currently we're doing this as 2 separate configurations:
>>
>> 1. plus.EnvConfiguration: sets up the webapp's java:comp/env
>> namespace and then loads resource definitions from jetty-env.xml
>>
>> 2. plus.Configuration: reads web.xml and hooks up resources
>> from the container's environment into the java:comp/env
>> namespace, and also prepares any injections that are specified
>> in web.xml (as opposed to injections specified by annotations
>> which are handled by the annotation.Configuration class)
>
> So we need to keep this split, maybe:
>
> EnvXmlConfiguration
> WebXmlResourceConfiguration
>
> with the later working off the stored effective web.xml
> with another pass over it.
>
> the alternative is to have an extensible mechanism
> that handles each element from a single pass through
> the effective web.xml parse tree
>
>
>>> AnnotationConfiguration
>>> -----------------------
>>>
>>> For each jar in ordered list scan classes for
>>> a) handled types for ServletContainerInitializers
>>> b) Servlets|Filters|Listeners instances with annotations
>>> i) Setup resource injection for newServlet and newFilter
>>
>> We also need to have pre-scanned some jars that are in jetty's
>> container path (as opposed to the WEB-INF/lib jars) for @HandlesTypes
>> annotations. I say pre-scanned because we don't want to re-scan
>> for every webapp deployment.
>
> Hmmm maybe.... could be done by a deployer and injected?
>
>> Also, the @HandlesTypes annotation could be handled a little differently
>> from the other annotations we scan for. The jdk6 java.util.ServiceLoader
>> api will give us back a list of instances of all classes that implement
>> the ServletContainerInitializer interface, so we could just use
>> reflection
>> to work out if it has a @HandlesTypes annotation as those classes are
>> already loaded, unlike in the scanning for the servlet/filter/listener
>> classes as we don't want to actually load those classes and therefore
>> we need to use asm to look at the byte code instead.
>
> cool
>
>> Now, the actual value of @HandlesTypes annotation can be (quoting from
>> draft spec) "The annotation will be applied on the implementation of
>> ServletContainerInitializer to express interest in classes that
>> are either annotated with the classes specified in the value or if
>> a class extends / implements one of those classes."
>>
>> So during our asm scanning of jars in WEB-INF/lib we need to look both
>> at annotations that are known a priori (ie hard coded from the spec) AND
>> at annotations that are dynamically discovered from the values of the
>> @HandlesTypes annotation on the ServletContainerInitializers classes.
>> So in fact, we have to have separately processed the @HandlesTypes
>> annotation BEFORE we commence our general jar scanning anyway, so the
>> reflection method outlined above seems most reasonable.
>
> ok
>
>
>> Incidentally, our asm scanning needs to be extended, as currently we
>> just use it to look for annotations, but now we need to also look at
>> the class definition to find classes that extend or implement the
>> class names in @HandlesTypes.
>
> or have annotations define in HandlerTypes
>
>
>>
>>> ContainerInitializerConfiguration
>>> ---------------------------------
>>>
>>> user JVM service discovery to find ServletContainerInitializer classes
>>> on container classpath.
>>> a) for each initialize use @HandlesTypes to discover interested
>>> classes
>>>
>>> For each ServletContainerInitializer
>>> i) scan ordered jar list for matching classes (or maybe all jars)
>>> i) call with list of discovered classes and allow to do programmatic
>>> configuration
>>
>> See comments above. At this stage, we need to loop over the map
>> of ServletContainerInitializers, get their interested classes/annotations
>> and then get the matching class instances out of the results of our
>> asm parsing, then pass them into the onStartup() method of the
>> ServletContainerInitializer.
>
> So I'm thinking this is a split pair of configurations as well.
>
> hmmmmm
>
> I'm wondering if this split configuration pairings really means that
> we should have two methods on all the configuration. Call all of their
> first methods and then call all or their second methods?
>
> I think this is better than endless pairings... need to think of
> the appropriate names:
>
> prepareConfiguration
> performConfiguration
>
>
>
>>> TagLibConfiguration
>>> -------------------
>>> Combine list of META-INF/*.tld with
>>> * TLDs defined in effective web.xml
>>> * TLDs discovered in WEB-INF/*.tld (including
>>> META-INF/resources/WEB-INF/*.tld)
>>> Parse TLDs for listeners - add to listener lists.
>>
>> Don't forget the jars on the container's classpath that we have to
>> also scan for tlds. See the regexp in webdefault.xml that currently
>> determines which ones we scan.
>
> Do we have to do this anymore? I'm not so sure?
> But we can have them added to the list I guess for old times!
>
>
>> What are you thinking of as far as a Configuration base class looks
>> like?
>
> now I'm thinking of
>
> interface WebAppConfiguration
> {
> void prepareConfiguration(WebAppContext context);
> void performConfiguration(WebAppContext context);
> }
>
>
>
> cheers
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
> http://xircles.codehaus.org/manage_email
>
>
>
--
Jan Bartel, Webtide LLC | janb@xxxxxxxxxxx | http://www.webtide.com