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;
       }        
   }
   
  
  
  

Reply via email to