blob: 82919a00c67d0c3bca2747ae061d6680337e0d4e [file] [log] [blame]
<?xml version='1.0' encoding='UTF-8'?>
<!--
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
-->
<!DOCTYPE s1 SYSTEM 'dtd/document.dtd'>
<s1 title='Xerces2 Components'>
<s2 title='Re-using Xerces2 Parser Components'>
<p>
The Xerces Native Interface (XNI) defines a general way to build
parser components and configurations. The Xerces2 reference
implementation is written using this framework so that the parser
components can be re-used to create new parser configurations. In
order to re-use the Xerces2 parser components, however, the
developer must know the dependencies of each standard component.
This document provides an overview of the Xerces2 parser components
and lists the relevant dependencies.
</p>
<p>
An overview of the general dependencies and the dependencies for
each standard component are detailed below:
</p>
<ul>
<li><link anchor='overview'>Overview</link></li>
<li>Fundamental Dependencies</li>
<ul>
<li><link anchor='symbol-table'>Symbol Table</link></li>
<li><link anchor='error-reporter'>Error Reporter</link></li>
</ul>
<li>Individual Component Dependencies</li>
<ul>
<li><link anchor='document-scanner'>Document Scanner</link></li>
<li><link anchor='dtd-scanner'>DTD Scanner</link></li>
<li><link anchor='entity-manager'>Entity Manager</link></li>
<li><link anchor='dtd-validator'>DTD Validator</link></li>
<li><link anchor='namespace-binder'>Namespace Binder</link></li>
<li><link anchor='schema-validator'>Schema Validator</link></li>
</ul>
<!-- NOTE:
- More components and their dependencies may be added as
- they are made and integrated into the standard Xerces2
- configuration.
-->
</ul>
</s2>
<anchor name='overview'/>
<s2 title='Overview'>
<p>
The standard parser configuration for the Xerces2 reference
implementation of XNI is defined in the
<code>org.apache.xerces.parsers.StandardParserConfiguration</code>
class. This configuration is comprised of a number of
components. Some of these components are configurable and some
are shared within the configuration but do not implement the
<link idref='xni-config' anchor='component'>XMLComponent</link>
interface.
</p>
<p>
The following list details the set of components used in the
Xerces2 standard configuration. The components marked with an
asterisk (*) are configurable.
</p>
<ul>
<li>Symbol Table</li>
<li>Error Reporter (*)</li>
<li>Document Scanner (*)</li>
<li>DTD Scanner (*)</li>
<li>Entity Manager (*)</li>
<li>DTD Validator (*)</li>
<li>Namespace Binder (*)</li>
<li>Schema Validator (*)</li>
</ul>
<note>
There are additional components other than those in the above
list, such as the "Grammar Pool" and "Datatype Validator
Factory". However, the validation engine in the Xerces2
reference implementation is currently being re-designed and
re-implemented. Therefore, these components are subject to
change and should not be used or relied upon.
</note>
<p>
In general, there are levels of dependency among the components
in the standard configuration. Some components are required by
all of the configurable components, where as there are certain
components required by other components. The following diagram
illustrates these basic levels of dependency.
</p>
<p>
<img alt='Xerces2 Component Dependencies' src='xni-components-dependence.gif'/>
</p>
<p>
The dependencies of each component are detailed in subsequent
sections of this document but the basic dependencies are
listed below:
</p>
<ul>
<li>
All of the configurable Xerces2 components in the standard
configuration depend on the
"<link anchor='symbol-table'>Symbol Table</link>" and the
"<link anchor='error-reporter'>Error Reporter</link>".
</li>
<li>
Both the "<link anchor='document-scanner'>Document Scanner</link>"
and the "<link anchor='dtd-scanner'>DTD Scanner</link>" depend
on the "<link anchor='entity-manager'>Entity Manager</link>"
component.
</li>
<li>
In addition to the other dependencies, the
"<link anchor='document-scanner'>Document Scanner</link>" also
depends on the
"<link anchor='dtd-scanner'>DTD Scanner</link>" for scanning of
the internal and external subsets of the DTD.
</li>
</ul>
<p>
Each configurable component queries the components that it
depends on before each document is parsed. The configuration
is required to call the
<link idref='xni-config' anchor='component'>XMLComponent</link>'s
"reset" method. From the
<link idref='xni-config' anchor='component-manager'>XMLComponentManager</link>
object that is passed to the "reset" method, the component
can query the other components that it needs. Therefore, each
component is assigned a unique property identifier used to
query the components from the component manager.
</p>
<p>
The following example source code shows how one of the
standard Xerces2 components is queried within a configurable
component. However, for complete dependency details and the
property identifiers defined for each component, refer to the
appropriate sections of this document.
</p>
<source><![CDATA[import org.apache.xerces.xni.parser.XMLComponent;
import org.apache.xerces.xni.parser.XMLComponentManager;
import org.apache.xerces.xni.parser.XMLConfigurationException;
public class MyComponent
implements XMLComponent {
// Constants
public static final String SYMBOL_TABLE =
"http://apache.org/xml/properties/internal/symbol-table";
// XMLComponent methods
public void reset(XMLComponentManager manager)
throws XMLConfigurationException {
SymbolTable symbolTable =
(SymbolTable)manager.getProperty(SYMBOL_TABLE);
}
}]]></source>
</s2>
<anchor name='symbol-table'/>
<s2 title='Symbol Table'>
<p>Property information:</p>
<table>
<tr>
<th>Property Id</th>
<td>http://apache.org/xml/properties/internal/symbol-table</td>
</tr>
<tr>
<th>Type</th>
<td>org.apache.xerces.util.SymbolTable</td>
</tr>
</table>
<p>
For performance reasons, the Xerces2 reference implementation
uses a custom symbol table in order to re-use common strings
that appear in the document. The symbol table is responsible
for keeping track of these common strings and always return
the same <code>java.lang.String</code> reference for lexically
equivalent strings. This not only reduces the amount of unique
objects created while parsing, it also allows components (e.g.
the validators, etc) to perform comparisons directly on the
references for certain string objects without having to call
the "equals" method.
</p>
<p>
<strong>Note:</strong>
Nearly all of the standard components depend on this component.
Therefore, if you write a parser configuration that re-uses any
of the standard components, you must have an instance of this
component registered with the appropriate property identifier.
</p>
</s2>
<anchor name='error-reporter'/>
<s2 title='Error Reporter'>
<p>Property information:</p>
<table>
<tr>
<th>Property Id</th>
<td>http://apache.org/xml/properties/internal/error-reporter</td>
</tr>
<tr>
<th>Type</th>
<td>org.apache.xerces.impl.XMLErrorReporter</td>
</tr>
</table>
<p>Recognized features:</p>
<ul>
<li>http://apache.org/xml/features/continue-after-fatal-error</li>
</ul>
<p>Recognized properties:</p>
<ul>
<li>http://apache.org/xml/properties/internal/error-handler</li>
</ul>
<p>
In any parser instance, there must be a way for components to
report errors in a uniform way. The "Error Reporter" component
serves this purpose and simplifies the process of localizing
error messages and notifying the registered
<link idref='xni-parser' anchor='error-handler'>XMLErrorHandler</link>.
</p>
<p>
In general, errors are identified by the domain of the error
and a unique key within that domain. The XMLErrorReporter class
allows message formatters to be set for each domain and then
delegates the formatting of error messages (with replacement
text) to the message formatter assigned to that error domain.
The localized error message is then sent to the registered
error handler.
</p>
<p>
An error message formatter is any class that implements the
<code>org.apache.xerces.util.MessageFormatter</code> interface.
If you write a new parser component for use with the existing
Xerces2 components, you should implement your own message
formatter and register it with the Error Reporter. For
example:
</p>
<source><![CDATA[import java.util.Locale;
import java.util.MissingResourceException;
import org.apache.xerces.util.MessageFormatter;
public class MyFormatter
implements MessageFormatter {
// MessageFormatter methods
public String formatMessage(Locale locale, String key, Object[] args)
throws MissingResourceException {
// localize and format message based on locale, key,
// and replacement text arguments
return "MY ERROR ("+key+")";
}
}]]></source>
<source><![CDATA[import org.apache.xerces.impl.XMLErrorReporter;
import org.apache.xerces.xni.parser.XMLComponent;
import org.apache.xerces.xni.parser.XMLComponentManager;
import org.apache.xerces.xni.parser.XMLConfigurationException;
public class MyComponent
implements XMLComponent {
// Constants
public static final String ERROR_REPORTER =
"http://apache.org/xml/properties/internal/error-reporter";
public static final String DOMAIN = "http://example.com/mydomain";
// XMLComponent methods
public void reset(XMLComponentManager manager)
throws XMLConfigurationException {
XMLErrorReporter reporter =
(XMLErrorReporter)manager.getProperty(ERROR_REPORTER);
if (reporter.getMessageFormatter(DOMAIN) == null) {
reporter.putMesssageFormatter(DOMAIN, new MyFormatter());
}
}
}]]></source>
<p>
<strong>Note:</strong>
It is <em>strongly</em> encouraged that any new error domains
that you create follow the standard URI syntax. While there is
no requirement that the URI must point to an actual resource on
the Internet, it is a common way to separate domains and it
provides more useful information to the application.
</p>
<p>
<strong>Note:</strong>
Nearly all of the standard components depend on this component.
Therefore, if you write a parser configuration that re-uses any
of the standard components, you must have an instance of this
component registered with the appropriate property identifier.
</p>
</s2>
<anchor name='document-scanner'/>
<s2 title='Document Scanner'>
<p>Property information:</p>
<table>
<tr>
<th>Property Id</th>
<td>http://apache.org/xml/properties/internal/document-scanner</td>
</tr>
<tr>
<th>Type</th>
<td>org.apache.xerces.xni.parser.XMLDocumentScanner</td>
</tr>
</table>
<p>Required properties:</p>
<ul>
<li>http://apache.org/xml/properties/internal/symbol-table</li>
<li>http://apache.org/xml/properties/internal/error-reporter</li>
<li>http://apache.org/xml/properties/internal/entity-manager</li>
<li>http://apache.org/xml/properties/internal/dtd-scanner</li>
</ul>
<p>Recognized features:</p>
<ul>
<li>http://xml.org/sax/features/namespaces</li>
<li>http://xml.org/sax/features/validation</li>
<li>http://apache.org/xml/features/nonvalidating/load-external-dtd</li>
<li>http://apache.org/xml/features/scanner/notify-char-refs</li>
<li>http://apache.org/xml/features/scanner/notify-builtin-refs</li>
</ul>
<p>
The <code>org.apache.xerces.impl.XMLDocumentScannerImpl</code>
class implements the XNI document scanner interface and is
implemented so that it can also function as a "pull" parser.
A pull parser allows the application to drive the parsing of
the document instead of having all of the document events
"pushed" to the registered handlers.
</p>
</s2>
<anchor name='dtd-scanner'/>
<s2 title='DTD Scanner'>
<p>Property information:</p>
<table>
<tr>
<th>Property Id</th>
<td>http://apache.org/xml/properties/internal/dtd-scanner</td>
</tr>
<tr>
<th>Type</th>
<td>org.apache.xerces.xni.parser.XMLDTDScanner</td>
</tr>
</table>
<p>Required properties:</p>
<ul>
<li>http://apache.org/xml/properties/internal/symbol-table</li>
<li>http://apache.org/xml/properties/internal/error-reporter</li>
<li>http://apache.org/xml/properties/internal/entity-manager</li>
</ul>
<p>Recognized features:</p>
<ul>
<li>http://xml.org/sax/features/validation</li>
<li>http://apache.org/xml/features/scanner/notify-char-refs</li>
</ul>
<p>
The <code>org.apache.xerces.impl.XMLDTDScannerImpl</code>
class implements the XNI DTD scanner interface and is
implemented so that it can also function as a "pull" parser.
A pull parser allows the application to drive the parsing of
the DTD instead of having all of the DTD events
"pushed" to the registered handlers.
</p>
</s2>
<anchor name='entity-manager'/>
<s2 title='Entity Manager'>
<p>Property information:</p>
<table>
<tr>
<th>Property Id</th>
<td>http://apache.org/xml/properties/internal/entity-manager</td>
</tr>
<tr>
<th>Type</th>
<td>org.apache.xerces.impl.XMLEntityManager</td>
</tr>
</table>
<p>Required properties:</p>
<ul>
<li>http://apache.org/xml/properties/internal/symbol-table</li>
<li>http://apache.org/xml/properties/internal/error-reporter</li>
</ul>
<p>Recognized features:</p>
<ul>
<li>http://xml.org/sax/features/validation</li>
<li>http://xml.org/sax/features/external-general-entities</li>
<li>http://xml.org/sax/features/external-parameter-entities</li>
<li>http://apache.org/xml/features/allow-java-encodings</li>
</ul>
<p>Recognized properties:</p>
<ul>
<li>http://apache.org/xml/properties/entity-resolver</li>
</ul>
<p>
Both the <link anchor='document-scanner'>Document Scanner</link>
and the <link anchor='dtd-scanner'>DTD Scanner</link> depend
on the Entity Manager. This component handles starting and
stopping entities automatically so that the scanners can continue
operation transparently even when entities go in and out of
scope.
</p>
<p>
The Entity Manager implements an Entity Scanner which is a
low-level scanner for document and DTD information. Because
the document and DTD scanners interact only with the Entity
Scanner to scan the document, the scanners are shielded from
changes caused by starting and stopping entities. Changes in
the entities being scanned happens transparently within the
Manager/Scanner combination but the scanner components are
notified of the start and end of the entity by implementing
the XMLEntityHandler interface that is only part of the
Xerces2 reference implementation.
</p>
</s2>
<anchor name='dtd-validator'/>
<s2 title='DTD Validator'>
<p>Property information:</p>
<table>
<tr>
<th>Property Id</th>
<td>http://apache.org/xml/properties/internal/validator/dtd</td>
</tr>
<tr>
<th>Type</th>
<td>org.apache.xerces.impl.dtd.XMLDTDValidator</td>
</tr>
</table>
<p>Required properties:</p>
<ul>
<li>http://apache.org/xml/properties/internal/symbol-table</li>
<li>http://apache.org/xml/properties/internal/error-reporter</li>
<!--
- NOTE: The following properties are also required but the
- validation engine is being redesigned so I'm not
- listing them in the documentation.
<li>http://apache.org/xml/properties/internal/grammar-pool</li>
<li>http://apache.org/xml/properties/internal/datatype-validator-factory</li>
-->
</ul>
<p>Recognized features:</p>
<ul>
<li>http://xml.org/sax/features/namespaces</li>
<li>http://xml.org/sax/features/validation</li>
<li>http://apache.org/xml/features/validation/dynamic</li>
</ul>
<p>
The DTD Validator performs validation of the document events that
it receives which may augment the streaming information set with
default attribute values and normalizing attribute values.
</p>
</s2>
<anchor name='namespace-binder'/>
<s2 title='Namespace Binder'>
<p>Property information:</p>
<table>
<tr>
<th>Property Id</th>
<td>http://apache.org/xml/properties/internal/namespace-binder</td>
</tr>
<tr>
<th>Type</th>
<td>org.apache.xerces.impl.XMLNamespaceBinder</td>
</tr>
</table>
<p>Required properties:</p>
<ul>
<li>http://apache.org/xml/properties/internal/symbol-table</li>
<li>http://apache.org/xml/properties/internal/error-reporter</li>
</ul>
<p>Recognized features:</p>
<ul>
<li>http://xml.org/sax/features/namespaces</li>
</ul>
<p>
The Namespace Binder is responsible for detecting namespace bindings
in the startElement/emptyElement methods and emitting appropriate
start and end prefix mapping events. Namespace binding should always
occur <em>after</em> DTD validation (since namespace bindings may
have been defaulted from an attribute declaration in the DTD) and
<em>before</em> Schema validation.
</p>
</s2>
<anchor name='schema-validator'/>
<s2 title='Schema Validator'>
<p>Property information:</p>
<table>
<tr>
<th>Property Id</th>
<td>http://apache.org/xml/properties/internal/validator/schema</td>
</tr>
<tr>
<th>Type</th>
<td>org.apache.xerces.impl.xs.XMLSchemaValidator</td>
</tr>
</table>
<p>Required properties:</p>
<ul>
<li>http://apache.org/xml/properties/internal/symbol-table</li>
<li>http://apache.org/xml/properties/internal/error-reporter</li>
<!--
- NOTE: The following properties are also required but the
- validation engine is being redesigned so I'm not
- listing them in the documentation.
<li>http://apache.org/xml/properties/internal/grammar-pool</li>
<li>http://apache.org/xml/properties/internal/datatype-validator-factory</li>
-->
</ul>
<p>Recognized features:</p>
<ul>
<li>http://xml.org/sax/features/namespaces</li>
<li>http://xml.org/sax/features/validation</li>
<li>http://apache.org/xml/features/validation/dynamic</li>
</ul>
<p>
The Schema Validator performs validation of the document events that
it receives which may augment the streaming information set with
default simple type values and normalizing simple type values.
</p>
</s2>
</s1>