001 package railo.runtime.interpreter.ref.literal; 002 003 import java.util.ArrayList; 004 import java.util.List; 005 006 import railo.runtime.exp.ExpressionException; 007 import railo.runtime.exp.PageException; 008 import railo.runtime.interpreter.ref.Ref; 009 import railo.runtime.interpreter.ref.RefSupport; 010 import railo.runtime.interpreter.ref.Set; 011 import railo.runtime.interpreter.ref.var.Variable; 012 import railo.runtime.type.FunctionValueImpl; 013 014 /** 015 * ref for a functionValue 016 */ 017 public final class LFunctionValue extends RefSupport implements Ref { 018 019 020 private Ref name; 021 private Ref value; 022 023 /** 024 * constructor of the class 025 * @param name 026 * @param value 027 */ 028 public LFunctionValue(Ref name, Ref value) { 029 this.name=name; 030 this.value=value; 031 } 032 033 034 /*public String getName(){ 035 if(name instanceof Variable){ 036 return new FunctionValueImpl(toStringArray((Set)name),value.getValue()); 037 } 038 if(name instanceof Literal) { 039 return ((Literal)name).getString(); 040 } 041 042 // TODO no idea if this is ever used 043 if(name instanceof Set){ 044 return new FunctionValueImpl(railo.runtime.type.List.arrayToList(toStringArray((Set)name),"."),value.getValue()); 045 } 046 throw new ExpressionException("invalid syntax in named argument"); 047 048 049 050 }*/ 051 052 public Object getValue() throws PageException { 053 054 if(name instanceof Variable){ 055 return new FunctionValueImpl(toStringArray((Set)name),value.getValue()); 056 } 057 if(name instanceof Literal) { 058 return new FunctionValueImpl(((Literal)name).getString(),value.getValue()); 059 } 060 061 // TODO no idea if this is ever used 062 if(name instanceof Set){ 063 return new FunctionValueImpl(railo.runtime.type.List.arrayToList(toStringArray((Set)name),"."),value.getValue()); 064 } 065 throw new ExpressionException("invalid syntax in named argument"); 066 //return new FunctionValueImpl(key,value.getValue()); 067 } 068 069 private String[] toStringArray(Set set) throws PageException { 070 Ref ref=set; 071 String str; 072 List<String> arr=new ArrayList<String>(); 073 do { 074 set=(Set) ref; 075 str=set.getKeyAsString(); 076 if(str!=null)arr.add(0, str); 077 else break; 078 ref=set.getParent(); 079 }while(ref instanceof Set); 080 return arr.toArray(new String[arr.size()]); 081 } 082 083 /** 084 * @see railo.runtime.interpreter.ref.Ref#getTypeName() 085 */ 086 public String getTypeName() { 087 return "function value"; 088 } 089 090 }