/*
 * 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 freemarker.test.templatesuite.models;

import java.io.File;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import freemarker.core.Environment;
import freemarker.ext.beans.RationalNumber;
import freemarker.ext.util.WrapperTemplateModel;
import freemarker.template.AdapterTemplateModel;
import freemarker.template.ObjectWrapper;
import freemarker.template.TemplateBooleanModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateNumberModel;
import freemarker.template.utility.StringUtil;
import freemarker.test.utility.Helpers;

public class OverloadedMethods2 {

    public String mVarargs(String... a1) {
        StringBuilder sb = new StringBuilder();
        for (String s : a1) {
            sb.append(s);
        }
        return "mVarargs(String... a1 = " + sb + ")";
    }
    
    public BigInteger bigInteger(BigDecimal n) {
        return n.toBigInteger();
    }

    public RationalNumber rational(int a, int b) {
        return new RationalNumber(a, b);
    }
    
    public String mVarargs(File a1, String... a2) {
        return "mVarargs(File a1, String... a2)";
    }

    public NumberAndStringModel getNnS(String s) {
        return new NumberAndStringModel(s);
    }
    
    public String mNull1(String a1) {
        return "mNull1(String a1 = " + a1 + ")";
    }

    public String mNull1(int a1) {
        return "mNull1(int a1 = " + a1 + ")";
    }
    
    public String mNull2(String a1) {
        return "mNull2(String a1 = " + a1 + ")";
    }
    
    public String mNull2(Object a1) {
        return "mNull2(Object a1 = " + a1 + ")";
    }
    
    public String mSpecificity(Object a1, String a2) {
        return "mSpecificity(Object a1, String a2)";
    }
    
    public String mSpecificity(String a1, Object a2) {
        return "mSpecificity(String a1, Object a2)";
    }
    
    public String mChar(char a1) {
        return "mChar(char a1 = " + a1 + ")";
    }
    
    public String mChar(Character a1) {
        return "mChar(Character a1 = " + a1 + ")";
    }
    
    public String mBoolean(boolean a1) {
        return "mBoolean(boolean a1 = " + a1 + ")";
    }
    
    public String mBoolean(Boolean a1) {
        return "mBoolean(Boolean a1 = " + a1 + ")";
    }

    public int mIntNonOverloaded(int a1) {
        return a1;
    }

    public String mIntPrimVSBoxed(int a1) {
        return "mIntPrimVSBoxed(int a1 = " + a1 + ")";
    }
    
    public String mIntPrimVSBoxed(Integer a1) {
        return "mIntPrimVSBoxed(Integer a1 = " + a1 + ")";
    }

    public String mNumPrimVSPrim(short a1) {
        return "mNumPrimVSPrim(short a1 = " + a1 + ")";
    }
    
    public String mNumPrimVSPrim(long a1) {
        return "mNumPrimVSPrim(long a1 = " + a1 + ")";
    }

    public String mNumBoxedVSBoxed(Short a1) {
        return "mNumBoxedVSBoxed(Short a1 = " + a1 + ")";
    }
    
    public String mNumBoxedVSBoxed(Long a1) {
        return "mNumBoxedVSBoxed(Long a1 = " + a1 + ")";
    }

    public String mNumUnambigous(Short a1, boolean otherOverload) {
        return "mmNumUnambigous won't be called";
    }
    
    public String mNumUnambigous(Integer a1) {
        return "mNumUnambigous(Integer a1 = " + a1 + ")";
    }
    
    public String mNumBoxedAll(Byte a1) {
        return "mNumBoxedAll(Byte a1 = " + a1 + ")";
    }
    
    public String mNumBoxedAll(Short a1) {
        return "mNumBoxedAll(Short a1 = " + a1 + ")";
    }

    public String mNumBoxedAll(Integer a1) {
        return "mNumBoxedAll(Integer a1 = " + a1 + ")";
    }
    
    public String mNumBoxedAll(Long a1) {
        return "mNumBoxedAll(Long a1 = " + a1 + ")";
    }
    
    public String mNumBoxedAll(Float a1) {
        return "mNumBoxedAll(Float a1 = " + a1 + ")";
    }
    
    public String mNumBoxedAll(Double a1) {
        return "mNumBoxedAll(Double a1 = " + a1 + ")";
    }
    
    public String mNumBoxedAll(BigInteger a1) {
        return "mNumBoxedAll(BigInteger a1 = " + a1 + ")";
    }
    
    public String mNumBoxedAll(BigDecimal a1) {
        return "mNumBoxedAll(BigDecimal a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll(byte a1) {
        return "mNumPrimAll(byte a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll(short a1) {
        return "mNumPrimAll(short a1 = " + a1 + ")";
    }

    public String mNumPrimAll(int a1) {
        return "mNumPrimAll(int a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll(long a1) {
        return "mNumPrimAll(long a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll(float a1) {
        return "mNumPrimAll(float a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll(double a1) {
        return "mNumPrimAll(double a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll(BigInteger a1) {
        return "mNumPrimAll(BigInteger a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll(BigDecimal a1) {
        return "mNumPrimAll(BigDecimal a1 = " + a1 + ")";
    }

    
    public String mNumBoxedAll2nd(Short a1) {
        return "mNumBoxedAll2nd(Short a1 = " + a1 + ")";
    }

    public String mNumBoxedAll2nd(Long a1) {
        return "mNumBoxedAll2nd(Long a1 = " + a1 + ")";
    }
    
    public String mNumBoxedAll2nd(Double a1) {
        return "mNumBoxedAll2nd(Double a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll2nd(short a1) {
        return "mNumPrimAll2nd(short a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll2nd(long a1) {
        return "mNumPrimAll2nd(long a1 = " + a1 + ")";
    }
    
    public String mNumPrimAll2nd(double a1) {
        return "mNumPrimAll2nd(double a1 = " + a1 + ")";
    }
    
    public String mNumPrimFallbackToNumber(long a1) {
        return "mNumPrimFallbackToNumber(long a1 = " + a1 + ")";
    }
    
    public String mNumPrimFallbackToNumber(Number a1) {
        return "mNumPrimFallbackToNumber(Number a1 = " + a1 + ")";
    }
    
    public String mNumPrimFallbackToNumber(Object a1) {
        return "mNumPrimFallbackToNumber(Object a1 = " + a1 + ")";
    }
    
    public String mNumBoxedFallbackToNumber(Long a1) {
        return "mNumBoxedFallbackToNumber(Long a1 = " + a1 + ")";
    }
    
    public String mNumBoxedFallbackToNumber(Number a1) {
        return "mNumBoxedFallbackToNumber(Number a1 = " + a1 + ")";
    }
    
    public String mNumBoxedFallbackToNumber(Object a1) {
        return "mNumBoxedFallbackToNumber(Object a1 = " + a1 + ")";
    }

    public String mDecimalLoss(int a1) {
        return "mDecimalLoss(int a1 = " + a1 + ")";
    }
        
    public String mDecimalLoss(double a1) {
        return "mDecimalLoss(double a1 = " + a1 + ")";
    }
    
    public String mNumConversionLoses1(byte i, Object o1, Object o2) {
        return "byte " + i;
    }
    
    public String mNumConversionLoses1(double i, Object o1, Object o2) {
        return "double " + i;
    }

    public String mNumConversionLoses1(Number i, String o1, String o2) {
        return "Number " + i + " " + i.getClass().getName();
    }

    public String mNumConversionLoses2(int i, Object o1, Object o2) {
        return "int " + i;
    }

    public String mNumConversionLoses2(long i, Object o1, Object o2) {
        return "long " + i;
    }

    public String mNumConversionLoses2(Number i, String o1, String o2) {
        return "Number " + i + " " + i.getClass().getName();
    }

    public String mNumConversionLoses3(int i, Object o1, Object o2) {
        return "int " + i;
    }

    public String mNumConversionLoses3(Serializable i, String o1, String o2) {
        return "Serializable " + i + " " + i.getClass().getName();
    }
    
    public String nIntAndLong(int i) {
        return "nIntAndLong(int " + i + ")";
    }
    
    public String nIntAndLong(long i) {
        return "nIntAndLong(long " + i + ")";
    }

    public String nIntAndShort(int i) {
        return "nIntAndShort(int " + i + ")";
    }
    
    public String nIntAndShort(short i) {
        return "nIntAndShort(short " + i + ")";
    }

    public String nLongAndShort(long i) {
        return "nLongAndShort(long " + i + ")";
    }
    
    public String nLongAndShort(short i) {
        return "nLongAndShort(short " + i + ")";
    }

    public String varargs1(String s, int... xs) {
        return "varargs1(String s = " + StringUtil.jQuote(s) + ", int... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs1(String s, double... xs) {
        return "varargs1(String s = " + StringUtil.jQuote(s) + ", double... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs1(String s, Object... xs) {
        return "varargs1(String s = " + StringUtil.jQuote(s) + ", Object... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs1(Object s, Object... xs) {
        return "varargs1(Object s = " + s + ", Object... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs2(int... xs) {
        return "varargs2(int... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs2(double... xs) {
        return "varargs2(double... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs3(String... xs) {
        return "varargs3(String... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs3(Comparable... xs) {
        return "varargs3(Comparable... xs = " + Helpers.arrayToString(xs) + ")";
    }
    
    public String varargs3(Object... xs) {
        return "varargs3(Object... xs = " + Helpers.arrayToString(xs) + ")";
    }
    
    public String varargs4(Integer... xs) {
        return "varargs4(Integer... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs4(int... xs) {
        return "varargs4(int... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs5(int... xs) {
        return "varargs5(int... xs = " + Helpers.arrayToString(xs) + ")";
    }
    
    public String varargs5(int a1, int... xs) {
        return "varargs5(int a1 = " + a1 + ", int... xs = " + Helpers.arrayToString(xs) + ")";
    }
    
    public String varargs5(int a1, int a2, int... xs) {
        return "varargs5(int a1 = " + a1 + ", int a2 = " + a2 + ", int... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs5(int a1, int a2, int a3, int... xs) {
        return "varargs5(int a1 = " + a1 + ", int a2 = " + a2 + ", int a3 = " + a3
                + ", int... xs = " + Helpers.arrayToString(xs) + ")";
    }

    public String varargs6(String a1, int... xs) {
        return "varargs6(String a1 = " + a1 + ", int... xs = " + Helpers.arrayToString(xs) + ")";
    }
    
    public String varargs6(Object a1, int a2, int... xs) {
        return "varargs6(Object a1 = " + a1 + ", int a2 = " + a2 + ", int... xs = " + Helpers.arrayToString(xs) + ")";
    }
    
    public String varargs7(int... xs) {
        return "varargs7(int... xs = " + Helpers.arrayToString(xs) + ")";
    }
    
    public String varargs7(short a1, int... xs) {
        return "varargs7(short a1 = " + a1 + ", int... xs = " + Helpers.arrayToString(xs) + ")";
    }
    
    public String mNullAmbiguous(String s) {
        return "mNullAmbiguous(String s = " + s + ")";
    }

    public String mNullAmbiguous(int i) {
        return "mNullAmbiguous(int i = " + i + ")";
    }

    public String mNullAmbiguous(File f) {
        return "mNullAmbiguous(File f = " + f + ")";
    }
    
    public String mNullAmbiguous2(String s) {
        return "mNullNonAmbiguous(String s = " + s + ")";
    }

    public String mNullAmbiguous2(File f) {
        return "mNullAmbiguous(File f = " + f + ")";
    }

    public String mNullAmbiguous2(Object o) {
        return "mNullAmbiguous(Object o = " + o + ")";
    }

    public String mNullNonAmbiguous(String s) {
        return "mNullNonAmbiguous(String s = " + s + ")";
    }

    public String mNullNonAmbiguous(int i) {
        return "mNullNonAmbiguous(int i = " + i + ")";
    }
    
    public String mVarargsIgnoredTail(int i, double... ds) {
        return "mVarargsIgnoredTail(int i = " + i + ", double... ds = " + Helpers.arrayToString(ds) + ")"; 
    }
    
    public String mVarargsIgnoredTail(int... is) {
        return "mVarargsIgnoredTail(int... is = " + Helpers.arrayToString(is) + ")"; 
    }
    
    public String mLowRankWins(int x, int y, Object o) {
        return "mLowRankWins(int x = " + x + ", int y = " + y + ", Object o = " + o + ")";
    }

    public String mLowRankWins(Integer x, Integer y, String s) {
        return "mLowRankWins(Integer x = " + x + ", Integer y = " + y + ", String s = " + s + ")";
    }
    
    public String mRareWrappings(File f, double d1, Double d2, double d3, boolean b) {
        return "mRareWrappings(File f = " + f + ", double d1 = " + d1 + ", Double d2 = " + d2
                + ", double d3 = " + d3 + ", b = " + b + ")";
    }

    public String mRareWrappings(Object o, double d1, Double d2, Double d3, boolean b) {
        return "mRareWrappings(Object o = " + o + ", double d1 = " + d1 + ", Double d2 = " + d2
                + ", double d3 = " + d3 + ", b = " + b + ")";
    }

    public String mRareWrappings(String s, double d1, Double d2, Double d3, boolean b) {
        return "mRareWrappings(String s = " + s + ", double d1 = " + d1 + ", Double d2 = " + d2
                + ", double d3 = " + d3 + ", b = " + b + ")";
    }

    public String mRareWrappings2(String s) {
        return "mRareWrappings2(String s = " + s + ")";
    }
    
    public String mRareWrappings2(byte b) {
        return "mRareWrappings2(byte b = " + b + ")";
    }
    
    public File getFile() {
        return new File("file");
    }

    public String mSeqToArrayNonOverloaded(String[] items, String s) {
        return "mSeqToArrayNonOverloaded(String[] " + Helpers.arrayToString(items) + ", String " + s + ")";
    }
    
    public String mSeqToArrayGoodHint(String[] items, String s) {
        return "mSeqToArrayGoodHint(String[] " + Helpers.arrayToString(items) + ", String " + s + ")";
    }

    public String mSeqToArrayGoodHint(String[] items, int i) {
        return "mSeqToArrayGoodHint(String[] " + Helpers.arrayToString(items) + ", int " + i + ")";
    }

    public String mSeqToArrayGoodHint2(String[] items, String s) {
        return "mSeqToArrayGoodHint2(String[] " + Helpers.arrayToString(items) + ", String " + s + ")";
    }

    public String mSeqToArrayGoodHint2(String item) {
        return "mSeqToArrayGoodHint2(String " + item + ")";
    }
    
    public String mSeqToArrayPoorHint(String[] items, String s) {
        return "mSeqToArrayPoorHint(String[] " + Helpers.arrayToString(items) + ", String " + s + ")";
    }

    public String mSeqToArrayPoorHint(String item, int i) {
        return "mSeqToArrayPoorHint(String " + item + ", int " + i + ")";
    }

    public String mSeqToArrayPoorHint2(String[] items) {
        return "mSeqToArrayPoorHint2(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mSeqToArrayPoorHint2(String item) {
        return "mSeqToArrayPoorHint2(String " + item + ")";
    }
    
    public String mSeqToArrayPoorHint3(String[] items) {
        return "mSeqToArrayPoorHint3(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mSeqToArrayPoorHint3(int[] items) {
        return "mSeqToArrayPoorHint3(int[] " + Helpers.arrayToString(items) + ")";
    }

    public String mStringArrayVsListPreference(String[] items) {
        return "mStringArrayVsListPreference(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mStringArrayVsListPreference(List items) {
        return "mStringArrayVsListPreference(List " + Helpers.listToString(items) + ")";
    }

    public String mStringArrayVsObjectArrayPreference(String[] items) {
        return "mStringArrayVsObjectArrayPreference(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mStringArrayVsObjectArrayPreference(Object[] items) {
        return "mStringArrayVsObjectArrayPreference(Object[] " + Helpers.arrayToString(items) + ")";
    }

    public String mIntArrayVsIntegerArrayPreference(int[] items) {
        return "mIntArrayVsIntegerArrayPreference(int[] " + Helpers.arrayToString(items) + ")";
    }

    public String mIntArrayVsIntegerArrayPreference(Integer[] items) {
        return "mIntArrayVsIntegerArrayPreference(Integer[] " + Helpers.arrayToString(items) + ")";
    }
    
    public String mIntArrayNonOverloaded(int[] items) {
        return "mIntArrayNonOverloaded(int[] " + Helpers.arrayToString(items) + ")";
    }

    public String mIntegerArrayNonOverloaded(Integer[] items) {
        return "mIntegerArrayNonOverloaded(Integer[] " + Helpers.arrayToString(items) + ")";
    }

    public String mIntegerListNonOverloaded(List<Integer> items) {
        return "mIntegerListNonOverloaded(List<Integer> " + items + ")";
    }

    public String mStringListNonOverloaded(List<String> items) {
        return "mStringListNonOverloaded(List<String> " + items + ")";
    }

    public String mStringArrayNonOverloaded(String[] items) {
        return "mStringArrayNonOverloaded(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mObjectListNonOverloaded(List<Object> items) {
        return "mObjectListNonOverloaded(List<Object> " + items + ")";
    }

    public String mObjectArrayNonOverloaded(Object[] items) {
        return "mObjectArrayNonOverloaded(Object[] " + Helpers.arrayToString(items) + ")";
    }

    public String mIntegerArrayOverloaded(Integer[] items, int i) {
        return "mIntegerArrayOverloaded(Integer[] " + Helpers.arrayToString(items) + ", int " + i + ")";
    }

    public String mIntegerArrayOverloaded(Object obj, boolean b) {
        return "mIntegerArrayOverloaded(Object " + obj + ", boolean " + b + ")";
    }

    public String mStringArrayOverloaded(String[] items, int i) {
        return "mStringArrayOverloaded(String[] " + Helpers.arrayToString(items) + ", int " + i + ")";
    }

    public String mStringArrayOverloaded(Object obj, boolean b) {
        return "mStringArrayOverloaded(Object " + obj + ", boolean " + b + ")";
    }

    public String mCharArrayOverloaded(char[] items, int i) {
        return "mCharArrayOverloaded(char[] " + Helpers.arrayToString(items) + ", int " + i + ")";
    }

    public String mCharArrayOverloaded(Character[] items, String s) {
        return "mCharArrayOverloaded(Character[] " + Helpers.arrayToString(items) + ", String " + s + ")";
    }
    
    public String mCharArrayOverloaded(Object obj, boolean b) {
        return "mCharArrayOverloaded(Object " + obj + ", boolean " + b + ")";
    }

    public String mStringArrayArrayOverloaded(String[][] arrayArray, int i) {
        return "mStringArrayArrayOverloaded(String[][] " + Helpers.arrayToString(arrayArray) + ", int " + i + ")";
    }
    
    public String mStringArrayArrayOverloaded(Object obj, boolean b) {
        return "mStringArrayArrayOverloaded(Object " + obj + ", boolean " + b + ")";
    }
    
    public String mIntArrayArrayOverloaded(int[][] xss) {
        return "mIntArrayArrayOverloaded(" + Helpers.arrayToString(xss) + ")";
    }

    public String mIntArrayArrayOverloaded(String s) {
        return "mIntArrayArrayOverloaded(" + s + ")";
    }
    
    public String mArrayOfListsOverloaded(List[] xss) {
        return "mArrayOfListsOverloaded(" + Helpers.arrayToString(xss) + ")";
    }

    public String mArrayOfListsOverloaded(String x) {
        return "mArrayOfListsOverloaded(" + x + ")";
    }
    
    public String mIntArrayArrayNonOverloaded(int[][] xss) {
        return "mIntArrayArrayNonOverloaded(" + Helpers.arrayToString(xss) + ")";
    }

    public String mArrayOfListsNonOverloaded(List[] xss) {
        return "mArrayOfListsNonOverloaded(" + Helpers.arrayToString(xss) + ")";
    }
    
    public String mStringArrayVarargsNonOverloaded(String... items) {
        return "mStringArrayVarargsNonOverloaded(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mStringArrayVarargsOverloaded(String... items) {
        return "mStringArrayVarargsNonOverloaded(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mStringArrayVarargsOverloaded1(String... items) {
        return "mStringArrayVarargsOverloaded1(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mStringArrayVarargsOverloaded1(List<String> items) {
        return "mStringArrayVarargsOverloaded1(List " + Helpers.listToString(items) + ")";
    }

    public String mStringArrayVarargsOverloaded2(String... items) {
        return "mStringArrayVarargsOverloaded2(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mStringArrayVarargsOverloaded2(String item) {
        return "mStringArrayVarargsOverloaded2(String " + item + ")";
    }
    
    public String mStringArrayVarargsOverloaded3(String... items) {
        return "mStringArrayVarargsOverloaded3(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mStringArrayVarargsOverloaded3(String item1, String item2) {
        return "mStringArrayVarargsOverloaded3(String " + item1 + ", String " + item2 + ")";
    }
    
    public String mStringArrayVarargsOverloaded4(String... items) {
        return "mStringArrayVarargsOverloaded4(String[] " + Helpers.arrayToString(items) + ")";
    }

    public String mStringArrayVarargsOverloaded4(List... items) {
        return "mStringArrayVarargsOverloaded4(List[] " + Helpers.arrayToString(items) + ")";
    }
    
    public String mListOrString(List<String> items) {
        return "mListOrString(List " + Helpers.listToString(items) + ")";
    }

    public String mListOrString(String item) {
        return "mListOrString(String " + item + ")";
    }

    public String mListListOrString(List<List<Object>> items) {
        return "mListListOrString(List " + Helpers.listToString(items) + ")";
    }

    public String mListListOrString(String item) {
        return "mListListOrString(String " + item + ")";
    }
    
    public String mMapOrBoolean(Map v) {
        return "mMapOrBoolean(Map " + v + ")";
    }

    public String mMapOrBoolean(boolean v) {
        return "mMapOrBoolean(boolean " + v + ")";
    }

    public String mMapOrBooleanVarargs(Map... v) {
        return "mMapOrBooleanVarargs(Map... " + Helpers.arrayToString(v) + ")";
    }

    public String mMapOrBooleanVarargs(boolean... v) {
        return "mMapOrBooleanVarargs(boolean... " + Helpers.arrayToString(v) + ")";
    }

    public String mMapOrBooleanFixedAndVarargs(Map v) {
        return "mMapOrBooleanFixedAndVarargs(Map " + v + ")";
    }

    public String mMapOrBooleanFixedAndVarargs(boolean v) {
        return "mMapOrBooleanFixedAndVarargs(boolean " + v + ")";
    }

    public String mMapOrBooleanFixedAndVarargs(Map... v) {
        return "mMapOrBooleanFixedAndVarargs(Map... " + Helpers.arrayToString(v) + ")";
    }

    public String mMapOrBooleanFixedAndVarargs(boolean... v) {
        return "mMapOrBooleanFixedAndVarargs(boolean... " + Helpers.arrayToString(v) + ")";
    }
    
    public String mNumberOrArray(Number v) {
        return "mNumberOrArray(Number " + v + ")";
    }

    public String mNumberOrArray(Object[] v) {
        return "mNumberOrArray(Object[] " + Helpers.arrayToString(v) + ")";
    }
    
    public String mIntOrArray(int v) {
        return "mIntOrArray(int " + v + ")";
    }

    public String mIntOrArray(Object[] v) {
        return "mIntOrArray(Object[] " + Helpers.arrayToString(v) + ")";
    }

    public String mDateOrArray(Date v) {
        return "mDateOrArray(Date " + v.getTime() + ")";
    }

    public String mDateOrArray(Object[] v) {
        return "mDateOrArray(Object[] " + Helpers.arrayToString(v) + ")";
    }
    
    public String mStringOrArray(String v) {
        return "mStringOrArray(String " + v + ")";
    }

    public String mStringOrArray(Object[] v) {
        return "mStringOrArray(Object[] " + Helpers.arrayToString(v) + ")";
    }
    
    public String mBooleanOrArray(boolean v) {
        return "mBooleanOrArray(boolean " + v + ")";
    }

    public String mBooleanOrArray(Object[] v) {
        return "mBooleanOrArray(Object[] " + Helpers.arrayToString(v) + ")";
    }
    
    public String mMapOrArray(Map v) {
        return "mMapOrArray(Map " + v + ")";
    }

    public String mMapOrArray(Object[] v) {
        return "mMapOrArray(Object[] " + Helpers.arrayToString(v) + ")";
    }
    
    public String mListOrArray(List v) {
        return "mListOrArray(List " + v + ")";
    }

    public String mListOrArray(Object[] v) {
        return "mListOrArray(Object[] " + Helpers.arrayToString(v) + ")";
    }
    
    public String mSetOrArray(Set v) {
        return "mSetOrArray(Set " + v + ")";
    }

    public String mSetOrArray(Object[] v) {
        return "mSetOrArray(Object[] " + Helpers.arrayToString(v) + ")";
    }
    
    public String mCharNonOverloaded(char c) {
        return "mCharNonOverloaded(char " + c + ")";
    }

    public String mCharacterNonOverloaded(Character c) {
        return "mCharacterNonOverloaded(Character " + c + ")";
    }
    
    public String mCharOrCharacterOverloaded(char c) {
        return "mCharOrCharacterOverloaded(char " + c + ")";
    }

    public String mCharOrCharacterOverloaded(Character c) {
        return "mCharOrCharacterOverloaded(Character " + c + ")";
    }

    public String mCharOrBooleanOverloaded(char c) {
        return "mCharOrBooleanOverloaded(char " + c + ")";
    }

    public String mCharOrBooleanOverloaded(boolean b) {
        return "mCharOrBooleanOverloaded(boolean " + b + ")";
    }

    public String mCharOrStringOverloaded(char c, boolean b) {
        return "mCharOrStringOverloaded(char " + c + ", boolean " + b + ")";
    }

    public String mCharOrStringOverloaded(String s, int i) {
        return "mCharOrStringOverloaded(String " + s + ", int " + i + ")";
    }

    public String mCharacterOrStringOverloaded(Character c, boolean b) {
        return "mCharacterOrStringOverloaded(Character " + c + ", boolean " + b + ")";
    }

    public String mCharacterOrStringOverloaded(String s, int i) {
        return "mCharacterOrStringOverloaded(String " + s + ", int " + i + ")";
    }
    
    public String mCharOrStringOverloaded2(String s) {
        return "mCharOrStringOverloaded2(String " + s + ")";
    }

    public String mCharOrStringOverloaded2(char c) {
        return "mCharOrStringOverloaded2(char " + c + ")";
    }
    
    public String mCharacterOrStringOverloaded2(String s) {
        return "mCharacterOrStringOverloaded2(String " + s + ")";
    }

    public String mCharacterOrStringOverloaded2(Character c) {
        return "mCharacterOrStringOverloaded2(Character " + c + ")";
    }
    

    public String getJavaString() {
        return "s";
    }
    
    public List getJavaStringList() {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        return list;
    }

    public List getJavaString2List() {
        List list = new ArrayList();
        list.add("aa");
        list.add("bb");
        return list;
    }

    public List getJavaStringListList() {
        List listList = new ArrayList();
        {
            List list = new ArrayList();
            list.add("a");
            list.add("b");
            
            listList.add(list);
        }
        {
            List list = new ArrayList();
            list.add("c");
            
            listList.add(list);
        }
        return listList;
    }

    public List getJavaStringSequenceList() throws TemplateModelException {
        ObjectWrapper ow = Environment.getCurrentEnvironment().getObjectWrapper();
        
        List listList = new ArrayList();
        {
            List list = new ArrayList();
            list.add("a");
            list.add("b");
            
            listList.add(ow.wrap(list));
        }
        {
            List list = new ArrayList();
            list.add("c");
            
            listList.add(ow.wrap(list));
        }
        return listList;
    }
    
    public List<int[]> getJavaListOfIntArrays() {
        List list = new ArrayList();
        list.add(new int[] {1, 2, 3});
        list.add(new int[] {});
        list.add(new int[] {4});
        return list;
    }
    
    @SuppressWarnings("boxing")
    public List getJavaIntegerListList() {
        List listList = new ArrayList();
        {
            List list = new ArrayList();
            list.add(1);
            list.add(2);
            
            listList.add(list);
        }
        {
            List list = new ArrayList();
            list.add(3);
            
            listList.add(list);
        }
        return listList;
    }
    
    @SuppressWarnings("boxing")
    public List<Integer> getJavaIntegerList() {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        return list;
    }

    @SuppressWarnings("boxing")
    public List<Byte> getJavaByteList() {
        List<Byte> list = new ArrayList<Byte>();
        list.add((byte) 1);
        list.add((byte) 2);
        return list;
    }

    @SuppressWarnings("boxing")
    public List<Character> getJavaCharacterList() {
        List<Character> list = new ArrayList<Character>();
        list.add('c');
        list.add('C');
        return list;
    }
    
    public String[] getJavaStringArray() {
        return new String[] { "a", "b" };
    }

    public int[] getJavaIntArray() {
        return new int[] { 11, 22 };
    }

    public Integer[] getJavaIntegerArray() {
        return new Integer[] { Integer.valueOf(11), Integer.valueOf(22) };
    }
    
    public String[] getJavaEmptyStringArray() {
        return new String[] { };
    }
    
    public String[][] getJavaStringArrayArray() {
        return new String[][] { new String[] { "a", "b" }, new String[] { }, new String[] { "c" } };
    }
    
    public Object[] getJavaObjectArray() {
        return new Object[] { "a", "b" };
    }
    
    public TemplateModel getHashAndScalarModel() {
        return HashAndScalarModel.INSTANCE;
    }

    public TemplateModel getBooleanAndScalarModel() {
        return BooleanAndScalarModel.INSTANCE;
    }
    
    public TemplateModel getAllModels() {
        return AllTemplateModels.INSTANCE;
    }

    public TemplateNumberModel getAdaptedNumber() {
        return new MyAdapterNumberModel();
    }

    public TemplateNumberModel getWrapperNumber() {
        return new MyWrapperNumberModel();
    }

    public TemplateBooleanModel getStringAdaptedToBoolean() {
        return new MyStringAdaptedToBooleanModel();
    }
    
    public TemplateBooleanModel getStringAdaptedToBoolean2() {
        return new MyStringAdaptedToBooleanModel2();
    }
    
    public TemplateBooleanModel getStringWrappedAsBoolean() {
        return new MyStringWrapperAsBooleanModel();
    }
    
    public TemplateBooleanModel getBooleanWrappedAsAnotherBoolean() {
        return new MyBooleanWrapperAsAnotherBooleanModel(); 
    }
    
    public String bugReport363(Map<String, ? extends Object> fields, List<?> listField) {
        return "Executed: testMethod(Map fields, List listField) on input: fields=" + fields
                + " and listField=" + listField;
    }

    public String bugReport363(Object... fields) {
        return "Executed: testMethod(Object... fields) on input: fields=" + Helpers.arrayToString(fields);
    }
    
    private static class MyAdapterNumberModel implements TemplateNumberModel, AdapterTemplateModel {

        public Object getAdaptedObject(Class hint) {
            if (hint == double.class) {
                return Double.valueOf(123.0001);
            } else if (hint == Double.class) {
                return Double.valueOf(123.0002);
            } else {
                return Long.valueOf(124L);
            }
        }

        public Number getAsNumber() throws TemplateModelException {
            return Integer.valueOf(122);
        }
        
    }
    
    private static class MyWrapperNumberModel implements TemplateNumberModel, WrapperTemplateModel {

        public Number getAsNumber() throws TemplateModelException {
            return Integer.valueOf(122);
        }

        public Object getWrappedObject() {
            return Double.valueOf(123.0001);
        }
        
    }
    
    private static class MyStringWrapperAsBooleanModel implements TemplateBooleanModel, WrapperTemplateModel {

        public Object getWrappedObject() {
            return "yes";
        }

        public boolean getAsBoolean() throws TemplateModelException {
            return true;
        }
        
    }

    private static class MyBooleanWrapperAsAnotherBooleanModel implements TemplateBooleanModel, WrapperTemplateModel {

        public Object getWrappedObject() {
            return Boolean.TRUE;
        }

        public boolean getAsBoolean() throws TemplateModelException {
            return false;
        }
        
    }
    
    private static class MyStringAdaptedToBooleanModel implements TemplateBooleanModel, AdapterTemplateModel {

        public Object getAdaptedObject(Class hint) {
            if (hint != Boolean.class && hint != boolean.class) {
                return "yes";
            } else {
                return Boolean.TRUE;
            }
        }

        public boolean getAsBoolean() throws TemplateModelException {
            return false;
        }
        
    }

    private static class MyStringAdaptedToBooleanModel2 implements TemplateBooleanModel, AdapterTemplateModel {

        public Object getAdaptedObject(Class hint) {
            return "yes";
        }

        public boolean getAsBoolean() throws TemplateModelException {
            return true;
        }
        
    }
    
}
