User: starksm
Date: 01/03/25 09:30:36
Modified: src/docs jbossdocs.xml
Added: src/docs howtojaxp.xml
Log:
Added JAXP configuration howto.
Revision Changes Path
1.7 +2 -0 manual/src/docs/jbossdocs.xml
Index: jbossdocs.xml
===================================================================
RCS file: /cvsroot/jboss/manual/src/docs/jbossdocs.xml,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- jbossdocs.xml 2001/03/21 08:30:20 1.6
+++ jbossdocs.xml 2001/03/25 17:30:36 1.7
@@ -21,6 +21,7 @@
<!ENTITY basicconfiguration.xml SYSTEM "basicconfiguration.xml">
<!ENTITY howtomdb.xml SYSTEM "howtomdb.xml">
<!ENTITY howto_socketfactories.xml SYSTEM "howto_socketfactories.xml">
+ <!ENTITY howtojaxp.xml SYSTEM "howtojaxp.xml">
<!ENTITY jbosssx.xml SYSTEM "jbosssx.xml">
]>
<book>
@@ -55,6 +56,7 @@
&howtojca.xml;
&howtojndi_external.xml;
&howto_socketfactories.xml;
+&howtojaxp.xml;
</chapter>
</book>
1.1 manual/src/docs/howtojaxp.xml
Index: howtojaxp.xml
===================================================================
<?xml version = "1.0" encoding = "UTF-8"?>
<section>
<title>Configuring and Using JAXP 1.1 In JBoss</title>
<para>
<author>
<firstname>Scott</firstname>
<surname>Stark</surname>
</author>
<email>[EMAIL PROTECTED]</email>
</para>
<section>
<title>Introduction</title>
<para>JBoss uses the JAXP 1.1 optional package to JAXP to parse and transform XML
documents using a pure Java API that is independent of a particular XML processor
implementation. This allows the flexibility to swap between XML processors without
making application code changes. Version 1.1 includes an XSLT framework based on TrAX
(Transformation API for XML) plus some updates to the parsing API to support DOM Level
2 and SAX version 2.0 and an improved scheme to locate pluggable implementations.
</para>
</section>
<section>
<title>Configuring XML Parsers and Transformers</title>
<para>This section covers how one configures which xml parser and transformers the
JBoss uses. It is based largely on the current <ulink url =
"http://java.sun.com/xml/download.html">Java API for XML Processing (JAXP) 1.1</ulink>
specification. The types of configurable objects include DOM parsers, SAX parsers and
XSLT transformers. First we'll describe the configuration options for the various
objects per the JAXP spec and then show how JBoss uses the configuration properties
and how you can change them.</para>
<section id = "howto.jaxp.sax">
<title>SAX Parser Configuration</title>
<para>The SAX Plugability classes allow an application programmer to provide an
implementation of the
org.xml.sax.DefaultHandler API to a SAXParser implementation and parse XML
documents. In order to obtain a SAXParser instance, an application programmer first
obtains an instance of a SAXParserFactory.
The SAXParserFactory instance is obtained via the static newInstance method of the
SAXParserFactory class. This method uses the following ordered lookup procedure to
determine the SAXParserFactory implementation class to load:</para>
<orderedlist>
<listitem>
<para>Use the javax.xml.parsers.SAXParserFactory system property</para>
</listitem>
<listitem>
<para>Use the properties file "lib/jaxp.properties" in the JRE directory. This
configuration file is in standard java.util.Properties format and contains the fully
qualified name of the implementation class with the key being the system property
defined above.</para>
</listitem>
<listitem>
<para>Use the Services API (as detailed in the JAR specification), if
available, to determine the classname. The Services API will look for the classname in
the file META-INF/services/javax.xml.parsers.SAXParserFactory in jars available to the
runtime.</para>
</listitem>
<listitem>
<para>Platform default SAXParserFactory instance.</para>
</listitem>
</orderedlist>
</section>
<section id = "howto.jaxp.dom">
<title>DOM Parser Configuration</title>
<para>The DOM plugability classes allow a programmer to parse an XML document and
obtain an org.w3c.dom.Document object from a DocumentBuilder implementation which
wraps an underlying DOM implementation. In order to obtain a DocumentBuilder instance,
an application programmer first obtains an instance of a Document-BuilderFactory. The
DocumentBuilderFactory instance is obtained via the static newInstance method of the
DocumentBuilderFactory class. This method uses the following ordered lookup procedure
to determine the DocumentBuilderFactory implementation class to load:</para>
<orderedlist>
<listitem>
<para>Use the javax.xml.parsers.DocumentBuilderFactory system property</para>
</listitem>
<listitem>
<para>Use the properties file "lib/jaxp.properties" in the JRE directory. This
configuration file is in standard java.util.Properties format and contains the fully
qualified name of the implementation class with the key being the system property
defined above.</para>
</listitem>
<listitem>
<para>Use the Services API (as detailed in the JAR specification), if
available, to determine the classname. The Services API will look for the classname in
the file META-INF/services/javax.xml.parsers.DocumentBuilderFactory in jars available
to the runtime.</para>
</listitem>
<listitem>
<para>Platform default SAXParserFactory instance.</para>
</listitem>
</orderedlist>
</section>
<section id = "howto.jaxp.xslt">
<title>XSLT Transformer Configuration</title>
<para>The XSLT Plugability classes allow an application programmer to obtain a
Transformer object that is based on a specific XSLT stylesheet from a
TransformerFactory implementation. In order to obtain a Transformer object,
a programmer first obtains an instance of the TransformerFactory. The
TransformerFactory instance is obtained via the static newInstance method of the
TransformerFactory class. This method uses the following ordered lookup procedure to
determine the TransformerFactory implementation class to load:</para>
<orderedlist>
<listitem>
<para>Use the javax.xml.transform.TransformerFactory system property</para>
</listitem>
<listitem>
<para>Use the properties file "lib/jaxp.properties" in the JRE directory. This
configuration file is in standard java.util.Properties format and contains the fully
qualified name of the implementation class with the key being the system property
defined above.</para>
</listitem>
<listitem>
<para>Use the Services API (as detailed in the JAR specification), if
available, to determine the classname. The Services API will look for the classname in
the file META-INF/services/javax.xml.transform.TransformerFactory in jars available to
the runtime.</para>
</listitem>
<listitem>
<para>Platform default TransformFactory instance.</para>
</listitem>
</orderedlist>
</section>
<section id = "howto.jaxp.jboss.config">
<title>Changing the JBoss Defaults</title>
<para>JBoss uses a DOM DocumentBuilder to parse the jboss.jcml configuration
file. The run.bat and run.sh startup scripts sets the
javax.xml.parsers.DocumentBuilderFactory and javax.xml.parsers.SAXParserFactory
system properties to the bundled Crimson 1.1 DOM and SAX parsers contained in
lib/crimson.jar. <xref linkend = "howto.jaxp.run.sh.crimson"/> shows the setup.</para>
<figure id = "howto.jaxp.run.sh.crimson">
<title>The run.sh setup for the Crimson xml parsers</title>
<programlisting># Add the XML parser jars and set the JAXP factory names
# Crimson parser JAXP setup(default)
CLASSPATH=$CLASSPATH:../lib/crimson.jar
JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
JAXP="$JAXP
-Djavax.xml.parsers.SAXParserFactory=org.apache.crimson.jaxp.SAXParserFactoryImpl"</programlisting>
</figure>
<para>To change JBoss to use the Xerces parser, you would need change the setup
to that shown in <xref linkend = "howto.jaxp.run.sh.xerces"/> assuming you copied the
xerces.jar into the JBoss lib directory.</para>
<figure id = "howto.jaxp.run.sh.xerces">
<title>The run.sh setup for the Xerces xml parsers</title>
<programlisting># Add the XML parser jars and set the JAXP factory names
# Xerces parser JAXP setup
CLASSPATH=$CLASSPATH:../lib/xerces.jar
JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
JAXP="$JAXP
-Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl"</programlisting>
</figure>
<para>JBoss does not currently use any XSLT transformers and so does not set a
default value for the javax.xml.transform.TransformerFactory system property. To setup
the desired transformer you are free to use any of the approaches described in <xref
linkend = "howto.jaxp.xslt"/>.</para>
</section>
</section>
<section>
<title>Using JAXP</title>
<para>To aide in porting your xml parser creation to use the JAXP package, this
section gives some small code fragments showing the use of each type of factory. See
the JAXP spec or JavaDoc for the full usage details.</para>
<figure id = "jaxp.howto.sax.example">
<title>Example SAX Parser Creation</title>
<programlisting>import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
SAXParser parser = null;
DefaultHandler handler = new DefaultHandler()
{
...
}
try
{
SAXParserFactory factory = SAXParserFactory.newInstance();
parser = factory.newSAXParser();
String docURI = ...;
parser.parse(docURI);
}
catch(SAXException e)
{
...
}
catch(java.io.IOException e)
{
...
}
catch(ParserConfigurationException e)
{
...
}
catch(FactoryConfigurationError e)
{
...
}</programlisting>
</figure>
<figure id = "jaxp.howto.dom.example">
<title>Example DOM Parser Creation</title>
<programlisting>import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
DocumentBuilder parser = null;
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
String docURI = ...;
parser.parse(docURI);
}
catch(SAXException e)
{
...
}
catch(java.io.IOException e)
{
...
}
catch(ParserConfigurationException e)
{
...
}
catch(FactoryConfigurationError e)
{
...
}</programlisting>
</figure>
<figure id = "jaxp.howto.xslt.example">
<title>Example XSLT Transformer Creation</title>
<programlisting>import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
Transformer transformer = null;
try
{
TransformerFactory factory = TransformerFactory.newInstance();
String stylesheet = "file:///ssheet.xsl";
String xmldoc = "file:///application.xml";
StreamSource style = new StreamSource(stylesheet);
StreamSource src = new StreamSource(xmldoc);
StreamResult result = new StreamResult(System.out);
transformer = factory.newTransformer(style);
transformer.transform(src, dest);
}
catch(TransformerFactoryConfigurationError e)
{
...
}
catch(TransformerConfigurationException e)
{
...
}
catch(TransformerException e)
{
...
}</programlisting>
</figure>
</section>
<section>
<title>Common Questions</title>
<qandaset>
<qandaentry>
<question>
<para>Do I have to use JAXP for xml parsing?</para>
</question>
<answer>
<para>Not necessarily. If you have a specific parser you want to use and you
want to uses a parser specific factory you can as long as the parser supports JAXP as
this is how JBoss is locating its xml parsers.</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para>Can I mix different xml parsers?</para>
</question>
<answer>
<para>If they are all support the same level of the xml standards and JAXP then
you should be able to. However, if there are differences then you are likely to see a
SecurityException("sealing violation") error thrown.</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para>What if I have to use an older parser that does not support JAXP?</para>
</question>
<answer>
<para>The you will need to use your own ClassLoader instance to isolate any
common xml parser packages to avoid the sealing violation exception.</para>
</answer>
</qandaentry>
</qandaset>
</section>
</section>
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development