On Fri, 5 Apr 2002, Geir Magnusson Jr. wrote:
>
> I looked for docs on how to setup the web.xml for tc4 to specify my ctx
> factory, but didn't find them when I looked. I assume they are there
> somewhere?
>
Short answer: You don't configure the factory in web.xml -- that goes in
server.xml. See the jndi-resource-howto.html page for the details.
Longer answer (assuming you really want a LogFactory instead, which is
more likely, but the concepts are all the same):
(1) In web.xml, declare the fact that you need a LogFactory instance:
<resource-env-ref>
<description>
The log factory instance for this web application.
</description>
<resource-env-ref-name>
log/Factory
</resource-env-ref-name>
<resource-env-ref-type>
org.apache.commons.logging.LogFactory
</resource-env-ref-type>
</resource-env-ref>
(You could also use a <resource-ref>, but that has some additional
required elements that are not really relevant for this purpose)
(2) In server.xml, define a corresponding resource definition, including
a declaration of the javax.naming.spi.ObjectFactory implementation:
<Context path="/myapp" ...>
...
<Resource name="log/Factory" auth="Container"
type="org.apache.commons.logging.LogFactory"/>
<ResourceParams name="log/Factory">
<parameter>
<name>factory</name>
<value>...ObjectFactory implementation class...</value>
</parameter>
... other configuration parameters for your factory ...
</ResourceParams>
...
</Context>
(In the nightly builds, there's an additional notion called
"global JNDI resources" so that you can share resources across
webapps if you want to.)
(Note that this configuration is done *totally* separate from the
web application itself -- so you can change it without going and
messing with web.xml or other configuration properties files.)
(3) Implement the javax.naming.spi.ObjectFactory class, and stick it in
a JAR file in $CATALINA_HOME/server/lib (or unpacked under
$CATALINA_HOME/server/classes). There's an example down near the
bottom of the jndi-resources-howto.html page in the Tomcat docs.
The actual object you make available could either be the standard
o.a.c.l.LogFactory class, or a subclass of that class that does
Log instantiation differently. Your choice (as system administrator
-- the application author neither knows nor cares).
(4) Use this LogFactory in your application to create loggers:
InitialContext context = new InitialContext();
LogFactory logFactory = (LogFactory)
context.lookup("java:comp/env/log/Factory");
Log log = logFactory.getInstance("my.log.name");
log.info("Hello, world");
mycomponent.setLog(log); // Or whatever
(Note that you can even do this sort of thing inside a JavaBean.
No reference to the ServletContext or any static method is needed.
Just ignore the static getFactory() and getLog() methods on
o.a.c.l.LogFactory :-)
> --
> Geir Magnusson Jr. [EMAIL PROTECTED]
> System and Software Consulting
> You're going to end up getting pissed at your software
> anyway, so you might as well not pay for it. Try Open Source.
>
Craig
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>