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