#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 {