Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jetty-dev] Servlet-3.0 WebApp configuration

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


Back to the top