* The parser can use this method to instruct this configuration * to begin parsing an XML document from any valid input source * (a character stream, a byte stream, or a URI). *
* Parsers may not invoke this method while a parse is in progress. * Once a parse is complete, the parser may then parse another XML * document. *
* This method is synchronous: it will not return until parsing * has ended. If a client application wants to terminate * parsing early, it should throw an exception. * * @param source The input source for the top-level of the * XML document. * * @exception XNIException Any XNI exception, possibly wrapping * another exception. * @exception IOException An IO exception from the parser, possibly * from a byte stream or character stream * supplied by the parser. */ public void parse(XMLInputSource inputSource) throws XNIException, IOException{ // no-op } /** * Sets the document handler on the last component in the pipeline * to receive information about the document. * * @param documentHandler The document handler. */ public void setDocumentHandler(XMLDocumentHandler documentHandler) { fDocumentHandler = documentHandler; } // setDocumentHandler(XMLDocumentHandler) /** Returns the registered document handler. */ public XMLDocumentHandler getDocumentHandler() { return fDocumentHandler; } // getDocumentHandler():XMLDocumentHandler /** * Sets the DTD handler. * * @param dtdHandler The DTD handler. */ public void setDTDHandler(XMLDTDHandler dtdHandler) { //no-op } // setDTDHandler(XMLDTDHandler) /** Returns the registered DTD handler. */ public XMLDTDHandler getDTDHandler() { return null; } // getDTDHandler():XMLDTDHandler /** * Sets the DTD content model handler. * * @param handler The DTD content model handler. */ public void setDTDContentModelHandler(XMLDTDContentModelHandler handler) { //no-op } // setDTDContentModelHandler(XMLDTDContentModelHandler) /** Returns the registered DTD content model handler. */ public XMLDTDContentModelHandler getDTDContentModelHandler() { return null; } // getDTDContentModelHandler():XMLDTDContentModelHandler /** * Sets the resolver used to resolve external entities. The EntityResolver * interface supports resolution of public and system identifiers. * * @param resolver The new entity resolver. Passing a null value will * uninstall the currently installed resolver. */ public void setEntityResolver(XMLEntityResolver resolver) { if (resolver !=null) { fProperties.put(ENTITY_RESOLVER, resolver); } } // setEntityResolver(XMLEntityResolver) /** * Return the current entity resolver. * * @return The current entity resolver, or null if none * has been registered. * @see #setEntityResolver */ public XMLEntityResolver getEntityResolver() { return (XMLEntityResolver)fProperties.get(ENTITY_RESOLVER); } // getEntityResolver():XMLEntityResolver /** * 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.
* * @param errorHandler The error handler. * @exception java.lang.NullPointerException If the handler * argument is null. * @see #getErrorHandler */ public void setErrorHandler(XMLErrorHandler errorHandler) { if (errorHandler != null) { fProperties.put(ERROR_HANDLER, errorHandler); } } // setErrorHandler(XMLErrorHandler) /** * Return the current error handler. * * @return The current error handler, or null if none * has been registered. * @see #setErrorHandler */ public XMLErrorHandler getErrorHandler() { return (XMLErrorHandler)fProperties.get(ERROR_HANDLER); } // getErrorHandler():XMLErrorHandler /** * Set the state of a feature. * * 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. * * @param featureId The unique identifier (URI) of the feature. * @param state The requested state of the feature (true or false). * * @exception com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException If the * requested feature is not known. */ public void setFeature(String featureId, boolean state) throws XMLConfigurationException { // save state if noone "objects" super.setFeature(featureId, state); } // setFeature(String,boolean) /** * setProperty * * @param propertyId * @param value */ public void setProperty(String propertyId, Object value) throws XMLConfigurationException { // store value if noone "objects" super.setProperty(propertyId, value); } // setProperty(String,Object) /** * Set the locale to use for messages. * * @param locale The locale object to use for localization of messages. * * @exception XNIException Thrown if the parser does not support the * specified locale. */ public void setLocale(Locale locale) throws XNIException { fLocale = locale; fErrorReporter.setLocale(locale); } // setLocale(Locale) /** Returns the locale. */ public Locale getLocale() { return fLocale; } // getLocale():Locale /** * DOM Level 3 WD - Experimental. * setParameter */ public void setParameter(String name, Object value) throws DOMException { // REVISIT: Recognizes DOM L3 default features only. // Does not yet recognize Xerces features. if(value instanceof Boolean){ boolean state = ((Boolean)value).booleanValue(); if (name.equalsIgnoreCase(Constants.DOM_COMMENTS)) { features = (short) (state ? features | COMMENTS : features & ~COMMENTS); } else if (name.equalsIgnoreCase(Constants.DOM_DATATYPE_NORMALIZATION)) { setFeature(NORMALIZE_DATA, state); features = (short) (state ? features | DTNORMALIZATION : features & ~DTNORMALIZATION); if (state) { features = (short) (features | VALIDATE); } } else if (name.equalsIgnoreCase(Constants.DOM_NAMESPACES)) { features = (short) (state ? features | NAMESPACES : features & ~NAMESPACES); } else if (name.equalsIgnoreCase(Constants.DOM_CDATA_SECTIONS)) { features = (short) (state ? features | CDATA : features & ~CDATA); } else if (name.equalsIgnoreCase(Constants.DOM_ENTITIES)) { features = (short) (state ? features | ENTITIES : features & ~ENTITIES); } else if (name.equalsIgnoreCase(Constants.DOM_SPLIT_CDATA)) { features = (short) (state ? features | SPLITCDATA : features & ~SPLITCDATA); } else if (name.equalsIgnoreCase(Constants.DOM_VALIDATE)) { features = (short) (state ? features | VALIDATE : features & ~VALIDATE); } else if (name.equalsIgnoreCase(Constants.DOM_WELLFORMED)) { features = (short) (state ? features | WELLFORMED : features & ~WELLFORMED ); } else if (name.equalsIgnoreCase(Constants.DOM_INFOSET)) { // Setting to false has no effect. if (state) { features = (short) (features | INFOSET_TRUE_PARAMS); features = (short) (features & ~INFOSET_FALSE_PARAMS); setFeature(NORMALIZE_DATA, false); } } else if (name.equalsIgnoreCase(Constants.DOM_NORMALIZE_CHARACTERS) || name.equalsIgnoreCase(Constants.DOM_CANONICAL_FORM) || name.equalsIgnoreCase(Constants.DOM_VALIDATE_IF_SCHEMA) || name.equalsIgnoreCase(Constants.DOM_CHECK_CHAR_NORMALIZATION) ) { if (state) { // true is not supported String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "FEATURE_NOT_SUPPORTED", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } else if (name.equalsIgnoreCase(Constants.DOM_NAMESPACE_DECLARATIONS) || name.equalsIgnoreCase(Constants.DOM_ELEMENT_CONTENT_WHITESPACE)) { if (!state) { // false is not supported String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "FEATURE_NOT_SUPPORTED", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } else if (name.equalsIgnoreCase(SEND_PSVI) ){ // REVISIT: turning augmentation of PSVI is not support, // because in this case we won't be able to retrieve element // default value. if (!state) { // false is not supported String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "FEATURE_NOT_SUPPORTED", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } else if (name.equalsIgnoreCase(Constants.DOM_PSVI)){ features = (short) (state ? features | PSVI : features & ~PSVI); } else { String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "FEATURE_NOT_FOUND", new Object[] { name }); throw new DOMException(DOMException.NOT_FOUND_ERR, msg); } } else { // set properties if (name.equalsIgnoreCase(Constants.DOM_ERROR_HANDLER)) { if (value instanceof DOMErrorHandler || value == null) { fErrorHandlerWrapper.setErrorHandler((DOMErrorHandler)value); setErrorHandler(fErrorHandlerWrapper); } else { // REVISIT: type mismatch String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "TYPE_MISMATCH_ERR", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } else if (name.equalsIgnoreCase(Constants.DOM_RESOURCE_RESOLVER)) { if (value instanceof LSResourceResolver || value == null) { try { setEntityResolver(new DOMEntityResolverWrapper((LSResourceResolver) value)); } catch (XMLConfigurationException e) {} } else { // REVISIT: type mismatch String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "TYPE_MISMATCH_ERR", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } else if (name.equalsIgnoreCase(Constants.DOM_SCHEMA_LOCATION)) { if (value instanceof String || value == null) { try { String schemaType = (String) getProperty( Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE); if (schemaType == Constants.NS_XMLSCHEMA || value == null) { // map DOM schema-location to JAXP schemaSource property setProperty( Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_SOURCE, value); } else { // schemaType must not be null. // REVISIT: allow pre-parsing DTD grammars String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "FEATURE_NOT_SUPPORTED", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } catch (XMLConfigurationException e) {} } else { // REVISIT: type mismatch String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "TYPE_MISMATCH_ERR", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } else if (name.equalsIgnoreCase(Constants.DOM_SCHEMA_TYPE)) { if (value instanceof String || value == null) { try { if (value == null) { setProperty( Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE, null); } else if (value.equals(Constants.NS_XMLSCHEMA)) { // REVISIT: when add support to DTD validation setProperty( Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE, Constants.NS_XMLSCHEMA); } else if (value.equals(Constants.NS_DTD)) { // REVISIT: revalidation against DTDs is not supported String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "FEATURE_NOT_SUPPORTED", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } catch (XMLConfigurationException e) {} } else { String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "TYPE_MISMATCH_ERR", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } else if (name.equalsIgnoreCase(SYMBOL_TABLE)){ // Xerces Symbol Table if (value instanceof SymbolTable){ setProperty(SYMBOL_TABLE, value); } else { // REVISIT: type mismatch String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "TYPE_MISMATCH_ERR", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } else if (name.equalsIgnoreCase (GRAMMAR_POOL)){ if (value instanceof XMLGrammarPool){ setProperty(GRAMMAR_POOL, value); } else { // REVISIT: type mismatch String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "TYPE_MISMATCH_ERR", new Object[] { name }); throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); } } else { // REVISIT: check if this is a boolean parameter -- type mismatch should be thrown. //parameter is not recognized String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "FEATURE_NOT_FOUND", new Object[] { name }); throw new DOMException(DOMException.NOT_FOUND_ERR, msg); } } } /** * DOM Level 3 WD - Experimental. * getParameter */ public Object getParameter(String name) throws DOMException { // REVISIT: Recognizes DOM L3 default features only. // Does not yet recognize Xerces features. if (name.equalsIgnoreCase(Constants.DOM_COMMENTS)) { return ((features & COMMENTS) != 0) ? Boolean.TRUE : Boolean.FALSE; } else if (name.equalsIgnoreCase(Constants.DOM_NAMESPACES)) { return (features & NAMESPACES) != 0 ? Boolean.TRUE : Boolean.FALSE; } else if (name.equalsIgnoreCase(Constants.DOM_DATATYPE_NORMALIZATION)) { // REVISIT: datatype-normalization only takes effect if validation is on return (features & DTNORMALIZATION) != 0 ? Boolean.TRUE : Boolean.FALSE; } else if (name.equalsIgnoreCase(Constants.DOM_CDATA_SECTIONS)) { return (features & CDATA) != 0 ? Boolean.TRUE : Boolean.FALSE; } else if (name.equalsIgnoreCase(Constants.DOM_ENTITIES)) { return (features & ENTITIES) != 0 ? Boolean.TRUE : Boolean.FALSE; } else if (name.equalsIgnoreCase(Constants.DOM_SPLIT_CDATA)) { return (features & SPLITCDATA) != 0 ? Boolean.TRUE : Boolean.FALSE; } else if (name.equalsIgnoreCase(Constants.DOM_VALIDATE)) { return (features & VALIDATE) != 0 ? Boolean.TRUE : Boolean.FALSE; } else if (name.equalsIgnoreCase(Constants.DOM_WELLFORMED)) { return (features & WELLFORMED) != 0 ? Boolean.TRUE : Boolean.FALSE; } else if (name.equalsIgnoreCase(Constants.DOM_INFOSET)) { return (features & INFOSET_MASK) == INFOSET_TRUE_PARAMS ? Boolean.TRUE : Boolean.FALSE; } else if (name.equalsIgnoreCase(Constants.DOM_NORMALIZE_CHARACTERS) || name.equalsIgnoreCase(Constants.DOM_CANONICAL_FORM) || name.equalsIgnoreCase(Constants.DOM_VALIDATE_IF_SCHEMA) || name.equalsIgnoreCase(Constants.DOM_CHECK_CHAR_NORMALIZATION) ) { return Boolean.FALSE; } else if (name.equalsIgnoreCase(SEND_PSVI)) { return Boolean.TRUE; } else if (name.equalsIgnoreCase(Constants.DOM_PSVI)) { return (features & PSVI) != 0 ? Boolean.TRUE : Boolean.FALSE; } else if ( name.equalsIgnoreCase(Constants.DOM_NAMESPACE_DECLARATIONS) || name.equalsIgnoreCase(Constants.DOM_ELEMENT_CONTENT_WHITESPACE)) { return Boolean.TRUE; } else if (name.equalsIgnoreCase(Constants.DOM_ERROR_HANDLER)) { return fErrorHandlerWrapper.getErrorHandler(); } else if (name.equalsIgnoreCase(Constants.DOM_RESOURCE_RESOLVER)) { XMLEntityResolver entityResolver = getEntityResolver(); if (entityResolver != null && entityResolver instanceof DOMEntityResolverWrapper) { return ((DOMEntityResolverWrapper) entityResolver).getEntityResolver(); } return null; } else if (name.equalsIgnoreCase(Constants.DOM_SCHEMA_TYPE)) { return getProperty(Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE); } else if (name.equalsIgnoreCase(Constants.DOM_SCHEMA_LOCATION)) { return getProperty(Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_SOURCE); } else if (name.equalsIgnoreCase(SYMBOL_TABLE)){ return getProperty(SYMBOL_TABLE); } else if (name.equalsIgnoreCase(GRAMMAR_POOL)){ return getProperty(GRAMMAR_POOL); } else { String msg = DOMMessageFormatter.formatMessage( DOMMessageFormatter.DOM_DOMAIN, "FEATURE_NOT_FOUND", new Object[] { name }); throw new DOMException(DOMException.NOT_FOUND_ERR, msg); } } /** * DOM Level 3 WD - Experimental. * Check if setting a parameter to a specific value is supported. * * @param name The name of the parameter to check. * * @param value An object. if null, the returned value is true. * * @return true if the parameter could be successfully set to the * specified value, or false if the parameter is not recognized or * the requested value is not supported. This does not change the * current value of the parameter itself. */ public boolean canSetParameter(String name, Object value) { if (value == null){ //if null, the returned value is true. //REVISIT: I dont like this --- even for unrecognized parameter it would //return 'true'. I think it should return false in that case. // Application will be surprised to find that setParameter throws not //recognized exception when canSetParameter returns 'true' Then what is the use //of having canSetParameter ??? - nb. return true ; } if( value instanceof Boolean ){ //features whose parameter value can be set either 'true' or 'false' // or they accept any boolean value -- so we just need to check that // its a boolean value.. if (name.equalsIgnoreCase(Constants.DOM_COMMENTS) || name.equalsIgnoreCase(Constants.DOM_DATATYPE_NORMALIZATION) || name.equalsIgnoreCase(Constants.DOM_CDATA_SECTIONS) || name.equalsIgnoreCase(Constants.DOM_ENTITIES) || name.equalsIgnoreCase(Constants.DOM_SPLIT_CDATA) || name.equalsIgnoreCase(Constants.DOM_NAMESPACES) || name.equalsIgnoreCase(Constants.DOM_VALIDATE) || name.equalsIgnoreCase(Constants.DOM_WELLFORMED) || name.equalsIgnoreCase(Constants.DOM_INFOSET) ) { return true ; }//features whose parameter value can not be set to 'true' else if ( name.equalsIgnoreCase(Constants.DOM_NORMALIZE_CHARACTERS) || name.equalsIgnoreCase(Constants.DOM_CANONICAL_FORM) || name.equalsIgnoreCase(Constants.DOM_VALIDATE_IF_SCHEMA) || name.equalsIgnoreCase(Constants.DOM_CHECK_CHAR_NORMALIZATION) ) { return (value.equals(Boolean.TRUE)) ? false : true; }//features whose parameter value can not be set to 'false' else if( name.equalsIgnoreCase(Constants.DOM_NAMESPACE_DECLARATIONS) || name.equalsIgnoreCase(Constants.DOM_ELEMENT_CONTENT_WHITESPACE) || name.equalsIgnoreCase(SEND_PSVI) ) { return (value.equals(Boolean.TRUE)) ? true : false; }// if name is not among the above listed above -- its not recognized. return false else { return false ; } } else if (name.equalsIgnoreCase(Constants.DOM_ERROR_HANDLER)) { return (value instanceof DOMErrorHandler) ? true : false ; } else if (name.equalsIgnoreCase(Constants.DOM_RESOURCE_RESOLVER)) { return (value instanceof LSResourceResolver) ? true : false ; } else if (name.equalsIgnoreCase(Constants.DOM_SCHEMA_LOCATION)) { return (value instanceof String) ? true : false ; } else if (name.equalsIgnoreCase(Constants.DOM_SCHEMA_TYPE)) { // REVISIT: should null value be supported? //as of now we are only supporting W3C XML Schema return ( (value instanceof String) && value.equals(Constants.NS_XMLSCHEMA) ) ? true : false ; } else if (name.equalsIgnoreCase(SYMBOL_TABLE)){ // Xerces Symbol Table return (value instanceof SymbolTable) ? true : false ; } else if (name.equalsIgnoreCase (GRAMMAR_POOL)){ return (value instanceof XMLGrammarPool) ? true : false ; } else { //false if the parameter is not recognized or the requested value is not supported. return false ; } } //canSetParameter /** * DOM Level 3 CR - Experimental. * * The list of the parameters supported by this *DOMConfiguration
object and for which at least one value
* can be set by the application. Note that this list can also contain
* parameter names defined outside this specification.
*/
public DOMStringList getParameterNames() {
if (fRecognizedParameters == null){
Vector parameters = new Vector();
//Add DOM recognized parameters
//REVISIT: Would have been nice to have a list of
//recognized paramters.
parameters.add(Constants.DOM_COMMENTS);
parameters.add(Constants.DOM_DATATYPE_NORMALIZATION);
parameters.add(Constants.DOM_CDATA_SECTIONS);
parameters.add(Constants.DOM_ENTITIES);
parameters.add(Constants.DOM_SPLIT_CDATA);
parameters.add(Constants.DOM_NAMESPACES);
parameters.add(Constants.DOM_VALIDATE);
parameters.add(Constants.DOM_INFOSET);
parameters.add(Constants.DOM_NORMALIZE_CHARACTERS);
parameters.add(Constants.DOM_CANONICAL_FORM);
parameters.add(Constants.DOM_VALIDATE_IF_SCHEMA);
parameters.add(Constants.DOM_CHECK_CHAR_NORMALIZATION);
parameters.add(Constants.DOM_WELLFORMED);
parameters.add(Constants.DOM_NAMESPACE_DECLARATIONS);
parameters.add(Constants.DOM_ELEMENT_CONTENT_WHITESPACE);
parameters.add(Constants.DOM_ERROR_HANDLER);
parameters.add(Constants.DOM_SCHEMA_TYPE);
parameters.add(Constants.DOM_SCHEMA_LOCATION);
parameters.add(Constants.DOM_RESOURCE_RESOLVER);
parameters.add(GRAMMAR_POOL);
parameters.add(SYMBOL_TABLE);
parameters.add(SEND_PSVI);
fRecognizedParameters = new DOMStringListImpl(parameters);
}
return fRecognizedParameters;
}//getParameterNames
//
// Protected methods
//
/**
* reset all components before parsing
*/
protected void reset() throws XNIException {
if (fValidationManager != null)
fValidationManager.reset();
int count = fComponents.size();
for (int i = 0; i < count; i++) {
XMLComponent c = (XMLComponent) fComponents.get(i);
c.reset(this);
}
} // reset()
/**
* Check a property. If the property is known and supported, this method
* simply returns. Otherwise, the appropriate exception is thrown.
*
* @param propertyId The unique identifier (URI) of the property
* being set.
* @exception com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException If the
* requested feature is not known or supported.
*/
protected void checkProperty(String propertyId)
throws XMLConfigurationException {
// special cases
if (propertyId.startsWith(Constants.SAX_PROPERTY_PREFIX)) {
final int suffixLength = propertyId.length() - Constants.SAX_PROPERTY_PREFIX.length();
//
// http://xml.org/sax/properties/xml-string
// Value type: String
// Access: read-only
// Get the literal string of characters associated with the
// current event. If the parser recognises and supports this
// property but is not currently parsing text, it should return
// null (this is a good way to check for availability before the
// parse begins).
//
if (suffixLength == Constants.XML_STRING_PROPERTY.length() &&
propertyId.endsWith(Constants.XML_STRING_PROPERTY)) {
// REVISIT - we should probably ask xml-dev for a precise
// definition of what this is actually supposed to return, and
// in exactly which circumstances.
short type = XMLConfigurationException.NOT_SUPPORTED;
throw new XMLConfigurationException(type, propertyId);
}
}
// check property
super.checkProperty(propertyId);
} // checkProperty(String)
protected void addComponent(XMLComponent component) {
// don't add a component more than once
if (fComponents.contains(component)) {
return;
}
fComponents.add(component);
// register component's recognized features
String[] recognizedFeatures = component.getRecognizedFeatures();
addRecognizedFeatures(recognizedFeatures);
// register component's recognized properties
String[] recognizedProperties = component.getRecognizedProperties();
addRecognizedProperties(recognizedProperties);
} // addComponent(XMLComponent)
protected ValidationManager createValidationManager(){
return new ValidationManager();
}
protected DTDDVFactory createDatatypeValidatorFactory() {
return DTDDVFactory.getInstance();
} // createDatatypeValidatorFactory():DatatypeValidatorFactory
} // class XMLParser