Author: wglass
Date: Fri Oct 14 23:17:50 2005
New Revision: 321296
URL: http://svn.apache.org/viewcvs?rev=321296&view=rev
Log:
ParseErrorException now reports template name. Thanks Malcolm Edgar!
VELOCITY-373.
Added:
jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ParseExceptionTestCase.java
(with props)
jakarta/velocity/core/trunk/test/parseexception/
jakarta/velocity/core/trunk/test/parseexception/badtemplate.vm
Modified:
jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java
jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java
jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java
jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/ParseErrorException.java
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/ParseException.java
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jjt
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/ParserTokenManager.java
(props changed)
Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java?rev=321296&r1=321295&r2=321296&view=diff
==============================================================================
--- jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java
(original)
+++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java Fri
Oct 14 23:17:50 2005
@@ -132,9 +132,8 @@
/*
* remember the error and convert
*/
-
- errorCondition = new ParseErrorException( pex.getMessage() );
- throw errorCondition;
+ errorCondition = new ParseErrorException( pex );
+ throw errorCondition;
}
catch( Exception e )
{
Modified:
jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java?rev=321296&r1=321295&r2=321296&view=diff
==============================================================================
--- jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java
(original)
+++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java
Fri Oct 14 23:17:50 2005
@@ -258,7 +258,7 @@
}
catch ( ParseException pex )
{
- throw new ParseErrorException( pex.getMessage() );
+ throw new ParseErrorException( pex );
}
/*
Modified:
jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java?rev=321296&r1=321295&r2=321296&view=diff
==============================================================================
---
jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java
(original)
+++
jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java
Fri Oct 14 23:17:50 2005
@@ -292,7 +292,7 @@
}
catch (ParseException pex)
{
- throw new ParseErrorException( pex.getMessage() );
+ throw new ParseErrorException( pex );
}
/*
Modified:
jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/ParseErrorException.java
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/ParseErrorException.java?rev=321296&r1=321295&r2=321296&view=diff
==============================================================================
---
jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/ParseErrorException.java
(original)
+++
jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/ParseErrorException.java
Fri Oct 14 23:17:50 2005
@@ -16,6 +16,8 @@
* limitations under the License.
*/
+import org.apache.velocity.runtime.parser.ParseException;
+
/**
* Application-level exception thrown when a resource of any type
* has a syntax or other error which prevents it from being parsed.
@@ -34,8 +36,74 @@
*/
private static final long serialVersionUID = -6665197935086306474L;
- public ParseErrorException(String exceptionMessage )
+ /**
+ * The column number of the parsing error, or -1 if not defined.
+ */
+ private int columnNumber = -1;
+
+ /**
+ * The line number of the parsing error, or -1 if not defined.
+ */
+ private int lineNumber;
+
+ /**
+ * The name of the template containing the error, or null if not defined.
+ */
+ private String templateName;
+
+ /**
+ * Create a ParseErrorException with the given message.
+ *
+ * @param exceptionMessage the error exception message
+ */
+ public ParseErrorException(String exceptionMessage)
+ {
+ super(exceptionMessage);
+ }
+
+ /**
+ * Create a ParseErrorException with the given ParseException.
+ *
+ * @param pex the parsing exception
+ */
+ public ParseErrorException(ParseException pex)
+ {
+ super(pex.getMessage());
+
+ columnNumber = pex.columnNumber;
+ lineNumber = pex.lineNumber;
+ templateName = pex.templateName;
+ }
+
+ /**
+ * Return the column number of the parsing error, or -1 if not defined.
+ *
+ * @return column number of the parsing error, or -1 if not defined
+ */
+ public int getColumnNumber()
+ {
+ return columnNumber;
+ }
+
+ /**
+ * Return the line number of the parsing error, or -1 if not defined.
+ *
+ * @return line number of the parsing error, or -1 if not defined
+ */
+ public int getLineNumber()
+ {
+ return lineNumber;
+ }
+
+ /**
+ * Return the name of the template containing the error, or null if not
+ * defined.
+ *
+ * @return the name of the template containing the parsing error, or null
+ * if not defined
+ */
+ public String getTemplateName()
{
- super(exceptionMessage);
- }
+ return templateName;
+ }
}
Modified:
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/ParseException.java
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/ParseException.java?rev=321296&r1=321295&r2=321296&view=diff
==============================================================================
---
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/ParseException.java
(original)
+++
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/ParseException.java
Fri Oct 14 23:17:50 2005
@@ -10,7 +10,26 @@
* You can modify this class to customize your error reporting
* mechanisms so long as you retain the public fields.
*/
-public class ParseException extends Exception {
+public class ParseException extends Exception
+{
+
+ /**
+ * This constructor is used to add a template name
+ * to info cribbed from a ParseException generated in the parser.
+ */
+ public ParseException(Token currentTokenVal,
+ int[][] expectedTokenSequencesVal,
+ String[] tokenImageVal,
+ String templateNameVal
+ )
+ {
+ super("");
+ specialConstructor = true;
+ currentToken = currentTokenVal;
+ expectedTokenSequences = expectedTokenSequencesVal;
+ tokenImage = tokenImageVal;
+ templateName = templateNameVal;
+ }
/**
* This constructor is used by the method "generateParseException"
@@ -46,12 +65,14 @@
* these constructors.
*/
- public ParseException() {
+ public ParseException()
+ {
super();
specialConstructor = false;
}
- public ParseException(String message) {
+ public ParseException(String message)
+ {
super(message);
specialConstructor = false;
}
@@ -83,6 +104,24 @@
* defined in the generated ...Constants interface.
*/
public String[] tokenImage;
+
+ /**
+ * This is the name of the template which contains the parsing error, or
+ * null if not defined.
+ */
+ public String templateName;
+
+ /**
+ * This is the column number of the error in the template, or -1 if not
+ * defined.
+ */
+ public int columnNumber = -1;
+
+ /**
+ * This is the line number of the error in the template, or -1 if not
+ * defined.
+ */
+ public int lineNumber = -1;
/**
* This method has the standard behavior when this object has been
@@ -94,45 +133,70 @@
* of the final stack trace, and hence the correct error message
* gets displayed.
*/
- public String getMessage() {
- if (!specialConstructor) {
+ public String getMessage()
+ {
+ if (!specialConstructor)
+ {
return super.getMessage();
}
String expected = "";
int maxSize = 0;
- for (int i = 0; i < expectedTokenSequences.length; i++) {
- if (maxSize < expectedTokenSequences[i].length) {
- maxSize = expectedTokenSequences[i].length;
- }
- for (int j = 0; j < expectedTokenSequences[i].length; j++) {
- expected += tokenImage[expectedTokenSequences[i][j]] + " ";
- }
- if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] !=
0) {
- expected += "...";
- }
- expected += eol + " ";
+ for (int i = 0; i < expectedTokenSequences.length; i++)
+ {
+ if (maxSize < expectedTokenSequences[i].length)
+ {
+ maxSize = expectedTokenSequences[i].length;
+ }
+ for (int j = 0; j < expectedTokenSequences[i].length; j++)
+ {
+ expected += tokenImage[expectedTokenSequences[i][j]] + " ";
+ }
+ if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] !=
0)
+ {
+ expected += "...";
+ }
+ expected += eol + " ";
}
+
String retval = "Encountered \"";
Token tok = currentToken.next;
- for (int i = 0; i < maxSize; i++) {
- if (i != 0) retval += " ";
- if (tok.kind == 0) {
- retval += tokenImage[0];
- break;
- }
- retval += add_escapes(tok.image);
- tok = tok.next;
- }
- retval += "\" at line " + currentToken.next.beginLine + ", column " +
currentToken.next.beginColumn;
- retval += "." + eol;
- if (expectedTokenSequences.length == 1) {
- retval += "Was expecting:" + eol + " ";
- } else {
- retval += "Was expecting one of:" + eol + " ";
+ for (int i = 0; i < maxSize; i++)
+ {
+ if (i != 0)
+ {
+ retval += " ";
+ }
+ if (tok.kind == 0)
+ {
+ retval += tokenImage[0];
+ break;
+ }
+ retval += add_escapes(tok.image);
+ tok = tok.next;
+ }
+
+ lineNumber = currentToken.next.beginLine;
+ columnNumber = currentToken.next.beginColumn;
+ retval += "\" at line " + lineNumber + " column " + columnNumber;
+ if (templateName != null)
+ {
+ retval += " of " + templateName + eol;
+ }
+ else
+ {
+ retval += "." + eol;
+ }
+ if (expectedTokenSequences.length == 1)
+ {
+ retval += "Was expecting:" + eol + " ";
+ }
+ else
+ {
+ retval += "Was expecting one of:" + eol + " ";
}
retval += expected;
return retval;
- }
+ }
/**
* The end of line string for this machine.
@@ -177,10 +241,13 @@
retval.append("\\\\");
continue;
default:
- if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+ if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e)
+ {
String s = "0000" + Integer.toString(ch, 16);
retval.append("\\u" + s.substring(s.length() - 4,
s.length()));
- } else {
+ }
+ else
+ {
retval.append(ch);
}
continue;
Modified:
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java?rev=321296&r1=321295&r2=321296&view=diff
==============================================================================
---
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java
(original)
+++
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java
Fri Oct 14 23:17:50 2005
@@ -116,8 +116,8 @@
{
rsvc.getLog().error("Parser Exception: " + templateName, pe);
throw new ParseException (pe.currentToken,
- pe.expectedTokenSequences, pe.tokenImage);
- }
+ pe.expectedTokenSequences, pe.tokenImage,
currentTemplateName);
+ }
catch (TokenMgrError tme)
{
throw new ParseException("Lexical error: " + tme.toString());
Modified:
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj?rev=321296&r1=321295&r2=321296&view=diff
==============================================================================
---
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj
(original)
+++
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj
Fri Oct 14 23:17:50 2005
@@ -1,4 +1,4 @@
-/[EMAIL PROTECTED](jjtree) Generated By:JJTree: Do not edit this line.
C:/java/apache/velocity/src/java/org/apache/velocity/runtime/parser\Parser.jj */
+/[EMAIL PROTECTED](jjtree) Generated By:JJTree: Do not edit this line.
C:/Documents and Settings/wglass/My
Documents/GAWE/velocity/trunk/src/java/org/apache/velocity/runtime/parser\Parser.jj
*/
/[EMAIL PROTECTED]//*
* Copyright 2000-2004 The Apache Software Foundation.
*
@@ -171,8 +171,8 @@
{
rsvc.getLog().error("Parser Exception: " + templateName, pe);
throw new ParseException (pe.currentToken,
- pe.expectedTokenSequences, pe.tokenImage);
- }
+ pe.expectedTokenSequences, pe.tokenImage,
currentTemplateName);
+ }
catch (TokenMgrError tme)
{
throw new ParseException("Lexical error: " + tme.toString());
Modified:
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jjt
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jjt?rev=321296&r1=321295&r2=321296&view=diff
==============================================================================
---
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jjt
(original)
+++
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jjt
Fri Oct 14 23:17:50 2005
@@ -192,8 +192,8 @@
{
rsvc.getLog().error("Parser Exception: " + templateName, pe);
throw new ParseException (pe.currentToken,
- pe.expectedTokenSequences, pe.tokenImage);
- }
+ pe.expectedTokenSequences, pe.tokenImage,
currentTemplateName);
+ }
catch (TokenMgrError tme)
{
throw new ParseException("Lexical error: " + tme.toString());
Propchange:
jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/ParserTokenManager.java
------------------------------------------------------------------------------
eol-style = native
Added:
jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ParseExceptionTestCase.java
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ParseExceptionTestCase.java?rev=321296&view=auto
==============================================================================
---
jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ParseExceptionTestCase.java
(added)
+++
jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ParseExceptionTestCase.java
Fri Oct 14 23:17:50 2005
@@ -0,0 +1,140 @@
+package org.apache.velocity.test;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.StringWriter;
+import java.io.Writer;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.exception.ParseErrorException;
+
+/**
+ * Test parser exception is generated with appropriate info.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Will Glass-Husain</a>
+ * @version $Id$
+ */
+public class ParseExceptionTestCase extends BaseTestCase
+{
+ /**
+ * Path for templates. This property will override the
+ * value in the default velocity properties file.
+ */
+ private final static String FILE_RESOURCE_LOADER_PATH =
"test/parseexception";
+
+
+ /**
+ * Default constructor.
+ */
+ public ParseExceptionTestCase(String name)
+ {
+ super(name);
+ }
+
+ public void setUp()
+ throws Exception
+ {
+
+ }
+
+ public static Test suite ()
+ {
+ return new TestSuite(ParseExceptionTestCase.class);
+ }
+
+ /**
+ * Tests that parseException has useful info when called by
template.marge()
+ * @throws Exception
+ */
+ public void testParseExceptionFromTemplate ()
+ throws Exception
+ {
+
+ VelocityEngine ve = new VelocityEngine();
+
+ ve.setProperty("file.resource.loader.cache", "true");
+ ve.setProperty("file.resource.loader.path", FILE_RESOURCE_LOADER_PATH);
+ ve.init();
+
+
+ Writer writer = new StringWriter();
+
+ VelocityContext context = new VelocityContext();
+
+ try
+ {
+ Template template = ve.getTemplate("badtemplate.vm");
+ template.merge(context, writer);
+ fail("Should have thown a ParseErrorException");
+ }
+ catch (ParseErrorException e)
+ {
+ assertEquals("badtemplate.vm",e.getTemplateName());
+ assertEquals(5,e.getLineNumber());
+ assertEquals(9,e.getColumnNumber());
+ }
+ finally
+ {
+ if (writer != null)
+ {
+ writer.close();
+ }
+ }
+ }
+
+ /**
+ * Tests that parseException has useful info when thrown in
VelocityEngine.evaluate()
+ * @throws Exception
+ */
+ public void testParseExceptionFromEval ()
+ throws Exception
+ {
+
+ VelocityEngine ve = new VelocityEngine();
+ ve.init();
+
+ VelocityContext context = new VelocityContext();
+
+ Writer writer = new StringWriter();
+
+ try
+ {
+ ve.evaluate(context,writer,"test"," #set($abc) ");
+ fail("Should have thown a ParseErrorException");
+ }
+ catch (ParseErrorException e)
+ {
+ assertEquals("test",e.getTemplateName());
+ assertEquals(1,e.getLineNumber());
+ assertEquals(13,e.getColumnNumber());
+ }
+ finally
+ {
+ if (writer != null)
+ {
+ writer.close();
+ }
+ }
+ }
+
+
+}
Propchange:
jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ParseExceptionTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ParseExceptionTestCase.java
------------------------------------------------------------------------------
svn:keywords = Id Author Date Revision
Added: jakarta/velocity/core/trunk/test/parseexception/badtemplate.vm
URL:
http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/test/parseexception/badtemplate.vm?rev=321296&view=auto
==============================================================================
--- jakarta/velocity/core/trunk/test/parseexception/badtemplate.vm (added)
+++ jakarta/velocity/core/trunk/test/parseexception/badtemplate.vm Fri Oct 14
23:17:50 2005
@@ -0,0 +1,7 @@
+ok
+ok
+ok
+ok
+ #set($s)
+ok
+ok
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]