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    }