Save This Page
Home » freemarker-2.3.13 » freemarker.core » [javadoc | source]
    1   /*
    2    * Copyright (c) 2003 The Visigoth Software Society. All rights
    3    * reserved.
    4    *
    5    * Redistribution and use in source and binary forms, with or without
    6    * modification, are permitted provided that the following conditions
    7    * are met:
    8    *
    9    * 1. Redistributions of source code must retain the above copyright
   10    *    notice, this list of conditions and the following disclaimer.
   11    *
   12    * 2. Redistributions in binary form must reproduce the above copyright
   13    *    notice, this list of conditions and the following disclaimer in
   14    *    the documentation and/or other materials provided with the
   15    *    distribution.
   16    *
   17    * 3. The end-user documentation included with the redistribution, if
   18    *    any, must include the following acknowledgement:
   19    *       "This product includes software developed by the
   20    *        Visigoth Software Society (http://www.visigoths.org/)."
   21    *    Alternately, this acknowledgement may appear in the software itself,
   22    *    if and wherever such third-party acknowledgements normally appear.
   23    *
   24    * 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the 
   25    *    project contributors may be used to endorse or promote products derived
   26    *    from this software without prior written permission. For written
   27    *    permission, please contact visigoths@visigoths.org.
   28    *
   29    * 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
   30    *    nor may "FreeMarker" or "Visigoth" appear in their names
   31    *    without prior written permission of the Visigoth Software Society.
   32    *
   33    * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   34    * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   35    * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   36    * DISCLAIMED.  IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
   37    * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   38    * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   39    * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   40    * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   41    * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   42    * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   43    * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   44    * SUCH DAMAGE.
   45    * ====================================================================
   46    *
   47    * This software consists of voluntary contributions made by many
   48    * individuals on behalf of the Visigoth Software Society. For more
   49    * information on the Visigoth Software Society, please see
   50    * http://www.visigoths.org/
   51    */
   52   
   53   package freemarker.core;
   54   
   55   import freemarker.template;
   56   
   57   /**
   58    * An instruction that assigns a literal or reference, to a single-identifier
   59    * variable.
   60    */
   61   final class Assignment extends TemplateElement {
   62   
   63       private String variableName;
   64       private Expression value, namespaceExp;
   65       private int scope;
   66   
   67       static final int NAMESPACE = 1;
   68       static final int LOCAL = 2;
   69       static final int GLOBAL = 3;
   70   
   71       /**
   72        * @param variableName the variable name to assign to.
   73        * @param value the expression to assign.
   74        * @param scope the scope of the assignment, one of NAMESPACE, LOCAL, or GLOBAL
   75        */
   76       Assignment(String variableName, 
   77                  Expression value, 
   78                  int scope)
   79       {
   80           this.variableName = variableName;
   81           this.value = value;
   82           this.scope = scope;
   83       }
   84       
   85       void setNamespaceExp(Expression namespaceExp) {
   86           this.namespaceExp =  namespaceExp;
   87       }
   88   
   89       void accept(Environment env) throws TemplateException {
   90           TemplateModel tm = value.getAsTemplateModel(env);
   91           Environment.Namespace namespace = null;
   92           if (namespaceExp != null) {
   93               boolean oops = false;
   94               try {
   95                   namespace = (Environment.Namespace) namespaceExp.getAsTemplateModel(env);
   96               } catch (ClassCastException cce) {
   97                   oops = true;
   98               }
   99               if (oops || namespace==null) {
  100                   throw new InvalidReferenceException(getStartLocation() + "\nInvalid reference to namespace: " + namespaceExp, env);
  101               }
  102           }
  103           if (tm == null) {
  104               if (env.isClassicCompatible()) {
  105                   tm = TemplateScalarModel.EMPTY_STRING;
  106               }
  107               else {
  108                   String msg = "Error " + getStartLocation()
  109                               +"\n" + value + " is undefined."
  110                               +"\nIt cannot be assigned to " + variableName;
  111                   throw new InvalidReferenceException(msg, env);
  112               }
  113           }
  114           if (scope == LOCAL) {
  115               env.setLocalVariable(variableName, tm);
  116           }
  117           else {
  118               if (namespace == null) {
  119                   if (scope == GLOBAL) {
  120                       namespace = env.getGlobalNamespace();
  121                   }
  122                   else if (scope == NAMESPACE) {
  123                       namespace = env.getCurrentNamespace();
  124                   }
  125               }
  126               namespace.put(variableName, tm);
  127           }
  128       }
  129   
  130       public String getCanonicalForm() {
  131           StringBuffer buf = new StringBuffer();
  132           if (!(parent instanceof AssignmentInstruction)) {
  133               if (scope == LOCAL) {
  134                   buf.append("<#local ");
  135               }
  136               else if (scope ==GLOBAL) {
  137                   buf.append("<#global ");
  138               }
  139               else {
  140                   buf.append("<#assign ");
  141               }
  142           }
  143           buf.append (variableName);
  144           buf.append('=');
  145           buf.append(value.getCanonicalForm());
  146           if (!(parent instanceof AssignmentInstruction)) {
  147               if (namespaceExp != null) {
  148                   buf.append(" in ");
  149                   buf.append(namespaceExp.getCanonicalForm());
  150               }
  151               buf.append(">");
  152           }
  153           return buf.toString();
  154       }
  155   
  156       public String getDescription() {
  157           String s ="";
  158           if (!(parent instanceof AssignmentInstruction)) {
  159               s = "assignment: ";
  160               if (scope == LOCAL) {
  161                   s = "local " + s;
  162               }
  163               else if (scope == GLOBAL) {
  164                   s  = "global " + s;
  165               }
  166           }
  167           return s + variableName 
  168                  + "=" 
  169                  + value; 
  170       }
  171   }

Save This Page
Home » freemarker-2.3.13 » freemarker.core » [javadoc | source]