jvanzyl 00/10/20 18:36:50
Modified: src/java/org/apache/velocity/runtime/parser/node
ASTBlock.java ASTDirective.java ASTIfStatement.java
ASTReference.java ASTSetDirective.java ASTText.java
Node.java SimpleNode.java
Log:
- changing render() method so it can short circuit when there
are errors.
Revision Changes Path
1.2 +3 -1
jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTBlock.java
Index: ASTBlock.java
===================================================================
RCS file:
/home/cvs/jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTBlock.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ASTBlock.java 2000/10/20 19:14:01 1.1
+++ ASTBlock.java 2000/10/21 01:36:49 1.2
@@ -26,12 +26,14 @@
return visitor.visit(this, data);
}
- public void render(Context context, Writer writer)
+ public boolean render(Context context, Writer writer)
throws IOException
{
int i, k = jjtGetNumChildren();
for (i = 0; i < k; i++)
jjtGetChild(i).render(context, writer);
+
+ return true;
}
}
1.2 +3 -1
jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTDirective.java
Index: ASTDirective.java
===================================================================
RCS file:
/home/cvs/jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTDirective.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ASTDirective.java 2000/10/20 19:14:02 1.1
+++ ASTDirective.java 2000/10/21 01:36:49 1.2
@@ -50,12 +50,14 @@
return data;
}
- public void render(Context context, Writer writer)
+ public boolean render(Context context, Writer writer)
throws IOException
{
if (isDirective)
directive.render(context, writer, this);
else
writer.write(directiveName);
+
+ return true;
}
}
1.2 +3 -1
jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTIfStatement.java
Index: ASTIfStatement.java
===================================================================
RCS file:
/home/cvs/jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTIfStatement.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ASTIfStatement.java 2000/10/20 19:14:02 1.1
+++ ASTIfStatement.java 2000/10/21 01:36:49 1.2
@@ -27,7 +27,7 @@
return visitor.visit(this, data);
}
- public void render(Context context, Writer writer)
+ public boolean render(Context context, Writer writer)
throws IOException
{
Object data = null;
@@ -68,6 +68,8 @@
child.jjtGetChild(0).render(context, writer);
}
}
+
+ return true;
}
public void process(Context context, ParserVisitor visitor)
1.2 +3 -1
jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTReference.java
Index: ASTReference.java
===================================================================
RCS file:
/home/cvs/jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTReference.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ASTReference.java 2000/10/20 19:14:02 1.1
+++ ASTReference.java 2000/10/21 01:36:49 1.2
@@ -70,7 +70,7 @@
return result;
}
- public void render(Context context, Writer writer)
+ public boolean render(Context context, Writer writer)
throws IOException
{
value = execute(null, context);
@@ -83,6 +83,8 @@
writer.write(NodeUtils
.specialText(getFirstToken()) +
value.toString());
+
+ return true;
}
public boolean evaluate(Context context)
1.2 +28 -7
jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTSetDirective.java
Index: ASTSetDirective.java
===================================================================
RCS file:
/home/cvs/jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTSetDirective.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ASTSetDirective.java 2000/10/20 19:14:02 1.1
+++ ASTSetDirective.java 2000/10/21 01:36:49 1.2
@@ -6,10 +6,16 @@
import java.io.Writer;
import org.apache.velocity.Context;
+import org.apache.velocity.runtime.Runtime;
+import org.apache.velocity.runtime.exception.ReferenceException;
import org.apache.velocity.runtime.parser.*;
public class ASTSetDirective extends SimpleNode
{
+ private Node right;
+ private ASTReference left;
+ private Object value;
+
public ASTSetDirective(int id)
{
super(id);
@@ -27,22 +33,37 @@
return visitor.visit(this, data);
}
- public void render(Context context, Writer writer)
+ public boolean render(Context context, Writer writer)
throws IOException
{
- Object value = null;
- Node right = jjtGetChild(0).jjtGetChild(0)
- .jjtGetChild(1).jjtGetChild(0);
+ right = getRightHandSide();
+
+ if (right.value(context) == null)
+ {
+ Runtime.error(new ReferenceException(
+ "#set: " + right.literal() + " is not a valid reference."));
+
+ return false;
+ }
value = right.value(context);
-
- ASTReference left = (ASTReference) jjtGetChild(0)
- .jjtGetChild(0).jjtGetChild(0);
+ left = getLeftHandSide();
if (left.jjtGetNumChildren() == 0)
context.put(left.getFirstToken().image.substring(1), value);
else
left.setValue(context, value);
+ return true;
+ }
+
+ private ASTReference getLeftHandSide()
+ {
+ return (ASTReference) jjtGetChild(0).jjtGetChild(0).jjtGetChild(0);
+ }
+
+ private Node getRightHandSide()
+ {
+ return jjtGetChild(0).jjtGetChild(0).jjtGetChild(1).jjtGetChild(0);
}
}
1.2 +2 -1
jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTText.java
Index: ASTText.java
===================================================================
RCS file:
/home/cvs/jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTText.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ASTText.java 2000/10/20 19:14:02 1.1
+++ ASTText.java 2000/10/21 01:36:49 1.2
@@ -36,9 +36,10 @@
return data;
}
- public void render(Context context, Writer writer)
+ public boolean render(Context context, Writer writer)
throws IOException
{
writer.write(text);
+ return true;
}
}
1.3 +3 -2
jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/Node.java
Index: Node.java
===================================================================
RCS file:
/home/cvs/jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/Node.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Node.java 2000/10/20 23:15:09 1.2
+++ Node.java 2000/10/21 01:36:50 1.3
@@ -54,7 +54,7 @@
public boolean evaluate(Context context);
public Object value(Context context);
- public void render(Context context, Writer writer)
+ public boolean render(Context context, Writer writer)
throws IOException;
public Object execute(Object o, Context context);
@@ -62,5 +62,6 @@
public int getInfo();
public String literal();
-
+ public void setInvalid();
+ public boolean isInvalid();
}
1.4 +27 -4
jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/SimpleNode.java
Index: SimpleNode.java
===================================================================
RCS file:
/home/cvs/jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/SimpleNode.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SimpleNode.java 2000/10/20 23:20:36 1.3
+++ SimpleNode.java 2000/10/21 01:36:50 1.4
@@ -6,6 +6,8 @@
import java.io.IOException;
import org.apache.velocity.Context;
+import org.apache.velocity.runtime.Runtime;
+import org.apache.velocity.runtime.exception.ReferenceException;
import org.apache.velocity.runtime.parser.*;
public class SimpleNode implements Node
@@ -15,10 +17,10 @@
protected int id;
protected Parser parser;
- protected int info; // added
+ protected int info; // added
public boolean state;
+ protected boolean invalid = false;
-
/* Added */
protected Token first, last;
@@ -154,7 +156,16 @@
int i, k = jjtGetNumChildren();
for (i = 0; i < k; i++)
- jjtGetChild(i).init(context, data);
+ {
+ try
+ {
+ jjtGetChild(i).init(context, data);
+ }
+ catch (ReferenceException re)
+ {
+ Runtime.error(re);
+ }
+ }
return data;
}
@@ -169,13 +180,15 @@
return null;
}
- public void render(Context context, Writer writer)
+ public boolean render(Context context, Writer writer)
throws IOException
{
int i, k = jjtGetNumChildren();
for (i = 0; i < k; i++)
jjtGetChild(i).render(context, writer);
+
+ return true;
}
public Object execute(Object o, Context context)
@@ -201,6 +214,16 @@
public String literal()
{
return first.image;
+ }
+
+ public void setInvalid()
+ {
+ invalid = true;
+ }
+
+ public boolean isInvalid()
+ {
+ return invalid;
}
}