001    package railo.runtime.util;
002    
003    import railo.runtime.PageContext;
004    import railo.runtime.exp.DeprecatedException;
005    import railo.runtime.exp.PageRuntimeException;
006    import railo.runtime.op.Duplicator;
007    import railo.runtime.type.Collection.Key;
008    import railo.runtime.type.KeyImpl;
009    import railo.runtime.type.Null;
010    import railo.runtime.type.Objects;
011    import railo.runtime.type.Query;
012    import railo.runtime.type.QueryColumn;
013    
014    /**
015     * Stack for Query Objects
016     */
017    public final class QueryStackImpl implements QueryStack {
018            Query[] queries=new Query[20];
019            int start=queries.length;
020            
021            @Override
022            public QueryStack duplicate(boolean deepCopy){
023                    QueryStackImpl qs=new QueryStackImpl();
024                    if(deepCopy) {
025                            qs.queries=new Query[queries.length];
026                            for(int i=0;i<queries.length;i++) {
027                                    qs.queries[i]=(Query)Duplicator.duplicate(queries[i],deepCopy);
028                            }
029                    }
030                    else qs.queries=queries;
031                    
032                    qs.start=start;
033                    return qs;
034            }
035    
036            @Override
037            public void addQuery(Query query) {
038                    if(start<1)grow();
039            queries[--start]= query;
040            }
041    
042            @Override
043            public void removeQuery() {
044            //print.ln("queries["+start+"]=null;");
045            queries[start++]=null;
046            }
047            
048            @Override
049            public boolean isEmpty() {
050                    return start==queries.length;
051            }
052    
053            @Override
054            public Object getDataFromACollection(String key) {
055                    throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)"));
056            }
057            
058            @Override
059            public Object getDataFromACollection(PageContext pc,String key) {
060                    throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)"));
061            }
062    
063            @Override
064            public Object getDataFromACollection(Key key) {
065                    throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)"));
066            }
067            
068            @Override
069            public Object getDataFromACollection(PageContext pc,Key key) {
070                    throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)"));
071            }
072            
073            // FUTURE add to interface and set above to deprecated
074            public Object getDataFromACollection(PageContext pc,Key key, Object defaultValue) {
075                    Object rtn;
076                    
077                    // get data from queries
078                    for(int i=start;i<queries.length;i++) {
079                            rtn=((Objects)queries[i]).get(pc,key,Null.NULL);
080                            if(rtn!=Null.NULL) return rtn;
081                    }
082                    return defaultValue;
083            }
084    
085            @Override
086            public QueryColumn getColumnFromACollection(String key) {
087                    return getColumnFromACollection(KeyImpl.init(key));
088            }
089    
090            @Override
091            public QueryColumn getColumnFromACollection(Key key) {
092                    QueryColumn rtn=null;
093                    
094                    // get data from queries
095                    for(int i=start;i<queries.length;i++) {
096                            rtn=queries[i].getColumn(key,null);
097                            if(rtn!=null) {
098                                    return rtn;
099                            }
100                    }
101                    return null;
102            }
103            
104            @Override
105            public void clear() {
106                    for(int i=start;i<queries.length;i++) {
107                            queries[i]=null;
108                    }
109                    start=queries.length;
110            }
111        
112        private void grow() {
113            Query[] tmp=new Query[queries.length+20];
114            for(int i=0;i<queries.length;i++) {
115                tmp[i+20]=queries[i];
116            }
117            queries=tmp;
118            start+=20;
119        }
120        
121        @Override
122            public Query[] getQueries() {
123                    Query[] tmp=new Query[queries.length-start];
124                    int count=0;
125                    for(int i=start;i<queries.length;i++) {
126                            tmp[count++]=queries[i];
127                    }
128                    return tmp;
129            }
130    }