#ODFTOOLKIT-436# ODFValidator: better error reporting
Signed-off-by: Svante Schubert <svanteschubert@apache.org>
git-svn-id: https://svn.apache.org/repos/asf/incubator/odf/trunk@1759338 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/validator/src/main/java/org/odftoolkit/odfvalidator/Logger.java b/validator/src/main/java/org/odftoolkit/odfvalidator/Logger.java
index 673864d..fe33c07 100644
--- a/validator/src/main/java/org/odftoolkit/odfvalidator/Logger.java
+++ b/validator/src/main/java/org/odftoolkit/odfvalidator/Logger.java
@@ -21,8 +21,11 @@
************************************************************************/
package org.odftoolkit.odfvalidator;
+import java.io.IOException;
import java.io.PrintStream;
-
+import java.io.InputStream;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
import org.xml.sax.SAXParseException;
public class Logger {
@@ -40,6 +43,7 @@
private int m_nWarnings;
private LogLevel m_nLevel;
private Logger m_aParentLogger;
+ private InputStream m_aEntryContent;
private static final String INFO_PREFIX = "Info:";
private static final String WARNING_PREFIX = "Warning:";
private static final String ERROR_PREFIX = "Error:";
@@ -80,6 +84,14 @@
m_aOut = aOut;
}
+ public void setInputStream(InputStream aIn) {
+ if( aIn != null && aIn.markSupported() )
+ {
+ aIn.mark(Integer.MAX_VALUE);
+ }
+ m_aEntryContent = aIn;
+ }
+
boolean hasError() {
return m_nErrors > 0;
}
@@ -202,6 +214,36 @@
m_aOut.print("</span></br>");
}
m_aOut.println();
+
+ if( m_aEntryContent != null )
+ {
+ try {
+ m_aEntryContent.reset();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(m_aEntryContent));
+ for(int l=0; l < e.getLineNumber()-1; ++l)
+ {
+ reader.readLine();
+ }
+
+ String errorLine=reader.readLine();
+ int len=errorLine.length();
+ if( len > 80 )
+ {
+ m_aOut.println(
+ errorLine.substring(
+ Math.max(0, e.getColumnNumber()-40),
+ Math.min(len-1, e.getColumnNumber()+39)));
+ m_aOut.println("".format("%1$38s", "----^"));
+ }
+ else
+ {
+ m_aOut.println(errorLine);
+ m_aOut.println("".format("%1$" +
+ Math.max(0,e.getColumnNumber()-2) + "s", "----^"));
+ }
+ } catch (IOException x) {
+ }
+ }
}
private void logMessage(String aPrefix, String aMsg) {
diff --git a/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageValidator.java b/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageValidator.java
index 86d10c4..1c63492 100644
--- a/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageValidator.java
+++ b/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageValidator.java
@@ -221,6 +221,7 @@
InputStream aInStream = null;
try {
aInStream = aPkg.getInputStream(aEntryName, true);
+ aLogger.setInputStream(aPkg.getInputStream(aEntryName, true));
} catch (Exception e) {
throw new ODFValidatorException(e);
}
@@ -232,8 +233,6 @@
return false;
}
-
-
return aInStream != null ? validate(aInStream, aFilter, aValidator, aLogger) : false;
}
diff --git a/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaErrorHandler.java b/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaErrorHandler.java
index 5ca8f37..716848a 100644
--- a/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaErrorHandler.java
+++ b/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaErrorHandler.java
@@ -39,7 +39,7 @@
public void warning(SAXParseException e) throws SAXException {
if( !filter(e) )
- m_aLogger.logWarning( e );
+ m_aLogger.logWarning( e );
}
public void fatalError(SAXParseException e) throws SAXException {