Repository: incubator-freemarker Updated Branches: refs/heads/3 a3311d52e -> b867458aa
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java index e8cd15c..ce3ff56 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java @@ -27,7 +27,6 @@ import java.util.regex.Pattern; import org.apache.freemarker.core.model.TemplateBooleanModel; import org.apache.freemarker.core.model.TemplateMethodModel; -import org.apache.freemarker.core.model.TemplateMethodModelEx; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.TemplateScalarModel; @@ -70,7 +69,7 @@ class BuiltInsForStringsBasic { static class containsBI extends ASTExpBuiltIn { - private class BIMethod implements TemplateMethodModelEx { + private class BIMethod implements TemplateMethodModel { private final String s; @@ -79,9 +78,9 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { checkMethodArgCount(args, 1); - return s.indexOf(getStringMethodArg(args, 0)) != -1 + return s.contains(getStringMethodArg(args, 0)) ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE; } } @@ -95,7 +94,7 @@ class BuiltInsForStringsBasic { static class ends_withBI extends BuiltInForString { - private class BIMethod implements TemplateMethodModelEx { + private class BIMethod implements TemplateMethodModel { private String s; private BIMethod(String s) { @@ -103,7 +102,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { checkMethodArgCount(args, 1); return s.endsWith(getStringMethodArg(args, 0)) ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE; @@ -118,7 +117,7 @@ class BuiltInsForStringsBasic { static class ensure_ends_withBI extends BuiltInForString { - private class BIMethod implements TemplateMethodModelEx { + private class BIMethod implements TemplateMethodModel { private String s; private BIMethod(String s) { @@ -126,7 +125,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { checkMethodArgCount(args, 1); String suffix = getStringMethodArg(args, 0); return new SimpleScalar(s.endsWith(suffix) ? s : s + suffix); @@ -141,7 +140,7 @@ class BuiltInsForStringsBasic { static class ensure_starts_withBI extends BuiltInForString { - private class BIMethod implements TemplateMethodModelEx { + private class BIMethod implements TemplateMethodModel { private String s; private BIMethod(String s) { @@ -149,7 +148,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { checkMethodArgCount(args, 1, 3); final String checkedPrefix = getStringMethodArg(args, 0); @@ -190,7 +189,7 @@ class BuiltInsForStringsBasic { static class index_ofBI extends ASTExpBuiltIn { - private class BIMethod implements TemplateMethodModelEx { + private class BIMethod implements TemplateMethodModel { private final String s; @@ -199,7 +198,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { int argCnt = args.size(); checkMethodArgCount(argCnt, 1, 2); String subStr = getStringMethodArg(args, 0); @@ -226,7 +225,7 @@ class BuiltInsForStringsBasic { } static class keep_afterBI extends BuiltInForString { - class KeepAfterMethod implements TemplateMethodModelEx { + class KeepAfterMethod implements TemplateMethodModel { private String s; KeepAfterMethod(String s) { @@ -234,7 +233,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { int argCnt = args.size(); checkMethodArgCount(argCnt, 1, 2); String separatorString = getStringMethodArg(args, 0); @@ -272,7 +271,7 @@ class BuiltInsForStringsBasic { } static class keep_after_lastBI extends BuiltInForString { - class KeepAfterMethod implements TemplateMethodModelEx { + class KeepAfterMethod implements TemplateMethodModel { private String s; KeepAfterMethod(String s) { @@ -280,7 +279,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { int argCnt = args.size(); checkMethodArgCount(argCnt, 1, 2); String separatorString = getStringMethodArg(args, 0); @@ -325,7 +324,7 @@ class BuiltInsForStringsBasic { } static class keep_beforeBI extends BuiltInForString { - class KeepUntilMethod implements TemplateMethodModelEx { + class KeepUntilMethod implements TemplateMethodModel { private String s; KeepUntilMethod(String s) { @@ -333,7 +332,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { int argCnt = args.size(); checkMethodArgCount(argCnt, 1, 2); String separatorString = getStringMethodArg(args, 0); @@ -369,7 +368,7 @@ class BuiltInsForStringsBasic { // TODO static class keep_before_lastBI extends BuiltInForString { - class KeepUntilMethod implements TemplateMethodModelEx { + class KeepUntilMethod implements TemplateMethodModel { private String s; KeepUntilMethod(String s) { @@ -377,7 +376,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { int argCnt = args.size(); checkMethodArgCount(argCnt, 1, 2); String separatorString = getStringMethodArg(args, 0); @@ -436,7 +435,7 @@ class BuiltInsForStringsBasic { static class padBI extends BuiltInForString { - private class BIMethod implements TemplateMethodModelEx { + private class BIMethod implements TemplateMethodModel { private final String s; @@ -445,7 +444,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { int argCnt = args.size(); checkMethodArgCount(argCnt, 1, 2); @@ -487,7 +486,7 @@ class BuiltInsForStringsBasic { static class remove_beginningBI extends BuiltInForString { - private class BIMethod implements TemplateMethodModelEx { + private class BIMethod implements TemplateMethodModel { private String s; private BIMethod(String s) { @@ -495,7 +494,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { checkMethodArgCount(args, 1); String prefix = getStringMethodArg(args, 0); return new SimpleScalar(s.startsWith(prefix) ? s.substring(prefix.length()) : s); @@ -510,7 +509,7 @@ class BuiltInsForStringsBasic { static class remove_endingBI extends BuiltInForString { - private class BIMethod implements TemplateMethodModelEx { + private class BIMethod implements TemplateMethodModel { private String s; private BIMethod(String s) { @@ -518,7 +517,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { checkMethodArgCount(args, 1); String suffix = getStringMethodArg(args, 0); return new SimpleScalar(s.endsWith(suffix) ? s.substring(0, s.length() - suffix.length()) : s); @@ -540,12 +539,14 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateException { int argCnt = args.size(); checkMethodArgCount(argCnt, 1, 2); - String splitString = (String) args.get(0); - long flags = argCnt > 1 ? RegexpHelper.parseFlagString((String) args.get(1)) : 0; - String[] result = null; + String splitString = _CallableUtils.castArgToString(args, 0); + long flags = argCnt > 1 + ? RegexpHelper.parseFlagString(_CallableUtils.castArgToString(args, 1)) + : 0; + String[] result; if ((flags & RegexpHelper.RE_FLAG_REGEXP) == 0) { RegexpHelper.checkNonRegexpFlags("split", flags); result = _StringUtil.split(s, splitString, @@ -567,7 +568,7 @@ class BuiltInsForStringsBasic { static class starts_withBI extends BuiltInForString { - private class BIMethod implements TemplateMethodModelEx { + private class BIMethod implements TemplateMethodModel { private String s; private BIMethod(String s) { @@ -575,7 +576,7 @@ class BuiltInsForStringsBasic { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { checkMethodArgCount(args, 1); return s.startsWith(getStringMethodArg(args, 0)) ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE; @@ -592,10 +593,10 @@ class BuiltInsForStringsBasic { @Override TemplateModel calculateResult(final String s, final Environment env) throws TemplateException { - return new TemplateMethodModelEx() { + return new TemplateMethodModel() { @Override - public Object exec(java.util.List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { int argCount = args.size(); checkMethodArgCount(argCount, 1, 2); @@ -618,9 +619,9 @@ class BuiltInsForStringsBasic { } if (beginIdx > endIdx) { throw MessageUtil.newMethodArgsInvalidValueException("?" + key, - "The begin index argument, ", Integer.valueOf(beginIdx), + "The begin index argument, ", beginIdx, ", shouldn't be greater than the end index argument, ", - Integer.valueOf(endIdx), "."); + endIdx, "."); } return new SimpleScalar(s.substring(beginIdx, endIdx)); } else { @@ -633,15 +634,14 @@ class BuiltInsForStringsBasic { return MessageUtil.newMethodArgInvalidValueException( "?" + key, argIdx, "The index mustn't be greater than the length of the string, ", - Integer.valueOf(len), - ", but it was ", Integer.valueOf(idx), "."); + len, ", but it was ", idx, "."); } private TemplateModelException newIndexLessThan0Exception( int argIdx, int idx) throws TemplateModelException { return MessageUtil.newMethodArgInvalidValueException( "?" + key, argIdx, - "The index must be at least 0, but was ", Integer.valueOf(idx), "."); + "The index must be at least 0, but was ", idx, "."); } }; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java index bfb44c6..cee1b49 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java @@ -148,11 +148,11 @@ class BuiltInsForStringsEncoding { protected abstract String encodeWithCharset(Charset charset) throws UnsupportedEncodingException; @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { parent.checkMethodArgCount(args.size(), 1); try { - String charsetName = (String) args.get(0); - Charset charset = null; + String charsetName = _CallableUtils.castArgToString(args,0); + Charset charset; try { charset = Charset.forName(charsetName); } catch (UnsupportedCharsetException e) { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java index 2d50556..6bf7e2a 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java @@ -28,7 +28,7 @@ import org.apache.freemarker.core.model.ArgumentArrayLayout; import org.apache.freemarker.core.model.ObjectWrapper; import org.apache.freemarker.core.model.TemplateBooleanModel; import org.apache.freemarker.core.model.TemplateDirectiveModel; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.TemplateScalarModel; @@ -72,7 +72,7 @@ class BuiltInsForStringsMisc { TemplateModel calculateResult(String s, Environment env) throws TemplateException { Template parentTemplate = getTemplate(); - ASTExpression exp = null; + ASTExpression exp; try { try { ParsingConfiguration pCfg = parentTemplate.getParsingConfiguration(); @@ -151,9 +151,11 @@ class BuiltInsForStringsMisc { ASTExpression sourceExpr = null; String id = "anonymous_interpreted"; if (model instanceof TemplateSequenceModel) { - sourceExpr = ((ASTExpression) new ASTExpDynamicKeyName(target, new ASTExpNumberLiteral(Integer.valueOf(0))).copyLocationFrom(target)); + sourceExpr = ((ASTExpression) new ASTExpDynamicKeyName(target, new ASTExpNumberLiteral(0)) + .copyLocationFrom(target)); if (((TemplateSequenceModel) model).size() > 1) { - id = ((ASTExpression) new ASTExpDynamicKeyName(target, new ASTExpNumberLiteral(Integer.valueOf(1))).copyLocationFrom(target)).evalAndCoerceToPlainText(env); + id = ((ASTExpression) new ASTExpDynamicKeyName(target, new ASTExpNumberLiteral(1)) + .copyLocationFrom(target)).evalAndCoerceToPlainText(env); } } else if (model instanceof TemplateScalarModel) { sourceExpr = target; @@ -252,12 +254,12 @@ class BuiltInsForStringsMisc { return new ConstructorFunction(target.evalAndCoerceToPlainText(env), env, target.getTemplate()); } - class ConstructorFunction implements TemplateMethodModelEx { + class ConstructorFunction implements TemplateMethodModel { private final Class<?> cl; private final Environment env; - public ConstructorFunction(String classname, Environment env, Template template) throws TemplateException { + ConstructorFunction(String classname, Environment env, Template template) throws TemplateException { this.env = env; cl = env.getNewBuiltinClassResolver().resolve(classname, env, template); if (!TemplateModel.class.isAssignableFrom(cl)) { @@ -271,13 +273,13 @@ class BuiltInsForStringsMisc { } @Override - public Object exec(List arguments) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { ObjectWrapper ow = env.getObjectWrapper(); if (ow instanceof DefaultObjectWrapper) { - return ((DefaultObjectWrapper) ow).newInstance(cl, arguments); + return ow.wrap(((DefaultObjectWrapper) ow).newInstance(cl, args)); } - if (!arguments.isEmpty()) { + if (!args.isEmpty()) { throw new TemplateModelException( "className?new(args) only supports 0 arguments in the current configuration, because " + " the objectWrapper setting value is not a " @@ -285,7 +287,7 @@ class BuiltInsForStringsMisc { " (or its subclass)."); } try { - return cl.newInstance(); + return ow.wrap(cl.newInstance()); } catch (Exception e) { throw new TemplateModelException("Failed to instantiate " + cl.getName() + " with its parameterless constructor; see cause exception", e); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java index 0420d64..025b599 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java @@ -70,12 +70,14 @@ class BuiltInsForStringsRegexp { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateException { int argCnt = args.size(); checkMethodArgCount(argCnt, 1, 2); - String patternString = (String) args.get(0); - long flags = argCnt > 1 ? RegexpHelper.parseFlagString((String) args.get(1)) : 0; + String patternString = _CallableUtils.castArgToString(args, 0); + long flags = argCnt > 1 + ? RegexpHelper.parseFlagString(_CallableUtils.castArgToString(args, 1)) + : 0; if ((flags & RegexpHelper.RE_FLAG_FIRST_ONLY) != 0) { RegexpHelper.logFlagWarning("?" + key + " doesn't support the \"f\" flag."); } @@ -101,12 +103,14 @@ class BuiltInsForStringsRegexp { } @Override - public Object exec(List args) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateException { int argCnt = args.size(); checkMethodArgCount(argCnt, 2, 3); - String arg1 = (String) args.get(0); - String arg2 = (String) args.get(1); - long flags = argCnt > 2 ? RegexpHelper.parseFlagString((String) args.get(2)) : 0; + String arg1 = _CallableUtils.castArgToString(args, 0); + String arg2 = _CallableUtils.castArgToString(args, 1); + long flags = argCnt > 2 + ? RegexpHelper.parseFlagString(_CallableUtils.castArgToString(args, 2)) + : 0; String result; if ((flags & RegexpHelper.RE_FLAG_REGEXP) == 0) { RegexpHelper.checkNonRegexpFlags("replace", flags); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java b/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java index 25ea39d..ee212db 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java @@ -581,7 +581,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen try { TemplateDirectiveModel nodeProcessor = getNodeProcessor(node); if (nodeProcessor != null) { - _TemplateCallableModelUtils.executeWith0Arguments( + _CallableUtils.executeWith0Arguments( nodeProcessor, NonTemplateCallPlace.INSTANCE, out, this); } else if (nodeProcessor == null) { String nodeType = node.getNodeType(); @@ -640,7 +640,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen void fallback() throws TemplateException, IOException { TemplateDirectiveModel nodeProcessor = getNodeProcessor(currentNodeName, currentNodeNS, nodeNamespaceIndex); if (nodeProcessor != null) { - _TemplateCallableModelUtils.executeWith0Arguments( + _CallableUtils.executeWith0Arguments( nodeProcessor, NonTemplateCallPlace.INSTANCE, out, this); } } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java b/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java index c8cbc6d..6cf29f4 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java @@ -19,6 +19,8 @@ package org.apache.freemarker.core; +import java.io.Serializable; + import org.apache.freemarker.core.model.TemplateBooleanModel; import org.apache.freemarker.core.model.TemplateDateModel; import org.apache.freemarker.core.model.TemplateModel; @@ -37,7 +39,9 @@ public class NonStringException extends UnexpectedTypeException { static final Class[] STRING_COERCABLE_TYPES = new Class[] { TemplateScalarModel.class, TemplateNumberModel.class, TemplateDateModel.class, TemplateBooleanModel.class }; - + + private static final Class<?>[] EXPECTED_TYPES = { TemplateScalarModel.class }; + private static final String DEFAULT_DESCRIPTION = "Expecting " + NonStringException.STRING_COERCABLE_TYPES_DESC + " value here"; @@ -70,5 +74,11 @@ public class NonStringException extends UnexpectedTypeException { ASTExpression blamed, TemplateModel model, String[] tips, Environment env) throws InvalidReferenceException { super(blamed, model, NonStringException.STRING_COERCABLE_TYPES_DESC, STRING_COERCABLE_TYPES, tips, env); } - + + NonStringException( + Serializable argumentNameOrIndex, TemplateModel model, String[] tips, Environment env) + throws InvalidReferenceException { + super(argumentNameOrIndex, model, "string", EXPECTED_TYPES, tips, env); + } + } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/_CallableUtils.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/_CallableUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/_CallableUtils.java new file mode 100644 index 0000000..0a69e51 --- /dev/null +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/_CallableUtils.java @@ -0,0 +1,156 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.freemarker.core; + +import java.io.IOException; +import java.io.Serializable; +import java.io.Writer; +import java.util.List; + +import org.apache.freemarker.core.model.ArgumentArrayLayout; +import org.apache.freemarker.core.model.Constants; +import org.apache.freemarker.core.model.TemplateCallableModel; +import org.apache.freemarker.core.model.TemplateDirectiveModel; +import org.apache.freemarker.core.model.TemplateFunctionModel; +import org.apache.freemarker.core.model.TemplateModel; +import org.apache.freemarker.core.model.TemplateNumberModel; +import org.apache.freemarker.core.model.TemplateScalarModel; + +/** + * For internal use only; don't depend on this, there's no backward compatibility guarantee at all! + */ +// TODO [FM3] Most functionality here should be made public on some way. Also BuiltIn-s has some duplicates utiltity +// methods for this functionality (checking arguments). Need to clean this up. +public final class _CallableUtils { + + private _CallableUtils() { + // + } + + public static void executeWith0Arguments( + TemplateDirectiveModel directive, CallPlace callPlace, Writer out, Environment env) + throws IOException, TemplateException { + directive.execute(getArgumentArrayWithNoArguments(directive), callPlace, out, env); + } + + public static TemplateModel executeWith0Arguments( + TemplateFunctionModel function, CallPlace callPlace, Environment env) + throws TemplateException { + return function.execute(getArgumentArrayWithNoArguments(function), callPlace, env); + } + + private static TemplateModel[] getArgumentArrayWithNoArguments(TemplateCallableModel callable) { + ArgumentArrayLayout argsLayout = callable.getArgumentArrayLayout(); + int totalLength = argsLayout.getTotalLength(); + if (totalLength == 0) { + return Constants.EMPTY_TEMPLATE_MODEL_ARRAY; + } else { + TemplateModel[] args = new TemplateModel[totalLength]; + + int positionalVarargsArgumentIndex = argsLayout.getPositionalVarargsArgumentIndex(); + if (positionalVarargsArgumentIndex != -1) { + args[positionalVarargsArgumentIndex] = Constants.EMPTY_SEQUENCE; + } + + int namedVarargsArgumentIndex = argsLayout.getNamedVarargsArgumentIndex(); + if (namedVarargsArgumentIndex != -1) { + args[namedVarargsArgumentIndex] = Constants.EMPTY_SEQUENCE; + } + + return args; + } + } + + public static Number castArgToNumber(TemplateModel[] args, int argIndex, boolean allowNull) + throws TemplateException { + return castArgToNumber(args[argIndex], argIndex, allowNull); + } + + public static Number castArgToNumber(TemplateModel argValue, int argIndex, boolean allowNull) + throws TemplateException { + return castArgToNumber(argValue, null, argIndex, allowNull); + } + + public static Number castArgToNumber(TemplateModel argValue, String argName, boolean allowNull) + throws TemplateException { + return castArgToNumber(argValue, argName, -1, allowNull); + } + + private static Number castArgToNumber(TemplateModel argValue, String argName, int argIndex, boolean allowNull) + throws TemplateException { + if (argValue instanceof TemplateNumberModel) { + return ((TemplateNumberModel) argValue).getAsNumber(); + } + if (argValue == null) { + if (allowNull) { + return null; + } + throw new _MiscTemplateException( + "The ", argName != null ? new _DelayedJQuote(argName) : new _DelayedOrdinal(argIndex + 1), + " argument can't be null."); + } + throw new NonNumericalException((Serializable) argName != null ? argName : argIndex, argValue, null, null); + } + + // + + public static String castArgToString(List<? extends TemplateModel> args, int argIndex) throws TemplateException { + return castArgToString(args, argIndex, false); + } + + public static String castArgToString(List<? extends TemplateModel> args, int argIndex, boolean allowNull) throws + TemplateException { + return castArgToString(args.get(argIndex), argIndex, allowNull); + } + + public static String castArgToString(TemplateModel[] args, int argIndex, boolean allowNull) throws TemplateException { + return castArgToString(args[argIndex], argIndex, allowNull); + } + + public static String castArgToString(TemplateModel argValue, int argIndex) throws TemplateException { + return castArgToString(argValue, argIndex, false); + } + + public static String castArgToString(TemplateModel argValue, int argIndex, boolean allowNull) throws TemplateException { + return castArgToString(argValue, null, argIndex, allowNull); + } + + public static String castArgToString(TemplateModel argValue, String argName, boolean allowNull) throws TemplateException { + return castArgToString(argValue, argName, -1, allowNull); + } + + private static String castArgToString( + TemplateModel argValue, String argName, int argIndex, + boolean allowNull) throws TemplateException { + if (argValue instanceof TemplateScalarModel) { + return _EvalUtil.modelToString((TemplateScalarModel) argValue, null, null); + } + if (argValue == null) { + if (allowNull) { + return null; + } + throw new _MiscTemplateException( + "The ", argName != null ? new _DelayedJQuote(argName) : new _DelayedOrdinal(argIndex + 1), + " argument can't be null."); + } + throw new NonStringException((Serializable) argName != null ? argName : argIndex, argValue, null, null); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java b/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java index 3ff249a..d2fe617 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java @@ -36,7 +36,7 @@ import java.util.Map; import java.util.Properties; import org.apache.freemarker.core.model.TemplateHashModel; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.impl.DefaultObjectWrapper; @@ -763,13 +763,13 @@ public class _ObjectBuilderSettingEvaluator { throw new _ObjectBuilderSettingEvaluationException( "Can't find " + beanPropSetter + " as FreeMarker method."); } - if (!(m instanceof TemplateMethodModelEx)) { + if (!(m instanceof TemplateMethodModel)) { throw new _ObjectBuilderSettingEvaluationException( - _StringUtil.jQuote(beanPropSetter.getName()) + " wasn't a TemplateMethodModelEx."); + _StringUtil.jQuote(beanPropSetter.getName()) + " wasn't a TemplateMethodModel."); } List/*TemplateModel*/ args = new ArrayList(); args.add(env.getObjectWrapper().wrap(namedParamValues.get(i))); - ((TemplateMethodModelEx) m).exec(args); + ((TemplateMethodModel) m).execute(args); } catch (Exception e) { throw new _ObjectBuilderSettingEvaluationException( "Failed to set " + _StringUtil.jQuote(name), e); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateCallableModelUtils.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateCallableModelUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateCallableModelUtils.java deleted file mode 100644 index 277dc1a..0000000 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateCallableModelUtils.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.freemarker.core; - -import java.io.IOException; -import java.io.Writer; - -import org.apache.freemarker.core.model.ArgumentArrayLayout; -import org.apache.freemarker.core.model.Constants; -import org.apache.freemarker.core.model.TemplateCallableModel; -import org.apache.freemarker.core.model.TemplateDirectiveModel; -import org.apache.freemarker.core.model.TemplateFunctionModel; -import org.apache.freemarker.core.model.TemplateModel; -import org.apache.freemarker.core.model.TemplateNumberModel; - -/** - * For internal use only; don't depend on this, there's no backward compatibility guarantee at all! - */ -// TODO [FM3] Most functionality here should be made public on some way -public final class _TemplateCallableModelUtils { - - private _TemplateCallableModelUtils() { - // - } - - public static void executeWith0Arguments( - TemplateDirectiveModel directive, CallPlace callPlace, Writer out, Environment env) - throws IOException, TemplateException { - directive.execute(getArgumentArrayWithNoArguments(directive), callPlace, out, env); - } - - public static TemplateModel executeWith0Arguments( - TemplateFunctionModel function, CallPlace callPlace, Environment env) - throws TemplateException { - return function.execute(getArgumentArrayWithNoArguments(function), callPlace, env); - } - - private static TemplateModel[] getArgumentArrayWithNoArguments(TemplateCallableModel callable) { - ArgumentArrayLayout argsLayout = callable.getArgumentArrayLayout(); - int totalLength = argsLayout.getTotalLength(); - if (totalLength == 0) { - return Constants.EMPTY_TEMPLATE_MODEL_ARRAY; - } else { - TemplateModel[] args = new TemplateModel[totalLength]; - - int positionalVarargsArgumentIndex = argsLayout.getPositionalVarargsArgumentIndex(); - if (positionalVarargsArgumentIndex != -1) { - args[positionalVarargsArgumentIndex] = Constants.EMPTY_SEQUENCE; - } - - int namedVarargsArgumentIndex = argsLayout.getNamedVarargsArgumentIndex(); - if (namedVarargsArgumentIndex != -1) { - args[namedVarargsArgumentIndex] = Constants.EMPTY_SEQUENCE; - } - - return args; - } - } - - public static TemplateNumberModel castArgumentToNumber(TemplateModel[] args, int argIndex, boolean allowNull, - Environment env) throws TemplateException { - return getTemplateNumberModel(args[argIndex], argIndex, allowNull, env); - } - - private static TemplateNumberModel getTemplateNumberModel(TemplateModel argValue, int argIndex, boolean allowNull, - Environment env) throws TemplateException { - if (argValue instanceof TemplateNumberModel) { - return (TemplateNumberModel) argValue; - } - if (argValue == null) { - if (allowNull) { - return null; - } - throw new _MiscTemplateException(env, - "The ", new _DelayedOrdinal(argIndex + 1), " argument can't be null."); - } - throw new NonNumericalException(argIndex, argValue, null, env); - } - - public static TemplateNumberModel castArgumentToNumber(TemplateModel argValue, String argName, boolean allowNull, - Environment env) throws TemplateException { - if (argValue instanceof TemplateNumberModel) { - return (TemplateNumberModel) argValue; - } - if (argValue == null) { - if (allowNull) { - return null; - } - throw new _MiscTemplateException(env, - "The ", new _DelayedJQuote(argName), " argument can't be null."); - } - throw new NonNumericalException(argName, argValue, null, env); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java index 0158bd9..1c6bc66 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java @@ -46,7 +46,6 @@ public interface DebugModel extends Remote { public static final int TYPE_HASH = 64; public static final int TYPE_HASH_EX = 128; public static final int TYPE_METHOD = 256; - public static final int TYPE_METHOD_EX = 512; public static final int TYPE_DIRECTIVE = 1024; public static final int TYPE_ENVIRONMENT = 2048; public static final int TYPE_TEMPLATE = 4096; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java index e8e8cf1..7ab7ec7 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java @@ -32,7 +32,6 @@ import org.apache.freemarker.core.model.TemplateDirectiveModel; import org.apache.freemarker.core.model.TemplateHashModel; import org.apache.freemarker.core.model.TemplateHashModelEx; import org.apache.freemarker.core.model.TemplateMethodModel; -import org.apache.freemarker.core.model.TemplateMethodModelEx; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.TemplateModelIterator; @@ -155,9 +154,8 @@ class RmiDebugModelImpl extends UnicastRemoteObject implements DebugModel { if (model instanceof TemplateSequenceModel) type += TYPE_SEQUENCE; if (model instanceof TemplateCollectionModel) type += TYPE_COLLECTION; if (model instanceof TemplateHashModelEx) type += TYPE_HASH_EX; - else if (model instanceof TemplateHashModel) type += TYPE_HASH; - if (model instanceof TemplateMethodModelEx) type += TYPE_METHOD_EX; - else if (model instanceof TemplateMethodModel) type += TYPE_METHOD; + if (model instanceof TemplateHashModel) type += TYPE_HASH; + if (model instanceof TemplateMethodModel) type += TYPE_METHOD; if (model instanceof TemplateDirectiveModel) type += TYPE_DIRECTIVE; return type; } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java index da1c102..92b0b58 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java @@ -28,7 +28,7 @@ import java.util.List; */ final class GeneralPurposeNothing -implements TemplateBooleanModel, TemplateScalarModel, TemplateSequenceModel, TemplateHashModelEx, TemplateMethodModelEx { +implements TemplateBooleanModel, TemplateScalarModel, TemplateSequenceModel, TemplateHashModelEx, TemplateMethodModel { public static final TemplateModel INSTANCE = new GeneralPurposeNothing(); @@ -66,7 +66,7 @@ implements TemplateBooleanModel, TemplateScalarModel, TemplateSequenceModel, Tem } @Override - public Object exec(List args) { + public TemplateModel execute(List<? extends TemplateModel> args) { return null; } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java index 5bfe7e3..c35a500 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java @@ -17,44 +17,37 @@ * under the License. */ -/* - * 22 October 1999: This class added by Holger Arendt. - */ - package org.apache.freemarker.core.model; import java.util.List; import org.apache.freemarker.core.Environment; +import org.apache.freemarker.core.TemplateException; +import org.apache.freemarker.core.util.DeepUnwrap; /** - * "method" template language data type: Objects that act like functions. The name comes from that their original - * application was calling Java methods via {@link org.apache.freemarker.core.model.impl.DefaultObjectWrapper}. - * - * <p>In templates they are used like {@code myMethod("foo", "bar")} or {@code myJavaObject.myJavaMethod("foo", "bar")}. + * "method" template language data type: Objects that act like functions. Their main application is calling + * Java methods via {@link org.apache.freemarker.core.model.impl.DefaultObjectWrapper}, but you can implement this + * interface to invoke top-level functions too. * - * @deprecated Use {@link TemplateMethodModelEx} instead. This interface is from the old times when the only kind of - * value you could pass in was string. + * <p>In templates they are used like {@code myMethod(1, "foo")} or {@code myJavaObject.myJavaMethod(1, "foo")}. */ -@Deprecated public interface TemplateMethodModel extends TemplateModel { /** - * Executes the method call. All arguments passed to the method call are - * coerced to strings before being passed, if the FreeMarker rules allow - * the coercion. If some of the passed arguments can not be coerced to a - * string, an exception will be raised in the engine and the method will - * not be called. If your method would like to act on actual data model - * objects instead of on their string representations, implement the - * {@link TemplateMethodModelEx} instead. - * - * @param arguments a <tt>List</tt> of <tt>String</tt> objects - * containing the values of the arguments passed to the method. + * Executes the method call. * + * @param args a {@link List} of {@link TemplateModel}-s, + * containing the arguments passed to the method. If the implementation absolutely wants + * to operate on POJOs, it can use the static utility methods in the {@link DeepUnwrap} + * class to easily obtain them. However, unwrapping is not always possible (or not perfectly), and isn't always + * efficient, so it's recommended to use the original {@link TemplateModel} value as much as possible. + * * @return the return value of the method, or {@code null}. If the returned value * does not implement {@link TemplateModel}, it will be automatically - * wrapped using the {@link Environment#getObjectWrapper() environment + * wrapped using the {@link Environment#getObjectWrapper() environment's * object wrapper}. */ - Object exec(List arguments) throws TemplateModelException; -} + TemplateModel execute(List<? extends TemplateModel> args) throws TemplateException; + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModelEx.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModelEx.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModelEx.java deleted file mode 100644 index 2517d22..0000000 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModelEx.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.freemarker.core.model; - -import java.util.List; - -import org.apache.freemarker.core.Environment; -import org.apache.freemarker.core.util.DeepUnwrap; - -/** - * "extended method" template language data type: Objects that act like functions. Their main application is calling - * Java methods via {@link org.apache.freemarker.core.model.impl.DefaultObjectWrapper}, but you can implement this interface to invoke - * top-level functions too. They are "extended" compared to the deprecated {@link TemplateMethodModel}, which could only - * accept string parameters. - * - * <p>In templates they are used like {@code myMethod(1, "foo")} or {@code myJavaObject.myJavaMethod(1, "foo")}. - */ -public interface TemplateMethodModelEx extends TemplateMethodModel { - - /** - * Executes the method call. - * - * @param arguments a {@link List} of {@link TemplateModel}-s, - * containing the arguments passed to the method. If the implementation absolutely wants - * to operate on POJOs, it can use the static utility methods in the {@link DeepUnwrap} - * class to easily obtain them. However, unwrapping is not always possible (or not perfectly), and isn't always - * efficient, so it's recommended to use the original {@link TemplateModel} value as much as possible. - * - * @return the return value of the method, or {@code null}. If the returned value - * does not implement {@link TemplateModel}, it will be automatically - * wrapped using the {@link Environment#getObjectWrapper() environment's - * object wrapper}. - */ - @Override - Object exec(List arguments) throws TemplateModelException; - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java index aa2f2f1..bc7ce67 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java @@ -38,6 +38,7 @@ import org.apache.freemarker.core._TemplateModelException; import org.apache.freemarker.core.model.AdapterTemplateModel; import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.TemplateModelIterator; @@ -105,7 +106,7 @@ public class BeanModel /** * Uses Beans introspection to locate a property or method with name * matching the key name. If a method or property is found, it's wrapped - * into {@link org.apache.freemarker.core.model.TemplateMethodModelEx} (for a method or + * into {@link TemplateMethodModel} (for a method or * indexed property), or evaluated on-the-fly and the return value wrapped * into appropriate model (for a simple property) Models for various * properties and methods are cached on a per-class basis, so the costly http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java index e4436e9..1a0e251 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java @@ -56,7 +56,7 @@ import org.apache.freemarker.core.model.TemplateBooleanModel; import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateDateModel; import org.apache.freemarker.core.model.TemplateHashModel; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelAdapter; import org.apache.freemarker.core.model.TemplateModelException; @@ -481,7 +481,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper { * Wraps a Java method so that it can be called from templates, without wrapping its parent ("this") object. The * result is almost the same as that you would get by wrapping the parent object then getting the method from the * resulting {@link TemplateHashModel} by name. Except, if the wrapped method is overloaded, with this method you - * explicitly select a an overload, while otherwise you would get a {@link TemplateMethodModelEx} that selects an + * explicitly select a an overload, while otherwise you would get a {@link TemplateMethodModel} that selects an * overload each time it's called based on the argument values. * * @param object The object whose method will be called, or {@code null} if {@code method} is a static method. @@ -489,7 +489,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper { * @param method The method to call, which must be an (inherited) member of the class of {@code object}, as * described by {@link Method#invoke(Object, Object...)} */ - public TemplateMethodModelEx wrap(Object object, Method method) { + public TemplateMethodModel wrap(Object object, Method method) { return new JavaMethodModel(object, method, method.getParameterTypes(), this); } @@ -582,7 +582,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper { // This is for transparent interop with other wrappers (and ourselves) // Passing the targetClass allows e.g. a Jython-aware method that declares a // PyObject as its argument to receive a PyObject from a Jython-aware TemplateModel - // passed as an argument to TemplateMethodModelEx etc. + // passed as an argument to TemplateMethodModel etc. if (model instanceof AdapterTemplateModel) { Object wrapped = ((AdapterTemplateModel) model).getAdaptedObject(targetClass); if (targetClass == Object.class || targetClass.isInstance(wrapped)) { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java index 6408117..f89952e 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java @@ -24,14 +24,15 @@ import java.lang.reflect.Method; import java.util.List; import org.apache.freemarker.core._UnexpectedTypeErrorExplainerTemplateModel; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; +import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; /** - * Wraps a {@link Method} into the {@link TemplateMethodModelEx} interface. It is used by {@link BeanModel} to wrap + * Wraps a {@link Method} into the {@link TemplateMethodModel} interface. It is used by {@link BeanModel} to wrap * non-overloaded methods. */ -public final class JavaMethodModel extends SimpleMethod implements TemplateMethodModelEx, +public final class JavaMethodModel extends SimpleMethod implements TemplateMethodModel, _UnexpectedTypeErrorExplainerTemplateModel { private final Object object; private final DefaultObjectWrapper wrapper; @@ -53,10 +54,10 @@ public final class JavaMethodModel extends SimpleMethod implements TemplateMetho * Invokes the method, passing it the arguments from the list. */ @Override - public Object exec(List arguments) throws TemplateModelException { + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { try { return wrapper.invokeMethod(object, (Method) getMember(), - unwrapArguments(arguments, wrapper)); + unwrapArguments(args, wrapper)); } catch (TemplateModelException e) { throw e; } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java index 9a66a6d..72ca642 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java @@ -23,14 +23,14 @@ package org.apache.freemarker.core.model.impl; import java.util.List; import org.apache.freemarker.core.model.TemplateMethodModel; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; /** * Wraps a set of same-name overloaded methods behind {@link TemplateMethodModel} interface, * like if it was a single method, chooses among them behind the scenes on call-time based on the argument values. */ -class OverloadedMethodsModel implements TemplateMethodModelEx { +class OverloadedMethodsModel implements TemplateMethodModel { private final Object object; private final OverloadedMethods overloadedMethods; private final DefaultObjectWrapper wrapper; @@ -49,8 +49,8 @@ class OverloadedMethodsModel implements TemplateMethodModelEx { * unambiguously. */ @Override - public Object exec(List arguments) throws TemplateModelException { - MemberAndArguments maa = overloadedMethods.getMemberAndArguments(arguments, wrapper); + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { + MemberAndArguments maa = overloadedMethods.getMemberAndArguments(args, wrapper); try { return maa.invokeMethod(wrapper, object); } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java index 31af451..457c7ef 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java @@ -31,7 +31,7 @@ import java.util.Set; import org.apache.freemarker.core._DelayedJQuote; import org.apache.freemarker.core._TemplateModelException; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; @@ -54,9 +54,9 @@ public class ResourceBundleModel extends BeanModel implements - TemplateMethodModelEx { + TemplateMethodModel { - private Hashtable formats = null; + private Hashtable<String, MessageFormat> formats = null; public ResourceBundleModel(ResourceBundle bundle, DefaultObjectWrapper wrapper) { super(bundle, wrapper); @@ -108,13 +108,13 @@ public class ResourceBundleModel * rest of the arguments. The created MessageFormats are cached for later reuse. */ @Override - public Object exec(List arguments) + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { // Must have at least one argument - the key - if (arguments.size() < 1) + if (args.size() < 1) throw new TemplateModelException("No message key was specified"); // Read it - Iterator it = arguments.iterator(); + Iterator<? extends TemplateModel> it = args.iterator(); String key = unwrap((TemplateModel) it.next()).toString(); try { if (!it.hasNext()) { @@ -122,10 +122,10 @@ public class ResourceBundleModel } // Copy remaining arguments into an Object[] - int args = arguments.size() - 1; - Object[] params = new Object[args]; - for (int i = 0; i < args; ++i) - params[i] = unwrap((TemplateModel) it.next()); + int paramsLen = args.size() - 1; + Object[] params = new Object[paramsLen]; + for (int i = 0; i < paramsLen; ++i) + params[i] = unwrap(it.next()); // Invoke format return new BeanAndStringModel(format(key, params), wrapper); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java index 8a7f082..9c4db4e 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java @@ -28,6 +28,7 @@ import java.util.Map; import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.slf4j.Logger; @@ -37,7 +38,7 @@ import org.slf4j.LoggerFactory; * Wraps the static fields and methods of a class in a * {@link org.apache.freemarker.core.model.TemplateHashModel}. * Fields are wrapped using {@link DefaultObjectWrapper#wrap(Object)}, and - * methods are wrapped into an appropriate {@link org.apache.freemarker.core.model.TemplateMethodModelEx} instance. + * methods are wrapped into an appropriate {@link TemplateMethodModel} instance. * Unfortunately, there is currently no support for bean property-style * calls of static methods, similar to that in {@link BeanModel}. */ http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java index b049c63..2394394 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java @@ -21,13 +21,13 @@ package org.apache.freemarker.core.model.impl; import java.util.List; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateSequenceModel; /** * A sequence that wraps a {@link List} of {@link TemplateModel}-s. It does not copy the original - * list. It's mostly useful when implementing {@link TemplateMethodModelEx}-es that collect items from other + * list. It's mostly useful when implementing {@link TemplateMethodModel}-es that collect items from other * {@link TemplateModel}-s. */ public class TemplateModelListSequence implements TemplateSequenceModel { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java ---------------------------------------------------------------------- diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java index fb63309..ff9db12 100644 --- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java +++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java @@ -28,7 +28,7 @@ import org.apache.freemarker.core._UnexpectedTypeErrorExplainerTemplateModel; import org.apache.freemarker.core.model.ArgumentArrayLayout; import org.apache.freemarker.core.CallPlace; import org.apache.freemarker.core.model.TemplateDirectiveModel; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.impl.JavaMethodModel; @@ -47,7 +47,7 @@ class CustomTagAndELFunctionCombiner { * @param customTag * A {@link TemplateDirectiveModel}. */ - static TemplateModel combine(TemplateModel customTag, TemplateMethodModelEx elFunction) { + static TemplateModel combine(TemplateModel customTag, TemplateMethodModel elFunction) { if (customTag instanceof TemplateDirectiveModel) { return elFunction instanceof JavaMethodModel // ? new TemplateDirectiveModelAndSimpleMethodModel( // @@ -62,7 +62,7 @@ class CustomTagAndELFunctionCombiner { /** * Tells if the value can be used as the "custom tag" parameter to - * {@link #combine(TemplateModel, TemplateMethodModelEx)}. + * {@link #combine(TemplateModel, TemplateMethodModel)}. */ static boolean canBeCombinedAsCustomTag(TemplateModel tm) { return (tm instanceof TemplateDirectiveModel) && !(tm instanceof CombinedTemplateModel); @@ -70,10 +70,10 @@ class CustomTagAndELFunctionCombiner { /** * Tells if the value can be used as the "EL function" parameter to - * {@link #combine(TemplateModel, TemplateMethodModelEx)}. + * {@link #combine(TemplateModel, TemplateMethodModel)}. */ static boolean canBeCombinedAsELFunction(TemplateModel tm) { - return tm instanceof TemplateMethodModelEx && !(tm instanceof CombinedTemplateModel); + return tm instanceof TemplateMethodModel && !(tm instanceof CombinedTemplateModel); } private static class CombinedTemplateModel { @@ -81,7 +81,7 @@ class CustomTagAndELFunctionCombiner { } private static class TemplateDirectiveModelAndSimpleMethodModel extends CombinedTemplateModel - implements TemplateDirectiveModel, TemplateMethodModelEx, + implements TemplateDirectiveModel, TemplateMethodModel, _UnexpectedTypeErrorExplainerTemplateModel { private final TemplateDirectiveModel templateDirectiveModel; @@ -94,8 +94,8 @@ class CustomTagAndELFunctionCombiner { } @Override - public Object exec(List arguments) throws TemplateModelException { - return simpleMethodModel.exec(arguments); + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateModelException { + return simpleMethodModel.execute(args); } @Override @@ -121,20 +121,20 @@ class CustomTagAndELFunctionCombiner { } private static class TemplateDirectiveModelAndTemplateMethodModelEx extends CombinedTemplateModel - implements TemplateDirectiveModel, TemplateMethodModelEx { + implements TemplateDirectiveModel, TemplateMethodModel { private final TemplateDirectiveModel templateDirectiveModel; - private final TemplateMethodModelEx templateMethodModelEx; + private final TemplateMethodModel templateMethodModelEx; public TemplateDirectiveModelAndTemplateMethodModelEx( // - TemplateDirectiveModel templateDirectiveModel, TemplateMethodModelEx templateMethodModelEx) { + TemplateDirectiveModel templateDirectiveModel, TemplateMethodModel templateMethodModelEx) { this.templateDirectiveModel = templateDirectiveModel; this.templateMethodModelEx = templateMethodModelEx; } @Override - public Object exec(List arguments) throws TemplateModelException { - return templateMethodModelEx.exec(arguments); + public TemplateModel execute(List<? extends TemplateModel> args) throws TemplateException { + return templateMethodModelEx.execute(args); } @Override http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java ---------------------------------------------------------------------- diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java index 606cef8..98634bd 100644 --- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java +++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java @@ -66,7 +66,7 @@ import org.apache.freemarker.core.Environment; import org.apache.freemarker.core.model.ObjectWrapper; import org.apache.freemarker.core.model.TemplateDirectiveModel; import org.apache.freemarker.core.model.TemplateHashModel; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.impl.DefaultObjectWrapper; @@ -233,7 +233,7 @@ public class TaglibFactory implements TemplateHashModel { * * @return a {@link TemplateHashModel} representing the JSP taglib. Each element of this hash represents a single * custom tag or EL function from the library, implemented as a {@link TemplateDirectiveModel} or - * {@link TemplateMethodModelEx}, respectively. + * {@link TemplateMethodModel}, respectively. */ @Override public TemplateModel get(final String taglibUri) throws TemplateModelException { @@ -1777,7 +1777,7 @@ public class TaglibFactory implements TemplateHashModel { if (replacedTagOrFunction != null) { if (CustomTagAndELFunctionCombiner.canBeCombinedAsELFunction(replacedTagOrFunction)) { tagsAndFunctions.put(tagNameCData, CustomTagAndELFunctionCombiner.combine( - customTagModel, (TemplateMethodModelEx) replacedTagOrFunction)); + customTagModel, (TemplateMethodModel) replacedTagOrFunction)); } else { if (LOG.isWarnEnabled()) { LOG.warn("TLD contains multiple tags with name " + _StringUtil.jQuote(tagNameCData) @@ -1816,7 +1816,7 @@ public class TaglibFactory implements TemplateHashModel { locator); } - final TemplateMethodModelEx elFunctionModel; + final TemplateMethodModel elFunctionModel; try { elFunctionModel = defaultObjectWrapper.wrap(null, functionMethod); } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java ---------------------------------------------------------------------- diff --git a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java index 38e69b5..43285c5 100644 --- a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java +++ b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java @@ -33,12 +33,10 @@ import javax.servlet.jsp.tagext.TagSupport; import javax.xml.parsers.SAXParserFactory; import org.apache.freemarker.core.Configuration; -import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateMethodModel; import org.apache.freemarker.core.model.TemplateScalarModel; import org.apache.freemarker.core.model.impl.DefaultObjectWrapper; import org.apache.freemarker.core.model.impl.SimpleScalar; -import org.apache.freemarker.servlet.jsp.JspTagModelBase; -import org.apache.freemarker.servlet.jsp.TaglibFactory; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -84,13 +82,13 @@ public class TLDParsingTest { tag = (JspTagModelBase) tagsAndFunctions.get("setStringAttributeTag2"); assertNotNull(tag); - TemplateMethodModelEx function = (TemplateMethodModelEx) tagsAndFunctions.get("toUpperCase"); + TemplateMethodModel function = (TemplateMethodModel) tagsAndFunctions.get("toUpperCase"); assertNotNull(function); - TemplateScalarModel result = (TemplateScalarModel) function.exec(Arrays.asList(new SimpleScalar("abc"))); + TemplateScalarModel result = (TemplateScalarModel) function.execute(Arrays.asList(new SimpleScalar("abc"))); assertEquals("ABC", result.getAsString()); - function = (TemplateMethodModelEx) tagsAndFunctions.get("toUpperCase2"); + function = (TemplateMethodModel) tagsAndFunctions.get("toUpperCase2"); assertNotNull(function); - result = (TemplateScalarModel) function.exec(Arrays.asList(new SimpleScalar("abc"))); + result = (TemplateScalarModel) function.execute(Arrays.asList(new SimpleScalar("abc"))); assertEquals("ABC", result.getAsString()); }
