1 52 53 56 57 package freemarker.core; 58 59 import java.util.ArrayList ; 60 import java.util.List ; 61 import java.io.Writer ; 62 import freemarker.template.*; 63 import java.io.IOException ; 64 65 66 70 final class MethodCall extends Expression { 71 72 private final Expression target; 73 private final ListLiteral arguments; 74 75 MethodCall(Expression target, ArrayList arguments) { 76 this(target, new ListLiteral(arguments)); 77 } 78 79 private MethodCall(Expression target, ListLiteral arguments) { 80 this.target = target; 81 this.arguments = arguments; 82 } 83 84 TemplateModel _getAsTemplateModel(Environment env) throws TemplateException 85 { 86 TemplateModel targetModel = target.getAsTemplateModel(env); 87 if (targetModel instanceof TemplateMethodModel) { 88 TemplateMethodModel targetMethod = (TemplateMethodModel)targetModel; 89 List argumentStrings = 90 targetMethod instanceof TemplateMethodModelEx 91 ? arguments.getModelList(env) 92 : arguments.getValueList(env); 93 Object result = targetMethod.exec(argumentStrings); 94 return env.getObjectWrapper().wrap(result); 95 } 96 else if (targetModel instanceof Macro) { 97 Macro func = (Macro) targetModel; 98 env.setLastReturnValue(null); 99 if (!func.isFunction) { 100 throw new TemplateException("A macro cannot be called in an expression.", env); 101 } 102 Writer prevOut = env.getOut(); 103 try { 104 env.setOut(Environment.NULL_WRITER); 105 env.visit(func, null, arguments.values, null, null); 106 } catch (IOException ioe) { 107 throw new InternalError ("This should be impossible."); 108 } finally { 109 env.setOut(prevOut); 110 } 111 return env.getLastReturnValue(); 112 } 113 else { 114 throw invalidTypeException(targetModel, target, env, "method"); 115 } 116 } 117 118 public String getCanonicalForm() { 119 StringBuffer buf = new StringBuffer (); 120 buf.append(target.getCanonicalForm()); 121 buf.append("("); 122 String list = arguments.getCanonicalForm(); 123 buf.append(list.substring(1, list.length() -1)); 124 buf.append(")"); 125 return buf.toString(); 126 } 127 128 TemplateModel getConstantValue() { 129 return null; 130 } 131 132 boolean isLiteral() { 133 return false; 134 } 135 136 Expression _deepClone(String name, Expression subst) { 137 return new MethodCall(target.deepClone(name, subst), (ListLiteral)arguments.deepClone(name, subst)); 138 } 139 140 } 141 | Popular Tags |