| Method from org.apache.xerces.parsers.AbstractSAXParser Detail: |
public void attributeDecl(String elementName,
String attributeName,
String type,
String[] enumeration,
String defaultType,
XMLString defaultValue,
XMLString nonNormalizedDefaultValue,
Augmentations augs) throws XNIException {
try {
// SAX2 extension
if (fDeclHandler != null) {
// used as a key to detect duplicate attribute definitions.
String elemAttr = new StringBuffer(elementName).append("< ").append(attributeName).toString();
if(fDeclaredAttrs.get(elemAttr) != null) {
// we aren't permitted to return duplicate attribute definitions
return;
}
fDeclaredAttrs.put(elemAttr, Boolean.TRUE);
if (type.equals("NOTATION") ||
type.equals("ENUMERATION")) {
StringBuffer str = new StringBuffer();
if (type.equals("NOTATION")) {
str.append(type);
str.append(" (");
}
else {
str.append("(");
}
for (int i = 0; i < enumeration.length; i++) {
str.append(enumeration[i]);
if (i < enumeration.length - 1) {
str.append('|");
}
}
str.append(')");
type = str.toString();
}
String value = (defaultValue==null) ? null : defaultValue.toString();
fDeclHandler.attributeDecl(elementName, attributeName,
type, defaultType, value);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
An attribute declaration. |
public void characters(XMLString text,
Augmentations augs) throws XNIException {
// if type is union (XML Schema) it is possible that we receive
// character call with empty data
if (text.length == 0) {
return;
}
try {
// SAX1
if (fDocumentHandler != null) {
// REVISIT: should we support schema-normalized-value for SAX1 events
//
fDocumentHandler.characters(text.ch, text.offset, text.length);
}
// SAX2
if (fContentHandler != null) {
fContentHandler.characters(text.ch, text.offset, text.length);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
|
public void comment(XMLString text,
Augmentations augs) throws XNIException {
try {
// SAX2 extension
if (fLexicalHandler != null) {
fLexicalHandler.comment(text.ch, 0, text.length);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
|
public void doctypeDecl(String rootElement,
String publicId,
String systemId,
Augmentations augs) throws XNIException {
fInDTD = true;
try {
// SAX2 extension
if (fLexicalHandler != null) {
fLexicalHandler.startDTD(rootElement, publicId, systemId);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
// is there a DeclHandler?
if(fDeclHandler != null) {
fDeclaredAttrs = new SymbolHash();
}
}
Notifies of the presence of the DOCTYPE line in the document. |
public void elementDecl(String name,
String contentModel,
Augmentations augs) throws XNIException {
try {
// SAX2 extension
if (fDeclHandler != null) {
fDeclHandler.elementDecl(name, contentModel);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
|
public void endCDATA(Augmentations augs) throws XNIException {
try {
// SAX2 extension
if (fLexicalHandler != null) {
fLexicalHandler.endCDATA();
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
The end of a CDATA section. |
public void endDTD(Augmentations augs) throws XNIException {
fInDTD = false;
try {
// SAX2 extension
if (fLexicalHandler != null) {
fLexicalHandler.endDTD();
}
}
catch (SAXException e) {
throw new XNIException(e);
}
if(fDeclaredAttrs != null) {
// help out the GC
fDeclaredAttrs.clear();
}
}
|
public void endDocument(Augmentations augs) throws XNIException {
try {
// SAX1
if (fDocumentHandler != null) {
fDocumentHandler.endDocument();
}
// SAX2
if (fContentHandler != null) {
fContentHandler.endDocument();
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
|
public void endElement(QName element,
Augmentations augs) throws XNIException {
try {
// SAX1
if (fDocumentHandler != null) {
fDocumentHandler.endElement(element.rawname);
}
// SAX2
if (fContentHandler != null) {
fAugmentations = augs;
String uri = element.uri != null ? element.uri : "";
String localpart = fNamespaces ? element.localpart : "";
fContentHandler.endElement(uri, localpart,
element.rawname);
if (fNamespaces) {
endNamespaceMapping();
}
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
|
public void endExternalSubset(Augmentations augs) throws XNIException {
endParameterEntity("[dtd]", augs);
}
The end of the DTD external subset. |
public void endGeneralEntity(String name,
Augmentations augs) throws XNIException {
try {
// Only report endEntity if this entity was actually read.
if (augs == null || !Boolean.TRUE.equals(augs.getItem(Constants.ENTITY_SKIPPED))) {
// SAX2 extension
if (fLexicalHandler != null) {
fLexicalHandler.endEntity(name);
}
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
This method notifies the end of an entity. The DTD has the pseudo-name
of "[dtd]" parameter entity names start with '%'; and general entity
names are just the entity name.
Note: Since the document is an entity, the handler
will be notified of the end of the document entity by calling the
endEntity method with the entity name "[xml]" after calling
the endDocument method. When exposing entity boundaries through the
SAX API, the document entity is never reported, however.
Note: This method is not called for entity references
appearing as part of attribute values. |
protected final void endNamespaceMapping() throws SAXException {
int count = fNamespaceContext.getDeclaredPrefixCount();
if (count > 0) {
for (int i = 0; i < count; i++) {
fContentHandler.endPrefixMapping(fNamespaceContext.getDeclaredPrefixAt(i));
}
}
}
Send endPrefixMapping events |
public void endParameterEntity(String name,
Augmentations augs) throws XNIException {
try {
// Only report endEntity if this entity was actually read.
if (augs == null || !Boolean.TRUE.equals(augs.getItem(Constants.ENTITY_SKIPPED))) {
// SAX2 extension
if (fLexicalHandler != null && fLexicalHandlerParameterEntities) {
fLexicalHandler.endEntity(name);
}
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
This method notifies the end of an entity. The DTD has the pseudo-name
of "[dtd]" parameter entity names start with '%'; and general entity
names are just the entity name.
Note: Since the document is an entity, the handler
will be notified of the end of the document entity by calling the
endEntity method with the entity name "[xml]" after calling
the endDocument method. When exposing entity boundaries through the
SAX API, the document entity is never reported, however.
Note: This method is not called for entity references
appearing as part of attribute values. |
public void externalEntityDecl(String name,
XMLResourceIdentifier identifier,
Augmentations augs) throws XNIException {
try {
// SAX2 extension
if (fDeclHandler != null) {
String publicId = identifier.getPublicId();
String systemId = fResolveDTDURIs ?
identifier.getExpandedSystemId() : identifier.getLiteralSystemId();
fDeclHandler.externalEntityDecl(name, publicId, systemId);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
An external entity declaration. |
public AttributePSVI getAttributePSVI(int index) {
return (AttributePSVI)fAttributesProxy.fAttributes.getAugmentations(index).getItem(Constants.ATTRIBUTE_PSVI);
}
|
public AttributePSVI getAttributePSVIByName(String uri,
String localname) {
return (AttributePSVI)fAttributesProxy.fAttributes.getAugmentations(uri, localname).getItem(Constants.ATTRIBUTE_PSVI);
}
|
public ContentHandler getContentHandler() {
return fContentHandler;
}
Return the current content handler. |
public DTDHandler getDTDHandler() {
return fDTDHandler;
}
Return the current DTD handler. |
protected DeclHandler getDeclHandler() throws SAXNotSupportedException, SAXNotRecognizedException {
return fDeclHandler;
}
Returns the DTD declaration event handler. |
public ElementPSVI getElementPSVI() {
return (fAugmentations != null)?(ElementPSVI)fAugmentations.getItem(Constants.ELEMENT_PSVI):null;
}
|
public EntityResolver getEntityResolver() {
EntityResolver entityResolver = null;
try {
XMLEntityResolver xmlEntityResolver =
(XMLEntityResolver)fConfiguration.getProperty(ENTITY_RESOLVER);
if (xmlEntityResolver != null) {
if (xmlEntityResolver instanceof EntityResolverWrapper) {
entityResolver =
((EntityResolverWrapper) xmlEntityResolver).getEntityResolver();
}
else if (xmlEntityResolver instanceof EntityResolver2Wrapper) {
entityResolver =
((EntityResolver2Wrapper) xmlEntityResolver).getEntityResolver();
}
}
}
catch (XMLConfigurationException e) {
// do nothing
}
return entityResolver;
}
Return the current entity resolver. |
public ErrorHandler getErrorHandler() {
ErrorHandler errorHandler = null;
try {
XMLErrorHandler xmlErrorHandler =
(XMLErrorHandler)fConfiguration.getProperty(ERROR_HANDLER);
if (xmlErrorHandler != null &&
xmlErrorHandler instanceof ErrorHandlerWrapper) {
errorHandler = ((ErrorHandlerWrapper)xmlErrorHandler).getErrorHandler();
}
}
catch (XMLConfigurationException e) {
// do nothing
}
return errorHandler;
}
Return the current error handler. |
public boolean getFeature(String featureId) throws SAXNotSupportedException, SAXNotRecognizedException {
try {
//
// SAX2 Features
//
if (featureId.startsWith(Constants.SAX_FEATURE_PREFIX)) {
final int suffixLength = featureId.length() - Constants.SAX_FEATURE_PREFIX.length();
// http://xml.org/sax/features/namespace-prefixes
// controls the reporting of raw prefixed names and Namespace
// declarations (xmlns* attributes): when this feature is false
// (the default), raw prefixed names may optionally be reported,
// and xmlns* attributes must not be reported.
//
if (suffixLength == Constants.NAMESPACE_PREFIXES_FEATURE.length() &&
featureId.endsWith(Constants.NAMESPACE_PREFIXES_FEATURE)) {
return fNamespacePrefixes;
}
// http://xml.org/sax/features/string-interning
// controls the use of java.lang.String#intern() for strings
// passed to SAX handlers.
//
if (suffixLength == Constants.STRING_INTERNING_FEATURE.length() &&
featureId.endsWith(Constants.STRING_INTERNING_FEATURE)) {
return true;
}
// http://xml.org/sax/features/is-standalone
// reports whether the document specified a standalone document declaration.
//
if (suffixLength == Constants.IS_STANDALONE_FEATURE.length() &&
featureId.endsWith(Constants.IS_STANDALONE_FEATURE)) {
return fStandalone;
}
// http://xml.org/sax/features/xml-1.1
// reports whether the parser supports both XML 1.1 and XML 1.0.
//
if (suffixLength == Constants.XML_11_FEATURE.length() &&
featureId.endsWith(Constants.XML_11_FEATURE)) {
return (fConfiguration instanceof XML11Configurable);
}
// http://xml.org/sax/features/lexical-handler/parameter-entities
// controls whether the beginning and end of parameter entities
// will be reported to the LexicalHandler.
//
if (suffixLength == Constants.LEXICAL_HANDLER_PARAMETER_ENTITIES_FEATURE.length() &&
featureId.endsWith(Constants.LEXICAL_HANDLER_PARAMETER_ENTITIES_FEATURE)) {
return fLexicalHandlerParameterEntities;
}
// http://xml.org/sax/features/resolve-dtd-uris
// controls whether system identifiers will be absolutized relative to
// their base URIs before reporting.
if (suffixLength == Constants.RESOLVE_DTD_URIS_FEATURE.length() &&
featureId.endsWith(Constants.RESOLVE_DTD_URIS_FEATURE)) {
return fResolveDTDURIs;
}
// http://xml.org/sax/features/xmlns-uris
// controls whether the parser reports that namespace declaration
// attributes as being in the namespace: http://www.w3.org/2000/xmlns/
//
if (suffixLength == Constants.XMLNS_URIS_FEATURE.length() &&
featureId.endsWith(Constants.XMLNS_URIS_FEATURE)) {
return fXMLNSURIs;
}
// http://xml.org/sax/features/unicode-normalization-checking
// controls whether Unicode normalization checking is performed
// as per Appendix B of the XML 1.1 specification
//
if (suffixLength == Constants.UNICODE_NORMALIZATION_CHECKING_FEATURE.length() &&
featureId.endsWith(Constants.UNICODE_NORMALIZATION_CHECKING_FEATURE)) {
// REVISIT: Allow this feature to be set once Unicode normalization
// checking is supported -- mrglavas.
return false;
}
// http://xml.org/sax/features/use-entity-resolver2
// controls whether the methods of an object implementing
// org.xml.sax.ext.EntityResolver2 will be used by the parser.
//
if (suffixLength == Constants.USE_ENTITY_RESOLVER2_FEATURE.length() &&
featureId.endsWith(Constants.USE_ENTITY_RESOLVER2_FEATURE)) {
return fUseEntityResolver2;
}
// http://xml.org/sax/features/use-attributes2
// reports whether Attributes objects passed to startElement also implement
// the org.xml.sax.ext.Attributes2 interface.
// http://xml.org/sax/features/use-locator2
// reports whether Locator objects passed to setDocumentLocator also implement
// the org.xml.sax.ext.Locator2 interface.
//
if ((suffixLength == Constants.USE_ATTRIBUTES2_FEATURE.length() &&
featureId.endsWith(Constants.USE_ATTRIBUTES2_FEATURE)) ||
(suffixLength == Constants.USE_LOCATOR2_FEATURE.length() &&
featureId.endsWith(Constants.USE_LOCATOR2_FEATURE))) {
return true;
}
//
// Drop through and perform default processing
//
}
//
// Xerces Features
//
/*
else if (featureId.startsWith(XERCES_FEATURES_PREFIX)) {
//
// Drop through and perform default processing
//
}
*/
return fConfiguration.getFeature(featureId);
}
catch (XMLConfigurationException e) {
String identifier = e.getIdentifier();
if (e.getType() == XMLConfigurationException.NOT_RECOGNIZED) {
throw new SAXNotRecognizedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"feature-not-recognized", new Object [] {identifier}));
}
else {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"feature-not-supported", new Object [] {identifier}));
}
}
}
Query the state of a feature.
Query the current state of any feature in a SAX2 parser. The
parser might not recognize the feature. |
protected LexicalHandler getLexicalHandler() throws SAXNotSupportedException, SAXNotRecognizedException {
return fLexicalHandler;
}
Returns the lexical handler. |
public Object getProperty(String propertyId) throws SAXNotSupportedException, SAXNotRecognizedException {
try {
//
// SAX2 core properties
//
if (propertyId.startsWith(Constants.SAX_PROPERTY_PREFIX)) {
final int suffixLength = propertyId.length() - Constants.SAX_PROPERTY_PREFIX.length();
//
// http://xml.org/sax/properties/document-xml-version
// Value type: java.lang.String
// Access: read-only
// The literal string describing the actual XML version of the document.
//
if (suffixLength == Constants.DOCUMENT_XML_VERSION_PROPERTY.length() &&
propertyId.endsWith(Constants.DOCUMENT_XML_VERSION_PROPERTY)) {
return fVersion;
}
//
// http://xml.org/sax/properties/lexical-handler
// Value type: org.xml.sax.ext.LexicalHandler
// Access: read/write, pre-parse only
// Set the lexical event handler.
//
if (suffixLength == Constants.LEXICAL_HANDLER_PROPERTY.length() &&
propertyId.endsWith(Constants.LEXICAL_HANDLER_PROPERTY)) {
return getLexicalHandler();
}
//
// http://xml.org/sax/properties/declaration-handler
// Value type: org.xml.sax.ext.DeclHandler
// Access: read/write, pre-parse only
// Set the DTD declaration event handler.
//
if (suffixLength == Constants.DECLARATION_HANDLER_PROPERTY.length() &&
propertyId.endsWith(Constants.DECLARATION_HANDLER_PROPERTY)) {
return getDeclHandler();
}
//
// http://xml.org/sax/properties/dom-node
// Value type: DOM Node
// Access: read-only
// Get the DOM node currently being visited, if the SAX parser is
// iterating over a DOM tree. If the parser recognises and
// supports this property but is not currently visiting a DOM
// node, it should return null (this is a good way to check for
// availability before the parse begins).
//
if (suffixLength == Constants.DOM_NODE_PROPERTY.length() &&
propertyId.endsWith(Constants.DOM_NODE_PROPERTY)) {
// we are not iterating a DOM tree
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"dom-node-read-not-supported", null));
}
//
// Drop through and perform default processing
//
}
//
// Xerces properties
//
/*
else if (propertyId.startsWith(XERCES_PROPERTIES_PREFIX)) {
//
// Drop through and perform default processing
//
}
*/
//
// Perform default processing
//
return fConfiguration.getProperty(propertyId);
}
catch (XMLConfigurationException e) {
String identifier = e.getIdentifier();
if (e.getType() == XMLConfigurationException.NOT_RECOGNIZED) {
throw new SAXNotRecognizedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"property-not-recognized", new Object [] {identifier}));
}
else {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"property-not-supported", new Object [] {identifier}));
}
}
}
Query the value of a property.
Return the current value of a property in a SAX2 parser.
The parser might not recognize the property. |
public void ignorableWhitespace(XMLString text,
Augmentations augs) throws XNIException {
try {
// SAX1
if (fDocumentHandler != null) {
fDocumentHandler.ignorableWhitespace(text.ch, text.offset, text.length);
}
// SAX2
if (fContentHandler != null) {
fContentHandler.ignorableWhitespace(text.ch, text.offset, text.length);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
Ignorable whitespace. For this method to be called, the document
source must have some way of determining that the text containing
only whitespace characters should be considered ignorable. For
example, the validator can determine if a length of whitespace
characters in the document are ignorable based on the element
content model. |
public void internalEntityDecl(String name,
XMLString text,
XMLString nonNormalizedText,
Augmentations augs) throws XNIException {
try {
// SAX2 extensions
if (fDeclHandler != null) {
fDeclHandler.internalEntityDecl(name, text.toString());
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
An internal entity declaration. |
public void notationDecl(String name,
XMLResourceIdentifier identifier,
Augmentations augs) throws XNIException {
try {
// SAX1 and SAX2
if (fDTDHandler != null) {
String publicId = identifier.getPublicId();
String systemId = fResolveDTDURIs ?
identifier.getExpandedSystemId() : identifier.getLiteralSystemId();
fDTDHandler.notationDecl(name, publicId, systemId);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
|
public void parse(String systemId) throws IOException, SAXException {
// parse document
XMLInputSource source = new XMLInputSource(null, systemId, null);
try {
parse(source);
}
// wrap XNI exceptions as SAX exceptions
catch (XMLParseException e) {
Exception ex = e.getException();
if (ex == null || ex instanceof CharConversionException) {
// must be a parser exception; mine it for locator info
// and throw a SAXParseException
Locator2Impl locatorImpl = new Locator2Impl();
// since XMLParseExceptions know nothing about encoding,
// we cannot return anything meaningful in this context.
// We *could* consult the LocatorProxy, but the
// application can do this itself if it wishes to possibly
// be mislead.
locatorImpl.setXMLVersion(fVersion);
locatorImpl.setPublicId(e.getPublicId());
locatorImpl.setSystemId(e.getExpandedSystemId());
locatorImpl.setLineNumber(e.getLineNumber());
locatorImpl.setColumnNumber(e.getColumnNumber());
throw (ex == null) ?
new SAXParseException(e.getMessage(), locatorImpl) :
new SAXParseException(e.getMessage(), locatorImpl, ex);
}
if (ex instanceof SAXException) {
// why did we create an XMLParseException?
throw (SAXException)ex;
}
if (ex instanceof IOException) {
throw (IOException)ex;
}
throw new SAXException(ex);
}
catch (XNIException e) {
Exception ex = e.getException();
if (ex == null) {
throw new SAXException(e.getMessage());
}
if (ex instanceof SAXException) {
throw (SAXException)ex;
}
if (ex instanceof IOException) {
throw (IOException)ex;
}
throw new SAXException(ex);
}
}
parse(new InputSource(systemId));
|
public void parse(InputSource inputSource) throws IOException, SAXException {
// parse document
try {
XMLInputSource xmlInputSource =
new XMLInputSource(inputSource.getPublicId(),
inputSource.getSystemId(),
null);
xmlInputSource.setByteStream(inputSource.getByteStream());
xmlInputSource.setCharacterStream(inputSource.getCharacterStream());
xmlInputSource.setEncoding(inputSource.getEncoding());
parse(xmlInputSource);
}
// wrap XNI exceptions as SAX exceptions
catch (XMLParseException e) {
Exception ex = e.getException();
if (ex == null || ex instanceof CharConversionException) {
// must be a parser exception; mine it for locator info
// and throw a SAXParseException
Locator2Impl locatorImpl = new Locator2Impl();
// since XMLParseExceptions know nothing about encoding,
// we cannot return anything meaningful in this context.
// We *could* consult the LocatorProxy, but the
// application can do this itself if it wishes to possibly
// be mislead.
locatorImpl.setXMLVersion(fVersion);
locatorImpl.setPublicId(e.getPublicId());
locatorImpl.setSystemId(e.getExpandedSystemId());
locatorImpl.setLineNumber(e.getLineNumber());
locatorImpl.setColumnNumber(e.getColumnNumber());
throw (ex == null) ?
new SAXParseException(e.getMessage(), locatorImpl) :
new SAXParseException(e.getMessage(), locatorImpl, ex);
}
if (ex instanceof SAXException) {
// why did we create an XMLParseException?
throw (SAXException)ex;
}
if (ex instanceof IOException) {
throw (IOException)ex;
}
throw new SAXException(ex);
}
catch (XNIException e) {
Exception ex = e.getException();
if (ex == null) {
throw new SAXException(e.getMessage());
}
if (ex instanceof SAXException) {
throw (SAXException)ex;
}
if (ex instanceof IOException) {
throw (IOException)ex;
}
throw new SAXException(ex);
}
}
|
public void processingInstruction(String target,
XMLString data,
Augmentations augs) throws XNIException {
//
// REVISIT - I keep running into SAX apps that expect
// null data to be an empty string, which is contrary
// to the comment for this method in the SAX API.
//
try {
// SAX1
if (fDocumentHandler != null) {
fDocumentHandler.processingInstruction(target,
data.toString());
}
// SAX2
if (fContentHandler != null) {
fContentHandler.processingInstruction(target, data.toString());
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
A processing instruction. Processing instructions consist of a
target name and, optionally, text data. The data is only meaningful
to the application.
Typically, a processing instruction's data will contain a series
of pseudo-attributes. These pseudo-attributes follow the form of
element attributes but are not parsed or presented
to the application as anything other than text. The application is
responsible for parsing the data. |
public void reset() throws XNIException {
super.reset();
// reset state
fInDTD = false;
fVersion = "1.0";
fStandalone = false;
// features
fNamespaces = fConfiguration.getFeature(NAMESPACES);
fAugmentations = null;
fDeclaredAttrs = null;
}
Reset all components before parsing. |
public void setContentHandler(ContentHandler contentHandler) {
fContentHandler = contentHandler;
}
Allow an application to register a content event handler.
If the application does not register a content handler, all
content events reported by the SAX parser will be silently
ignored.
Applications may register a new or different handler in the
middle of a parse, and the SAX parser must begin using the new
handler immediately. |
public void setDTDHandler(DTDHandler dtdHandler) {
fDTDHandler = dtdHandler;
}
Allow an application to register a DTD event handler.
If the application does not register a DTD handler, all DTD
events reported by the SAX parser will be silently ignored.
Applications may register a new or different handler in the
middle of a parse, and the SAX parser must begin using the new
handler immediately. |
protected void setDeclHandler(DeclHandler handler) throws SAXNotSupportedException, SAXNotRecognizedException {
if (fParseInProgress) {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"property-not-parsing-supported",
new Object [] {"http://xml.org/sax/properties/declaration-handler"}));
}
fDeclHandler = handler;
}
http://xml.org/sax/properties/declaration-handler
|
public void setDocumentHandler(DocumentHandler documentHandler) {
fDocumentHandler = documentHandler;
}
Allow an application to register a document event handler.
If the application does not register a document handler, all
document events reported by the SAX parser will be silently
ignored (this is the default behaviour implemented by
HandlerBase).
Applications may register a new or different handler in the
middle of a parse, and the SAX parser must begin using the new
handler immediately. |
public void setEntityResolver(EntityResolver resolver) {
try {
XMLEntityResolver xer = (XMLEntityResolver) fConfiguration.getProperty(ENTITY_RESOLVER);
if (fUseEntityResolver2 && resolver instanceof EntityResolver2) {
if (xer instanceof EntityResolver2Wrapper) {
EntityResolver2Wrapper er2w = (EntityResolver2Wrapper) xer;
er2w.setEntityResolver((EntityResolver2) resolver);
}
else {
fConfiguration.setProperty(ENTITY_RESOLVER,
new EntityResolver2Wrapper((EntityResolver2) resolver));
}
}
else {
if (xer instanceof EntityResolverWrapper) {
EntityResolverWrapper erw = (EntityResolverWrapper) xer;
erw.setEntityResolver(resolver);
}
else {
fConfiguration.setProperty(ENTITY_RESOLVER,
new EntityResolverWrapper(resolver));
}
}
}
catch (XMLConfigurationException e) {
// do nothing
}
}
Sets the resolver used to resolve external entities. The EntityResolver
interface supports resolution of public and system identifiers. |
public void setErrorHandler(ErrorHandler errorHandler) {
try {
XMLErrorHandler xeh = (XMLErrorHandler) fConfiguration.getProperty(ERROR_HANDLER);
if (xeh instanceof ErrorHandlerWrapper) {
ErrorHandlerWrapper ehw = (ErrorHandlerWrapper) xeh;
ehw.setErrorHandler(errorHandler);
}
else {
fConfiguration.setProperty(ERROR_HANDLER,
new ErrorHandlerWrapper(errorHandler));
}
}
catch (XMLConfigurationException e) {
// do nothing
}
}
Allow an application to register an error event handler.
If the application does not register an error handler, all
error events reported by the SAX parser will be silently
ignored; however, normal processing may not continue. It is
highly recommended that all SAX applications implement an
error handler to avoid unexpected bugs.
Applications may register a new or different handler in the
middle of a parse, and the SAX parser must begin using the new
handler immediately. |
public void setFeature(String featureId,
boolean state) throws SAXNotSupportedException, SAXNotRecognizedException {
try {
//
// SAX2 Features
//
if (featureId.startsWith(Constants.SAX_FEATURE_PREFIX)) {
final int suffixLength = featureId.length() - Constants.SAX_FEATURE_PREFIX.length();
// http://xml.org/sax/features/namespaces
if (suffixLength == Constants.NAMESPACES_FEATURE.length() &&
featureId.endsWith(Constants.NAMESPACES_FEATURE)) {
fConfiguration.setFeature(featureId, state);
fNamespaces = state;
return;
}
// http://xml.org/sax/features/namespace-prefixes
// controls the reporting of raw prefixed names and Namespace
// declarations (xmlns* attributes): when this feature is false
// (the default), raw prefixed names may optionally be reported,
// and xmlns* attributes must not be reported.
//
if (suffixLength == Constants.NAMESPACE_PREFIXES_FEATURE.length() &&
featureId.endsWith(Constants.NAMESPACE_PREFIXES_FEATURE)) {
fNamespacePrefixes = state;
return;
}
// http://xml.org/sax/features/string-interning
// controls the use of java.lang.String#intern() for strings
// passed to SAX handlers.
//
if (suffixLength == Constants.STRING_INTERNING_FEATURE.length() &&
featureId.endsWith(Constants.STRING_INTERNING_FEATURE)) {
if (!state) {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"false-not-supported", new Object [] {featureId}));
}
return;
}
// http://xml.org/sax/features/lexical-handler/parameter-entities
// controls whether the beginning and end of parameter entities
// will be reported to the LexicalHandler.
//
if (suffixLength == Constants.LEXICAL_HANDLER_PARAMETER_ENTITIES_FEATURE.length() &&
featureId.endsWith(Constants.LEXICAL_HANDLER_PARAMETER_ENTITIES_FEATURE)) {
fLexicalHandlerParameterEntities = state;
return;
}
// http://xml.org/sax/features/resolve-dtd-uris
// controls whether system identifiers will be absolutized relative to
// their base URIs before reporting.
//
if (suffixLength == Constants.RESOLVE_DTD_URIS_FEATURE.length() &&
featureId.endsWith(Constants.RESOLVE_DTD_URIS_FEATURE)) {
fResolveDTDURIs = state;
return;
}
// http://xml.org/sax/features/unicode-normalization-checking
// controls whether Unicode normalization checking is performed
// as per Appendix B of the XML 1.1 specification
//
if (suffixLength == Constants.UNICODE_NORMALIZATION_CHECKING_FEATURE.length() &&
featureId.endsWith(Constants.UNICODE_NORMALIZATION_CHECKING_FEATURE)) {
// REVISIT: Allow this feature to be set once Unicode normalization
// checking is supported -- mrglavas.
if (state) {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"true-not-supported", new Object [] {featureId}));
}
return;
}
// http://xml.org/sax/features/xmlns-uris
// controls whether the parser reports that namespace declaration
// attributes as being in the namespace: http://www.w3.org/2000/xmlns/
//
if (suffixLength == Constants.XMLNS_URIS_FEATURE.length() &&
featureId.endsWith(Constants.XMLNS_URIS_FEATURE)) {
fXMLNSURIs = state;
return;
}
// http://xml.org/sax/features/use-entity-resolver2
// controls whether the methods of an object implementing
// org.xml.sax.ext.EntityResolver2 will be used by the parser.
//
if (suffixLength == Constants.USE_ENTITY_RESOLVER2_FEATURE.length() &&
featureId.endsWith(Constants.USE_ENTITY_RESOLVER2_FEATURE)) {
if (state != fUseEntityResolver2) {
fUseEntityResolver2 = state;
// Refresh EntityResolver wrapper.
setEntityResolver(getEntityResolver());
}
return;
}
//
// Read only features.
//
// http://xml.org/sax/features/is-standalone
// reports whether the document specified a standalone document declaration.
// http://xml.org/sax/features/use-attributes2
// reports whether Attributes objects passed to startElement also implement
// the org.xml.sax.ext.Attributes2 interface.
// http://xml.org/sax/features/use-locator2
// reports whether Locator objects passed to setDocumentLocator also implement
// the org.xml.sax.ext.Locator2 interface.
// http://xml.org/sax/features/xml-1.1
// reports whether the parser supports both XML 1.1 and XML 1.0.
if ((suffixLength == Constants.IS_STANDALONE_FEATURE.length() &&
featureId.endsWith(Constants.IS_STANDALONE_FEATURE)) ||
(suffixLength == Constants.USE_ATTRIBUTES2_FEATURE.length() &&
featureId.endsWith(Constants.USE_ATTRIBUTES2_FEATURE)) ||
(suffixLength == Constants.USE_LOCATOR2_FEATURE.length() &&
featureId.endsWith(Constants.USE_LOCATOR2_FEATURE)) ||
(suffixLength == Constants.XML_11_FEATURE.length() &&
featureId.endsWith(Constants.XML_11_FEATURE))) {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"feature-read-only", new Object [] {featureId}));
}
//
// Drop through and perform default processing
//
}
//
// Xerces Features
//
/*
else if (featureId.startsWith(XERCES_FEATURES_PREFIX)) {
String feature = featureId.substring(XERCES_FEATURES_PREFIX.length());
//
// Drop through and perform default processing
//
}
*/
//
// Default handling
//
fConfiguration.setFeature(featureId, state);
}
catch (XMLConfigurationException e) {
String identifier = e.getIdentifier();
if (e.getType() == XMLConfigurationException.NOT_RECOGNIZED) {
throw new SAXNotRecognizedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"feature-not-recognized", new Object [] {identifier}));
}
else {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"feature-not-supported", new Object [] {identifier}));
}
}
}
Set the state of any feature in a SAX2 parser. The parser
might not recognize the feature, and if it does recognize
it, it might not be able to fulfill the request. |
protected void setLexicalHandler(LexicalHandler handler) throws SAXNotSupportedException, SAXNotRecognizedException {
if (fParseInProgress) {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"property-not-parsing-supported",
new Object [] {"http://xml.org/sax/properties/lexical-handler"}));
}
fLexicalHandler = handler;
}
http://xml.org/sax/properties/lexical-handler
|
public void setLocale(Locale locale) throws SAXException {
//REVISIT:this methods is not part of SAX2 interfaces, we should throw exception
//if any application uses SAX2 and sets locale also. -nb
fConfiguration.setLocale(locale);
}
Set the locale to use for messages. |
public void setProperty(String propertyId,
Object value) throws SAXNotSupportedException, SAXNotRecognizedException {
try {
//
// SAX2 core properties
//
if (propertyId.startsWith(Constants.SAX_PROPERTY_PREFIX)) {
final int suffixLength = propertyId.length() - Constants.SAX_PROPERTY_PREFIX.length();
//
// http://xml.org/sax/properties/lexical-handler
// Value type: org.xml.sax.ext.LexicalHandler
// Access: read/write, pre-parse only
// Set the lexical event handler.
//
if (suffixLength == Constants.LEXICAL_HANDLER_PROPERTY.length() &&
propertyId.endsWith(Constants.LEXICAL_HANDLER_PROPERTY)) {
try {
setLexicalHandler((LexicalHandler)value);
}
catch (ClassCastException e) {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"incompatible-class", new Object [] {propertyId, "org.xml.sax.ext.LexicalHandler"}));
}
return;
}
//
// http://xml.org/sax/properties/declaration-handler
// Value type: org.xml.sax.ext.DeclHandler
// Access: read/write, pre-parse only
// Set the DTD declaration event handler.
//
if (suffixLength == Constants.DECLARATION_HANDLER_PROPERTY.length() &&
propertyId.endsWith(Constants.DECLARATION_HANDLER_PROPERTY)) {
try {
setDeclHandler((DeclHandler)value);
}
catch (ClassCastException e) {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"incompatible-class", new Object [] {propertyId, "org.xml.sax.ext.DeclHandler"}));
}
return;
}
//
// http://xml.org/sax/properties/dom-node
// Value type: DOM Node
// Access: read-only
// Get the DOM node currently being visited, if the SAX parser is
// iterating over a DOM tree. If the parser recognises and
// supports this property but is not currently visiting a DOM
// node, it should return null (this is a good way to check for
// availability before the parse begins).
// http://xml.org/sax/properties/document-xml-version
// Value type: java.lang.String
// Access: read-only
// The literal string describing the actual XML version of the document.
//
if ((suffixLength == Constants.DOM_NODE_PROPERTY.length() &&
propertyId.endsWith(Constants.DOM_NODE_PROPERTY)) ||
(suffixLength == Constants.DOCUMENT_XML_VERSION_PROPERTY.length() &&
propertyId.endsWith(Constants.DOCUMENT_XML_VERSION_PROPERTY))) {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"property-read-only", new Object [] {propertyId}));
}
//
// Drop through and perform default processing
//
}
//
// Xerces Properties
//
/*
else if (propertyId.startsWith(XERCES_PROPERTIES_PREFIX)) {
//
// Drop through and perform default processing
//
}
*/
//
// Perform default processing
//
fConfiguration.setProperty(propertyId, value);
}
catch (XMLConfigurationException e) {
String identifier = e.getIdentifier();
if (e.getType() == XMLConfigurationException.NOT_RECOGNIZED) {
throw new SAXNotRecognizedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"property-not-recognized", new Object [] {identifier}));
}
else {
throw new SAXNotSupportedException(
SAXMessageFormatter.formatMessage(fConfiguration.getLocale(),
"property-not-supported", new Object [] {identifier}));
}
}
}
Set the value of any property in a SAX2 parser. The parser
might not recognize the property, and if it does recognize
it, it might not support the requested value. |
public void startCDATA(Augmentations augs) throws XNIException {
try {
// SAX2 extension
if (fLexicalHandler != null) {
fLexicalHandler.startCDATA();
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
The start of a CDATA section. |
public void startDocument(XMLLocator locator,
String encoding,
NamespaceContext namespaceContext,
Augmentations augs) throws XNIException {
fNamespaceContext = namespaceContext;
try {
// SAX1
if (fDocumentHandler != null) {
if (locator != null) {
fDocumentHandler.setDocumentLocator(new LocatorProxy(locator));
}
fDocumentHandler.startDocument();
}
// SAX2
if (fContentHandler != null) {
if (locator != null) {
fContentHandler.setDocumentLocator(new LocatorProxy(locator));
}
fContentHandler.startDocument();
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
The start of the document. |
public void startElement(QName element,
XMLAttributes attributes,
Augmentations augs) throws XNIException {
try {
// SAX1
if (fDocumentHandler != null) {
// REVISIT: should we support schema-normalized-value for SAX1 events
//
fAttributesProxy.setAttributes(attributes);
fDocumentHandler.startElement(element.rawname, fAttributesProxy);
}
// SAX2
if (fContentHandler != null) {
if (fNamespaces) {
// send prefix mapping events
startNamespaceMapping();
// REVISIT: It should not be necessary to iterate over the attribute
// list when the set of [namespace attributes] is empty for this
// element. This should be computable from the NamespaceContext, but
// since we currently don't report the mappings for the xml prefix
// we cannot use the declared prefix count for the current context
// to skip this section. -- mrglavas
int len = attributes.getLength();
if (!fNamespacePrefixes) {
for (int i = len - 1; i >= 0; --i) {
attributes.getName(i, fQName);
if ((fQName.prefix == XMLSymbols.PREFIX_XMLNS) ||
(fQName.rawname == XMLSymbols.PREFIX_XMLNS)) {
// remove namespace declaration attributes
attributes.removeAttributeAt(i);
}
}
}
else if (!fXMLNSURIs) {
for (int i = len - 1; i >= 0; --i) {
attributes.getName(i, fQName);
if ((fQName.prefix == XMLSymbols.PREFIX_XMLNS) ||
(fQName.rawname == XMLSymbols.PREFIX_XMLNS)) {
// localpart should be empty string as per SAX documentation:
// http://www.saxproject.org/?selected=namespaces
fQName.prefix = "";
fQName.uri = "";
fQName.localpart = "";
attributes.setName(i, fQName);
}
}
}
}
fAugmentations = augs;
String uri = element.uri != null ? element.uri : "";
String localpart = fNamespaces ? element.localpart : "";
fAttributesProxy.setAttributes(attributes);
fContentHandler.startElement(uri, localpart, element.rawname,
fAttributesProxy);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
The start of an element. If the document specifies the start element
by using an empty tag, then the startElement method will immediately
be followed by the endElement method, with no intervening methods. |
public void startExternalSubset(XMLResourceIdentifier identifier,
Augmentations augs) throws XNIException {
startParameterEntity("[dtd]", null, null, augs);
}
The start of the DTD external subset. |
public void startGeneralEntity(String name,
XMLResourceIdentifier identifier,
String encoding,
Augmentations augs) throws XNIException {
try {
// Only report startEntity if this entity was actually read.
if (augs != null && Boolean.TRUE.equals(augs.getItem(Constants.ENTITY_SKIPPED))) {
// report skipped entity to content handler
if (fContentHandler != null) {
fContentHandler.skippedEntity(name);
}
}
else {
// SAX2 extension
if (fLexicalHandler != null) {
fLexicalHandler.startEntity(name);
}
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
This method notifies of the start of an entity. The DTD has the
pseudo-name of "[dtd]" parameter entity names start with '%'; and
general entity names are just the entity name.
Note: Since the document is an entity, the handler
will be notified of the start of the document entity by calling the
startEntity method with the entity name "[xml]" before calling
the startDocument method. When exposing entity boundaries through the
SAX API, the document entity is never reported, however.
Note: This method is not called for entity references
appearing as part of attribute values. |
protected final void startNamespaceMapping() throws SAXException {
int count = fNamespaceContext.getDeclaredPrefixCount();
if (count > 0) {
String prefix = null;
String uri = null;
for (int i = 0; i < count; i++) {
prefix = fNamespaceContext.getDeclaredPrefixAt(i);
uri = fNamespaceContext.getURI(prefix);
fContentHandler.startPrefixMapping(prefix,
(uri == null) ? "" : uri);
}
}
}
Send startPrefixMapping events |
public void startParameterEntity(String name,
XMLResourceIdentifier identifier,
String encoding,
Augmentations augs) throws XNIException {
try {
// Only report startEntity if this entity was actually read.
if (augs != null && Boolean.TRUE.equals(augs.getItem(Constants.ENTITY_SKIPPED))) {
// report skipped entity to content handler
if (fContentHandler != null) {
fContentHandler.skippedEntity(name);
}
}
else {
// SAX2 extension
if (fLexicalHandler != null && fLexicalHandlerParameterEntities) {
fLexicalHandler.startEntity(name);
}
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
This method notifies of the start of parameter entity. The DTD has the
pseudo-name of "[dtd]" parameter entity names start with '%'; and
general entity names are just the entity name.
Note: Since the document is an entity, the handler
will be notified of the start of the document entity by calling the
startEntity method with the entity name "[xml]" before calling
the startDocument method. When exposing entity boundaries through the
SAX API, the document entity is never reported, however.
Note: This method is not called for entity references
appearing as part of attribute values. |
public void unparsedEntityDecl(String name,
XMLResourceIdentifier identifier,
String notation,
Augmentations augs) throws XNIException {
try {
// SAX2 extension
if (fDTDHandler != null) {
String publicId = identifier.getPublicId();
String systemId = fResolveDTDURIs ?
identifier.getExpandedSystemId() : identifier.getLiteralSystemId();
fDTDHandler.unparsedEntityDecl(name, publicId, systemId, notation);
}
}
catch (SAXException e) {
throw new XNIException(e);
}
}
An unparsed entity declaration. |
public void xmlDecl(String version,
String encoding,
String standalone,
Augmentations augs) throws XNIException {
// the version need only be set once; if
// document's XML 1.0|1.1, that's how it'll stay
fVersion = version;
fStandalone = "yes".equals(standalone);
}
Notifies of the presence of an XMLDecl line in the document. If
present, this method will be called immediately following the
startDocument call. |