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    }