001    package railo.runtime.exp;
002    
003    import java.util.ArrayList;
004    
005    import railo.runtime.PageContext;
006    import railo.runtime.config.ConfigImpl;
007    import railo.runtime.type.util.KeyConstants;
008    import railo.transformer.library.function.FunctionLib;
009    import railo.transformer.library.function.FunctionLibFunction;
010    import railo.transformer.library.function.FunctionLibFunctionArg;
011    
012    /**
013     * specified exception for Built-In Function
014     */
015    public final class FunctionException extends ExpressionException {
016    
017            /* *
018             * constructor of the class
019             * @param pc current Page Context
020             * @param functionName Name of the function that thorw the Exception
021             * @param badArgumentPosition Position of the bad argument in the Argument List of the function
022             * @param badArgumentName Name of the bad Argument
023             * @param message additional Exception message
024             * /
025        public FunctionException(PageContext pc,String functionName, String badArgumentPosition, String badArgumentName, String message) {
026            this((PageContext)pc,functionName,badArgumentPosition,badArgumentName,message);
027        }*/
028        
029        /**
030         * constructor of the class
031         * @param pc current Page Context
032         * @param functionName Name of the function that thorw the Exception
033         * @param badArgumentPosition Position of the bad argument in the Argument List of the function
034         * @param badArgumentName Name of the bad Argument
035         * @param message additional Exception message
036         */
037            public FunctionException(PageContext pc,String functionName, int badArgumentPosition, String badArgumentName, String message) {
038            this(pc,functionName,toStringBadArgumentPosition(badArgumentPosition),badArgumentName,message,null);
039        }
040            
041            public FunctionException(PageContext pc,String functionName, int badArgumentPosition, String badArgumentName, String message, String detail) {
042            this(pc,functionName,toStringBadArgumentPosition(badArgumentPosition),badArgumentName,message,detail);
043        }
044            
045            private static String toStringBadArgumentPosition(int pos) {
046                    switch(pos) {
047                    case 1:return "first";
048                    case 2:return "second";
049                    case 3:return "third";
050                    case 4:return "forth";
051                    case 5:return "fifth";
052                    case 6:return "sixth";
053                    case 7:return "seventh";
054                    case 8:return "eighth";
055                    case 9:return "ninth";
056                    case 10:return "tenth";
057                    case 11:return "eleventh";
058                    case 12:return "twelfth";
059                    }
060                    // TODO Auto-generated method stub
061                    return pos+"th";
062            }
063    
064            public FunctionException(PageContext pc,String functionName, String badArgumentPosition, String badArgumentName, String message, String detail) {
065            super("invalid call of the function "+functionName+", "+(badArgumentPosition)+" Argument ("+badArgumentName+") is invalid, "+message,detail);
066            setAdditional(KeyConstants._pattern,getFunctionInfo(pc,functionName));
067        }
068        
069            private static String getFunctionInfo(PageContext pc,String functionName) {
070                    FunctionLib[] flds;
071                    flds = ((ConfigImpl)pc.getConfig()).getFLDs();
072                                    
073                    FunctionLibFunction function=null;
074                    for(int i=0;i<flds.length;i++) {
075                            function = flds[i].getFunction(functionName.toLowerCase());
076                            if(function!=null)break;
077                    }
078                    if(function == null) return "";
079                    
080                    StringBuffer rtn=new StringBuffer();
081                    rtn.append(function.getName()+"(");
082                    
083                    
084                    int optionals=0;
085                    ArrayList args = function.getArg();
086                    for(int i=0;i<args.size();i++) {
087                            FunctionLibFunctionArg arg=(FunctionLibFunctionArg) args.get(i);
088                            if(i!=0)rtn.append(", ");
089                            if(!arg.getRequired()) {
090                                    rtn.append("[");
091                                    optionals++;
092                            }
093                            rtn.append(arg.getName());
094                            rtn.append(":");
095                            rtn.append(arg.getTypeAsString());
096                    }
097                    for(int i=0;i<optionals;i++)
098                            rtn.append("]");
099                    rtn.append("):"+function.getReturnTypeAsString());
100                    
101                    return rtn.toString();
102            }
103            
104    
105    
106    }