001 package railo.runtime.type.ref; 002 003 import railo.runtime.PageContext; 004 import railo.runtime.exp.PageException; 005 import railo.runtime.type.Collection; 006 import railo.runtime.type.KeyImpl; 007 import railo.runtime.type.StructImpl; 008 009 /** 010 * Handle a Reference 011 */ 012 public final class ReferenceReference implements Reference { 013 014 private Reference reference; 015 private String key; 016 017 /** 018 * @param reference 019 * @param key 020 */ 021 public ReferenceReference(Reference reference, String key) { 022 this.reference=reference; 023 this.key=key; 024 } 025 026 @Override 027 public Collection.Key getKey() { 028 return KeyImpl.init(key); 029 } 030 031 @Override 032 public String getKeyAsString() { 033 return key; 034 } 035 036 @Override 037 public Object get(PageContext pc) throws PageException { 038 return pc.getCollection(reference.get(pc),key); 039 } 040 041 @Override 042 public Object get(PageContext pc, Object defaultValue) { 043 return pc.getCollection(reference.get(pc,null),key,defaultValue); 044 } 045 046 @Override 047 public Object set(PageContext pc, Object value) throws PageException { 048 return pc.set(reference.touch(pc),key,value); 049 } 050 051 @Override 052 public Object setEL(PageContext pc, Object value) { 053 try { 054 return set(pc,value); 055 } catch (PageException e) { 056 return null; 057 } 058 } 059 060 @Override 061 public Object touch(PageContext pc) throws PageException { 062 Object parent=reference.touch(pc); 063 Object o= pc.getCollection(parent,key,null); 064 if(o!=null) return o; 065 return pc.set(parent,key,new StructImpl()); 066 } 067 068 public Object touchEL(PageContext pc) { 069 Object parent=reference.touchEL(pc); 070 Object o= pc.getCollection(parent,key,null); 071 if(o!=null) return o; 072 try { 073 return pc.set(parent,key,new StructImpl()); 074 } catch (PageException e) { 075 return null; 076 } 077 } 078 079 @Override 080 public Object remove(PageContext pc) throws PageException { 081 return pc.getVariableUtil().remove(reference.get(pc),key); 082 } 083 084 @Override 085 public Object removeEL(PageContext pc) { 086 return pc.getVariableUtil().removeEL(reference.get(pc,null),key); 087 } 088 089 @Override 090 public Object getParent() { 091 return reference; 092 } 093 @Override 094 public String toString() { 095 return "java.util.ReferenceReference(reference:"+reference+";key:"+key+")"; 096 } 097 }