if (acceptLanguage != null && !isValidInHTTPHeader(acceptLanguage)) {
reportFatalError("AcceptLanguageMalformed", null);
acceptLanguage = null;
}
XMLInputSource includedSource = null;
if (fEntityResolver != null) {
try {
XMLResourceIdentifier resourceIdentifier =
new XMLResourceIdentifierImpl(
null,
href,
fCurrentBaseURI.getExpandedSystemId(),
XMLEntityManager.expandSystemId(
href,
fCurrentBaseURI.getExpandedSystemId(),
false));
includedSource =
fEntityResolver.resolveEntity(resourceIdentifier);
if (includedSource != null &&
!(includedSource instanceof HTTPInputSource) &&
(accept != null || acceptLanguage != null) &&
includedSource.getCharacterStream() == null &&
includedSource.getByteStream() == null) {
includedSource = createInputSource(includedSource.getPublicId(), includedSource.getSystemId(),
includedSource.getBaseSystemId(), accept, acceptLanguage);
}
}
catch (IOException e) {
reportResourceError(
"XMLResourceError",
new Object[] { href, e.getMessage()}, e);
return false;
}
}
if (includedSource == null) {
// setup an HTTPInputSource if either of the content negotation attributes were specified.
if (accept != null || acceptLanguage != null) {
includedSource = createInputSource(null, href, fCurrentBaseURI.getExpandedSystemId(), accept, acceptLanguage);
}
else {
includedSource = new XMLInputSource(null, href, fCurrentBaseURI.getExpandedSystemId());
}
}
if (parse.equals(XINCLUDE_PARSE_XML)) {
// Instead of always creating a new configuration, the first one can be reused
if ((xpointer != null && fXPointerChildConfig == null)
|| (xpointer == null && fXIncludeChildConfig == null) ) {
String parserName = XINCLUDE_DEFAULT_CONFIGURATION;
//MF
if (xpointer != null)
parserName = "mf.org.apache.xerces.parsers.XPointerParserConfiguration";
fChildConfig =
(XMLParserConfiguration)ObjectFactory.newInstance(
parserName,
ObjectFactory.findClassLoader(),
true);
// use the same symbol table, error reporter, entity resolver, security manager and buffer size.
if (fSymbolTable != null) fChildConfig.setProperty(SYMBOL_TABLE, fSymbolTable);
if (fErrorReporter != null) fChildConfig.setProperty(ERROR_REPORTER, fErrorReporter);
if (fEntityResolver != null) fChildConfig.setProperty(ENTITY_RESOLVER, fEntityResolver);
fChildConfig.setProperty(SECURITY_MANAGER, fSecurityManager);
fChildConfig.setProperty(BUFFER_SIZE, new Integer(fBufferSize));
// features must be copied to child configuration
fNeedCopyFeatures = true;
// use the same namespace context
fChildConfig.setProperty(
Constants.XERCES_PROPERTY_PREFIX
+ Constants.NAMESPACE_CONTEXT_PROPERTY,
fNamespaceContext);
fChildConfig.setFeature(
XINCLUDE_FIXUP_BASE_URIS,
fFixupBaseURIs);
fChildConfig.setFeature(
XINCLUDE_FIXUP_LANGUAGE,
fFixupLanguage);
// If the xpointer attribute is present
if (xpointer != null ) {
XPointerHandler newHandler =
(XPointerHandler)fChildConfig.getProperty(
Constants.XERCES_PROPERTY_PREFIX
+ Constants.XPOINTER_HANDLER_PROPERTY);
fXPtrProcessor = newHandler;
// ???
((XPointerHandler)fXPtrProcessor).setProperty(
Constants.XERCES_PROPERTY_PREFIX
+ Constants.NAMESPACE_CONTEXT_PROPERTY,
fNamespaceContext);
((XPointerHandler)fXPtrProcessor).setProperty(XINCLUDE_FIXUP_BASE_URIS,
fFixupBaseURIs ? Boolean.TRUE : Boolean.FALSE);
((XPointerHandler)fXPtrProcessor).setProperty(
XINCLUDE_FIXUP_LANGUAGE,
fFixupLanguage ? Boolean.TRUE : Boolean.FALSE);
if (fErrorReporter != null)
((XPointerHandler)fXPtrProcessor).setProperty(ERROR_REPORTER, fErrorReporter);
// ???
newHandler.setParent(this);
newHandler.setHref(href);
newHandler.setXIncludeLocator(fXIncludeLocator);
newHandler.setDocumentHandler(this.getDocumentHandler());
fXPointerChildConfig = fChildConfig;
} else {
XIncludeHandler newHandler =
(XIncludeHandler)fChildConfig.getProperty(
Constants.XERCES_PROPERTY_PREFIX
+ Constants.XINCLUDE_HANDLER_PROPERTY);
newHandler.setParent(this);
newHandler.setHref(href);
newHandler.setXIncludeLocator(fXIncludeLocator);
newHandler.setDocumentHandler(this.getDocumentHandler());
fXIncludeChildConfig = fChildConfig;
}
}
// If an xpointer attribute is present
if (xpointer != null ) {
fChildConfig = fXPointerChildConfig;
// Parse the XPointer expression
try {
((XPointerProcessor)fXPtrProcessor).parseXPointer(xpointer);
} catch (XNIException ex) {
// report the XPointer error as a resource error
reportResourceError(
"XMLResourceError",
new Object[] { href, ex.getMessage()});
return false;
}
} else {
fChildConfig = fXIncludeChildConfig;
}
// set all features on parserConfig to match this parser configuration
if (fNeedCopyFeatures) {
copyFeatures(fSettings, fChildConfig);
}
fNeedCopyFeatures = false;
try {
fHasIncludeReportedContent = false;
fNamespaceContext.pushScope();
fChildConfig.parse(includedSource);
// necessary to make sure proper location is reported to the application and in errors
fXIncludeLocator.setLocator(fDocLocation);
if (fErrorReporter != null) {
fErrorReporter.setDocumentLocator(fDocLocation);
}
// If the xpointer attribute is present
if (xpointer != null ) {
// and it was not resolved
if (!((XPointerProcessor)fXPtrProcessor).isXPointerResolved()) {
Locale locale = (fErrorReporter != null) ? fErrorReporter.getLocale() : null;
String reason = fXIncludeMessageFormatter.formatMessage(locale, "XPointerResolutionUnsuccessful", null);
reportResourceError("XMLResourceError", new Object[] {href, reason});
// use the fallback
return false;
}
}
}
catch (XNIException e) {
// necessary to make sure proper location is reported to the application and in errors
fXIncludeLocator.setLocator(fDocLocation);
if (fErrorReporter != null) {
fErrorReporter.setDocumentLocator(fDocLocation);
}
reportFatalError("XMLParseError", new Object[] { href });
}
catch (IOException e) {
// necessary to make sure proper location is reported to the application and in errors
fXIncludeLocator.setLocator(fDocLocation);
if (fErrorReporter != null) {
fErrorReporter.setDocumentLocator(fDocLocation);
}
// If the start document event has been seen on the child pipeline it
// means the resource was successfully opened and we started reporting
// document events. If an IOException is thrown after the start document
// event we had a failure midstream and cannot recover.
if (fHasIncludeReportedContent) {
throw new XNIException(e);
}
// In other circumstances an IOException indicates that we had trouble
// accessing or opening the file, not that it was an invalid XML file. So we
// send a resource error, not a fatal error.
reportResourceError(
"XMLResourceError",
new Object[] { href, e.getMessage()}, e);
return false;
}
finally {
fNamespaceContext.popScope();
}
}
else if (parse.equals(XINCLUDE_PARSE_TEXT)) {
// we only care about encoding for parse="text"
String encoding = attributes.getValue(XINCLUDE_ATTR_ENCODING);
includedSource.setEncoding(encoding);
XIncludeTextReader textReader = null;
try {
fHasIncludeReportedContent = false;