package railo.runtime.interpreter.ref.var;
import railo.runtime.PageContext;
import railo.runtime.exp.PageException;
import railo.runtime.interpreter.ref.Ref;
import railo.runtime.interpreter.ref.RefSupport;
import railo.runtime.interpreter.ref.Set;
import railo.runtime.interpreter.ref.literal.LString;
import railo.runtime.op.Caster;
import railo.runtime.type.Query;
import railo.runtime.type.StructImpl;
/**
*
*/
public final class Variable extends RefSupport implements Set {
private String key;
private Ref parent;
private Ref refKey;
/**
* @param pc
* @param parent
* @param key
*/
public Variable( Ref parent,String key) {
this.parent=parent;
this.key=key;
}
/**
* @param pc
* @param parent
* @param refKey
*/
public Variable(Ref parent,Ref refKey) {
this.parent=parent;
this.refKey=refKey;
}
@Override
public Object getValue(PageContext pc) throws PageException {
return pc.get(parent.getCollection(pc),getKeyAsString(pc));
}
@Override
public Object touchValue(PageContext pc) throws PageException {
Object p = parent.touchValue(pc);
if(p instanceof Query) {
Object o= ((Query)p).getColumn(getKeyAsString(pc),null);
if(o!=null) return o;
return setValue(pc,new StructImpl());
}
return pc.touch(p,getKeyAsString(pc));
}
@Override
public Object getCollection(PageContext pc) throws PageException {
Object p = parent.getValue(pc);
if(p instanceof Query) {
return ((Query)p).getColumn(getKeyAsString(pc));
}
return pc.get(p,getKeyAsString(pc));
}
@Override
public Object setValue(PageContext pc,Object obj) throws PageException {
return pc.set(parent.touchValue(pc),getKeyAsString(pc),obj);
}
@Override
public String getTypeName() {
return "variable";
}
@Override
public Ref getKey(PageContext pc) throws PageException {
if(key==null)return refKey;
return new LString(key);
}
@Override
public String getKeyAsString(PageContext pc) throws PageException {
if(key==null)key=Caster.toString(refKey.getValue(pc));
return key;
}
@Override
public Ref getParent(PageContext pc) throws PageException {
return parent;
}
}