1 52 53 package freemarker.core; 54 55 import freemarker.template.*; 56 57 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 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 } 172 | Popular Tags |