XSLT Plugability Layer
JAXP 1.1 defines a specific lookup procedure to locate an appropriate
XSLT processor. This must be accomplished without hardcoding
vendor-specific code into applications, so Java system properties
and JAR file service providers are used. Within your code, first
locate an instance of the TransformerFactory class as
follows:
javax.xml.transform.TransformerFactory transFact =
javax.xml.transform.TransformerFactory.newInstance( );
Since TransformerFactory is abstract, its
newInstance( ) factory method is used to instantiate
an instance of a specific subclass. The algorithm for locating this
subclass begins by looking at the
javax.xml.transform.TransformerFactory system property.
Let us suppose that com.foobar.AcmeTransformer is a new
XSLT processor compliant with JAXP 1.1. To utilize this processor
instead of JAXP's default processor, you can specify the system
property on the command line
[2]
when you start your Java application:
java -Djavax.xml.transform.TransformerFactory=
com.foobar.AcmeTransformer MyApp
Note: Color coded lines have been broken for display purposes.
Provided that JAXP is able to instantiate an instance of
AcmeTransformer, this is the XSLT processor
that will be used. Of course, AcmeTransformer
must be a subclass of TransformerFactory for this
to work, so it is up to vendors to offer support for JAXP.
If the system property is not specified, JAXP next looks for
a property file named lib/jaxp.properties
in the JRE directory. A property file consists of
name=value pairs, and JAXP looks for a line like this:
javax.xml.transform.TransformerFactory=
com.foobar.AcmeTransformer
Note: Color coded lines have been broken for display purposes.
You can obtain the location of the JRE with the following code:
String javaHomeDir = System.getProperty("java.home");
TIP:
Some popular development tools change the value of java.home
when they are installed, which could prevent JAXP from locating
jaxp.properties. JBuilder, for instance, installs its own
version of Java 2 that it uses by default.
The advantage of creating jaxp.properties in this directory
is that you can use your preferred processor for all of your
applications that use JAXP without having to specify the system
property on the command line. You can still override this file with
the -D command-line syntax, however.
If jaxp.properties is not found, JAXP uses the JAR file
service provider mechanism to locate an appropriate subclass
of TransformerFactory. The service provider mechanism
is outlined in the JAR file specification from Sun and simply means
that you must create a file in the META-INF/services
directory of a JAR file. In JAXP, this file is called
javax.xml.transform.TransformerFactory. It contains a single
line that specifies the implementation of TransformerFactory: com.foobar.AcmeTransformer in our fictitious example. If you look inside of xalan.jar in JAXP 1.1, you will find this file. In order to utilize a different parser that follows the JAXP 1.1 convention, simply make sure its JAR file is located first on your CLASSPATH.
Finally, if JAXP cannot find an implementation class from any of
the three locations, it uses its default implementation of
TransformerFactory. To summarize, here are the steps
that JAXP performs when attempting to locate a factory:
- Use the value of the
javax.xml.transform.TransformerFactory
system property if it exists.
- If JRE/lib/jaxp.properties exists, then look for a
javax.xml.transform.TransformerFactory=ImplementationClass
entry in that file.
- Use a JAR file service provider to look for a file called
META-INF/services/javax.xml.transform.TransformerFactory
in any JAR file on the CLASSPATH.
- Use the default
TransformerFactory instance.
The JAXP 1.1 plugability layers for SAX and DOM follow the exact same
process as the XSLT layer, only they use the
javax.xml.parsers.SAXParserFactory and
javax.xml.parsers.DocumentBuilderFactory system
properties respectively. It should be noted that JAXP 1.0 uses a
much simpler algorithm where it checks only for the existence of the
system property. If that property is not set, the default
implementation is used.
Footnote:
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|