You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by ge...@locus.apache.org on 2000/11/28 05:37:34 UTC

cvs commit: jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node ASTStringLiteral.java

geirm       00/11/27 20:37:33

  Modified:    src/java/org/apache/velocity/runtime/parser/node
                        ASTStringLiteral.java
  Log:
  Changed the method to support interpolation.  It now will interpolate in a string literal any valid VTL :)
  
  Revision  Changes    Path
  1.3       +124 -6    jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java
  
  Index: ASTStringLiteral.java
  ===================================================================
  RCS file: /home/cvs/jakarta-velocity/src/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ASTStringLiteral.java	2000/11/28 02:29:12	1.2
  +++ ASTStringLiteral.java	2000/11/28 04:37:32	1.3
  @@ -1,10 +1,77 @@
   /* Generated By:JJTree: Do not edit this line. ASTStringLiteral.java */
   
  +/*
  + * The Apache Software License, Version 1.1
  + *
  + * Copyright (c) 2000 The Apache Software Foundation.  All rights
  + * reserved.
  + *
  + * Redistribution and use in source and binary forms, with or without
  + * modification, are permitted provided that the following conditions
  + * are met:
  + *
  + * 1. Redistributions of source code must retain the above copyright
  + *    notice, this list of conditions and the following disclaimer.
  + *
  + * 2. Redistributions in binary form must reproduce the above copyright
  + *    notice, this list of conditions and the following disclaimer in
  + *    the documentation and/or other materials provided with the
  + *    distribution.
  + *
  + * 3. The end-user documentation included with the redistribution, if
  + *    any, must include the following acknowlegement:
  + *       "This product includes software developed by the
  + *        Apache Software Foundation (http://www.apache.org/)."
  + *    Alternately, this acknowlegement may appear in the software itself,
  + *    if and wherever such third-party acknowlegements normally appear.
  + *
  + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
  + *    Foundation" must not be used to endorse or promote products derived
  + *    from this software without prior written permission. For written
  + *    permission, please contact apache@apache.org.
  + *
  + * 5. Products derived from this software may not be called "Apache"
  + *    nor may "Apache" appear in their names without prior written
  + *    permission of the Apache Group.
  + *
  + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  + * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  + * SUCH DAMAGE.
  + * ====================================================================
  + *
  + * This software consists of voluntary contributions made by many
  + * individuals on behalf of the Apache Software Foundation.  For more
  + * information on the Apache Software Foundation, please see
  + * <http://www.apache.org/>.
  + */
  +
  +/**
  + * ASTStringLiteral support.  Will interpolate!
  + *
  + * @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a>
  + * @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a>
  + * @version $Id: ASTStringLiteral.java,v 1.3 2000/11/28 04:37:32 geirm Exp $
  + */
  +
   package org.apache.velocity.runtime.parser.node;
   
   import org.apache.velocity.Context;
   import org.apache.velocity.runtime.parser.*;
   
  +import java.io.StringWriter;
  +import java.io.ByteArrayInputStream;
  +import org.apache.velocity.runtime.Runtime;
  +import org.apache.velocity.runtime.RuntimeConstants;
  +
   public class ASTStringLiteral extends SimpleNode
   {
       public ASTStringLiteral(int id)
  @@ -23,15 +90,66 @@
           return visitor.visit(this, data);
       }
   
  +    /**
  +     *  renders the value of the string literal
  +     *  If the properties allow, and the string literal contains a $ or a #
  +     *  the literal is rendered against the context
  +     *  Otherwise, the stringlit is returned.
  +     */
       public Object value(Context context)
       {
           /*
  -         * This will remove the quotes and then interpolate
  -         * any variables from the context into the
  -         * the string.
  +         *  check to see if there are anything that might be a reference or directive in the string
            */
  -        return NodeUtils.interpolate(
  -            getFirstToken().image.substring(
  -                1, getFirstToken().image.length() - 1), context);
  +
  +        if (  Runtime.getBoolean(RuntimeConstants.INTERPOLATE_STRINGLITERALS , true) && 
  +              ( getFirstToken().image.indexOf("$") != -1  || getFirstToken().image.indexOf("#") != -1 ) )
  +        {
  +            /*
  +             *  if so, and allowed, parse() and render()
  +             *  In the future, we will get stringlits parsed into the AST at template parse time
  +             */
  +            
  +            ByteArrayInputStream  inStream = new ByteArrayInputStream( getFirstToken().image.substring(1, getFirstToken().image.length() - 1).getBytes() );
  +            
  +            try
  +            {    
  +                /*
  +                 *  parse the stringlit
  +                 */
  +                SimpleNode nodeTree_ = Runtime.parse( inStream );        
  +                
  +                /*
  +                 *  init with a cloned context
  +                 */
  +                Context ctxt = (Context) context.clone();
  +                nodeTree_.init( ctxt, null );
  +                
  +                /*
  +                 *  now render against the real context
  +                 */
  +                StringWriter writer = new StringWriter();
  +                nodeTree_.render(context, writer );
  +                
  +                /*
  +                 * and return the result as a String
  +                 */
  +                return writer.toString();
  +            }
  +            catch( Exception e )
  +            {
  +                /* eh.  If anything wrong, just punt and output the literal */
  +                Runtime.error("Error in interpolating string literal : " + e );
  +            }
  +        }
  +        
  +        /*
  +         *  ok, either not allowed to interpolate, there wasn't a ref or directive, or we failed, so
  +         *  just output the literal
  +         */
  +
  +        return getFirstToken().image.substring(1, getFirstToken().image.length() - 1);
  +
       }
   }
  +