001    package railo.runtime.util;
002    
003    import railo.runtime.PageContext;
004    import railo.runtime.engine.ThreadLocalPageContext;
005    import railo.runtime.type.Collection.Key;
006    import railo.runtime.type.Objects;
007    import railo.runtime.type.Query;
008    import railo.runtime.type.QueryColumn;
009    
010    /**
011     * Stack for Query Objects
012     */
013    public final class QueryStackImpl implements QueryStack {
014            Query[] queries=new Query[20];
015            int start=queries.length;
016            
017            // FUTURE add to interface
018            public QueryStack duplicate(boolean deepCopy){
019                    QueryStackImpl qs=new QueryStackImpl();
020                    if(deepCopy) {
021                            qs.queries=new Query[queries.length];
022                            for(int i=0;i<queries.length;i++) {
023                                    qs.queries[i]=(Query)queries[i].duplicate(deepCopy);
024                            }
025                    }
026                    else qs.queries=queries;
027                    
028                    qs.start=start;
029                    return qs;
030            }
031            
032            
033            /**
034         * @see railo.runtime.util.QueryStack#addQuery(railo.runtime.type.Query)
035         */
036            public void addQuery(Query query) {
037                    if(start<1)grow();
038            queries[--start]= query;
039            }
040            /*public void addQueryImpl(QueryImpl query) {
041            if(start<1)grow();
042            queries[--start]=query;
043            }*/
044    
045        /**
046         * @see railo.runtime.util.QueryStack#removeQuery()
047         */
048            public void removeQuery() {
049            //print.ln("queries["+start+"]=null;");
050            queries[start++]=null;
051            }
052            
053            /**
054         * @see railo.runtime.util.QueryStack#isEmpty()
055         */
056            public boolean isEmpty() {
057                    return start==queries.length;
058            }
059    
060            /**
061         * @see railo.runtime.util.QueryStack#getDataFromACollection(java.lang.String)
062         */
063            public Object getDataFromACollection(String key) {
064                    return getDataFromACollection(ThreadLocalPageContext.get(),key);
065            }
066            
067            /**
068             * @see railo.runtime.util.QueryStack#getDataFromACollection(railo.runtime.PageContext, java.lang.String)
069             */
070            public Object getDataFromACollection(PageContext pc,String key) {
071                    Object rtn=null;
072                    
073                    // get data from queries
074                    for(int i=start;i<queries.length;i++) {
075                            rtn=((Objects)queries[i]).get(pc,key,"");
076                            if(rtn!=null) {
077                                    return rtn;
078                            }
079                    }
080                    return null;
081            }
082    
083            /**
084             * @see railo.runtime.util.QueryStack#getDataFromACollection(railo.runtime.type.Collection.Key)
085             */
086            public Object getDataFromACollection(Key key) {
087                    return getDataFromACollection(ThreadLocalPageContext.get(),key); 
088            }
089            
090            /**
091             * @see railo.runtime.util.QueryStack#getDataFromACollection(railo.runtime.PageContext, railo.runtime.type.Collection.Key)
092             */
093            public Object getDataFromACollection(PageContext pc,Key key) {
094                    Object rtn=null;
095                    
096                    // get data from queries
097                    for(int i=start;i<queries.length;i++) {
098                            
099                            rtn=((Objects)queries[i]).get(pc,key,"");
100                            if(rtn!=null) {
101                                    return rtn;
102                            }
103                    }
104                    return null;
105            }
106            
107            /**
108         * @see railo.runtime.util.QueryStack#getColumnFromACollection(java.lang.String)
109         */
110            public QueryColumn getColumnFromACollection(String key) {
111                    QueryColumn rtn=null;
112                    
113                    // get data from queries
114                    for(int i=start;i<queries.length;i++) {
115                            rtn=queries[i].getColumn(key,null);
116                            if(rtn!=null) {
117                                    return rtn;
118                            }
119                    }
120                    return null;
121            }
122    
123            /**
124             *
125             * @see railo.runtime.util.QueryStack#getColumnFromACollection(railo.runtime.type.Collection.Key)
126             */
127            public QueryColumn getColumnFromACollection(Key key) {
128                    QueryColumn rtn=null;
129                    
130                    // get data from queries
131                    for(int i=start;i<queries.length;i++) {
132                            rtn=queries[i].getColumn(key,null);
133                            if(rtn!=null) {
134                                    return rtn;
135                            }
136                    }
137                    return null;
138            }
139            
140            /**
141         * @see railo.runtime.util.QueryStack#clear()
142         */
143            public void clear() {
144                    for(int i=start;i<queries.length;i++) {
145                            queries[i]=null;
146                    }
147                    start=queries.length;
148            }
149        
150        private void grow() {
151            Query[] tmp=new Query[queries.length+20];
152            for(int i=0;i<queries.length;i++) {
153                tmp[i+20]=queries[i];
154            }
155            queries=tmp;
156            start+=20;
157        }
158        
159            /**
160             * @see railo.runtime.util.QueryStack#getQueries()
161             */
162            public Query[] getQueries() {
163                    Query[] tmp=new Query[queries.length-start];
164                    int count=0;
165                    for(int i=start;i<queries.length;i++) {
166                            tmp[count++]=queries[i];
167                    }
168                    return tmp;
169            }
170    }