input.setCharacterStream(streamSource.getReader());
// Gets the parser configuration. We'll create and initialize a new one, if we
// haven't created one before or if the previous one was garbage collected.
boolean newConfig = false;
XMLParserConfiguration config = (XMLParserConfiguration) fConfiguration.get();
if (config == null) {
config = initialize();
newConfig = true;
}
// If settings have changed on the component manager, refresh the error handler and entity resolver.
else if (fComponentManager.getFeature(PARSER_SETTINGS)) {
config.setProperty(ENTITY_RESOLVER, fComponentManager.getProperty(ENTITY_RESOLVER));
config.setProperty(ERROR_HANDLER, fComponentManager.getProperty(ERROR_HANDLER));
config.setProperty(SECURITY_MANAGER, fComponentManager.getProperty(SECURITY_MANAGER));
}
// prepare for parse
fComponentManager.reset();
if (streamResult != null) {
if (fSerializerFactory == null) {
fSerializerFactory = SerializerFactory.getSerializerFactory(Method.XML);
}
// there doesn't seem to be a way to reset a serializer, so we need to make
// a new one each time.
Serializer ser;
if (streamResult.getWriter() != null) {
ser = fSerializerFactory.makeSerializer(streamResult.getWriter(), new OutputFormat());
}
else if (streamResult.getOutputStream() != null) {
ser = fSerializerFactory.makeSerializer(streamResult.getOutputStream(), new OutputFormat());
}
else if (streamResult.getSystemId() != null) {
String uri = streamResult.getSystemId();
OutputStream out = XMLEntityManager.createOutputStream(uri);
ser = fSerializerFactory.makeSerializer(out, new OutputFormat());
}
else {
throw new IllegalArgumentException(JAXPValidationMessageFormatter.formatMessage(fComponentManager.getLocale(),
"StreamResultNotInitialized", null));
}
// we're using the parser only as an XNI-to-SAX converter,
// so that we can use the SAX-based serializer
SAXParser parser = (SAXParser) fParser.get();
if (newConfig || parser == null) {
parser = new SAXParser(config);
fParser = new SoftReference(parser);
}
else {
parser.reset();
}
config.setDocumentHandler(fSchemaValidator);
fSchemaValidator.setDocumentHandler(parser);
parser.setContentHandler(ser.asContentHandler());
}
else {
fSchemaValidator.setDocumentHandler(null);
}
try {
config.parse(input);
}
catch (XMLParseException e) {
throw Util.toSAXParseException(e);
}
catch (XNIException e) {