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 }