Browse Source

Use an error-handler to use logging also for XML parsing errors

Otherwise this output is done to stdout/stderr which we would like to avoid.

Keep the format as one line and do not include a full exception stacktrace
to not introduce lots of exception-stacktraces for some slightly broken input files

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1907108 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_5_2_4
Dominik Stadler 1 year ago
parent
commit
bcd3785d7d
1 changed files with 15 additions and 2 deletions
  1. 15
    2
      poi/src/main/java/org/apache/poi/util/XMLHelper.java

+ 15
- 2
poi/src/main/java/org/apache/poi/util/XMLHelper.java View File

import javax.xml.validation.SchemaFactory; import javax.xml.validation.SchemaFactory;


import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogBuilder;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.xml.sax.ErrorHandler; import org.xml.sax.ErrorHandler;
try { try {
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
documentBuilder.setEntityResolver(XMLHelper::ignoreEntity); documentBuilder.setEntityResolver(XMLHelper::ignoreEntity);
documentBuilder.setErrorHandler(new DocHelperErrorHandler());
documentBuilder.setErrorHandler(new DocHelperErrorHandler(true));
return documentBuilder; return documentBuilder;
} catch (ParserConfigurationException e) { } catch (ParserConfigurationException e) {
throw new IllegalStateException("cannot create a DocumentBuilder", e); throw new IllegalStateException("cannot create a DocumentBuilder", e);
public static XMLReader newXMLReader() throws SAXException, ParserConfigurationException { public static XMLReader newXMLReader() throws SAXException, ParserConfigurationException {
XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader(); XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader();
xmlReader.setEntityResolver(XMLHelper::ignoreEntity); xmlReader.setEntityResolver(XMLHelper::ignoreEntity);
xmlReader.setErrorHandler(new DocHelperErrorHandler(false));
trySet(xmlReader::setFeature, FEATURE_SECURE_PROCESSING, true); trySet(xmlReader::setFeature, FEATURE_SECURE_PROCESSING, true);
trySet(xmlReader::setFeature, FEATURE_EXTERNAL_ENTITIES, false); trySet(xmlReader::setFeature, FEATURE_EXTERNAL_ENTITIES, false);
Object manager = getXercesSecurityManager(); Object manager = getXercesSecurityManager();
} }


private static class DocHelperErrorHandler implements ErrorHandler { private static class DocHelperErrorHandler implements ErrorHandler {
private final boolean logException;

public DocHelperErrorHandler(boolean logException) {
this.logException = logException;
}


public void warning(SAXParseException exception) { public void warning(SAXParseException exception) {
printError(Level.WARN, exception); printError(Level.WARN, exception);
':' + ex.getColumnNumber() + ':' + ex.getColumnNumber() +
':' + ex.getMessage(); ':' + ex.getMessage();


LOG.atLevel(type).withThrowable(ex).log(message);
LogBuilder builder = LOG.atLevel(type);

if (logException) {
builder = builder.withThrowable(ex);
}

builder.log(message);
} }
} }



Loading…
Cancel
Save