/** * Implements the CFML Function javacast */ package railo.runtime.functions.string; import java.math.BigDecimal; import java.math.BigInteger; import railo.commons.lang.ClassException; import railo.commons.lang.ClassUtil; import railo.commons.lang.StringUtil; import railo.runtime.PageContext; import railo.runtime.exp.ExpressionException; import railo.runtime.exp.PageException; import railo.runtime.ext.function.Function; import railo.runtime.op.Caster; import railo.runtime.type.Array; public final class JavaCast implements Function { public static Object calls(PageContext pc , String string, Object object) throws PageException { throw new ExpressionException("method javacast not implemented yet"); // MUST ???? } public static Object call(PageContext pc , String type, Object obj) throws PageException { type=type.trim(); String lcType=StringUtil.toLowerCase(type); if(type.endsWith("[]")){ return toArray(pc,type, lcType, obj); } Class clazz = toClass(pc, lcType, type); return to(pc,obj,clazz); } public static Object toArray(PageContext pc,String type,String lcType, Object obj) throws PageException { lcType=lcType.substring(0,lcType.length()-2); type=type.substring(0,type.length()-2); Array arr = Caster.toArray(obj); Class clazz = toClass(pc, lcType, type); Object trg= java.lang.reflect.Array.newInstance(clazz, arr.size()); for(int i=arr.size()-1;i>=0;i--) { java.lang.reflect.Array.set(trg, i,to(pc,arr.getE(i+1),clazz)); } return trg; } private static Object to(PageContext pc, Object obj,Class trgClass) throws PageException { if(trgClass==null)return Caster.toNull(obj); else if(trgClass==BigDecimal.class)return new BigDecimal(Caster.toString(obj)); else if(trgClass==BigInteger.class)return new BigInteger(Caster.toString(obj)); return Caster.castTo(pc, trgClass, obj); //throw new ExpressionException("can't cast only to the following data types (bigdecimal,int, long, float ,double ,boolean ,string,null ), "+lcType+" is invalid"); } private static Class toClass(PageContext pc,String lcType, String type) throws PageException { if(lcType.equals("null")){ return null; } if(lcType.equals("biginteger")){ return BigInteger.class; } if(lcType.equals("bigdecimal")){ return BigDecimal.class; } try { return ClassUtil.toClass(type); } catch (ClassException e) { throw Caster.toPageException(e); } } }