001    package railo.runtime.type;
002    
003    import java.util.Date;
004    import java.util.Iterator;
005    import java.util.Map.Entry;
006    
007    import railo.runtime.PageContext;
008    import railo.runtime.config.NullSupportHelper;
009    import railo.runtime.dump.DumpData;
010    import railo.runtime.dump.DumpProperties;
011    import railo.runtime.dump.DumpUtil;
012    import railo.runtime.engine.ThreadLocalPageContext;
013    import railo.runtime.exp.DatabaseException;
014    import railo.runtime.exp.PageException;
015    import railo.runtime.op.Caster;
016    import railo.runtime.op.Operator;
017    import railo.runtime.op.date.DateCaster;
018    import railo.runtime.type.dt.DateTime;
019    import railo.runtime.type.it.EntryIterator;
020    import railo.runtime.type.it.KeyIterator;
021    import railo.runtime.type.it.StringIterator;
022    import railo.runtime.type.util.CollectionUtil;
023    import railo.runtime.type.util.QueryUtil;
024    
025    /**
026     * Recordcount Query Column
027     */
028    public final class QueryColumnRef implements QueryColumn,Sizeable {
029        
030        private Query query;
031        private Collection.Key columnName;
032        private int type;
033    
034        /**
035         * Constructor of the class
036         * @param query
037         * @param columnName 
038         * @param type 
039         */
040        public QueryColumnRef(Query query, Collection.Key columnName, int type) {
041            this.query=query;
042            this.columnName=columnName;
043            this.type=type;
044        }
045    
046        @Override
047        public Object remove(int row) throws DatabaseException {
048            throw new DatabaseException("can't remove "+columnName+" at row "+row+" value from Query",null,null,null);
049        }
050    
051        @Override
052        public Object removeEL(int row) {
053            return query.getAt(columnName,row,null);
054        }
055    
056        @Override
057        public Object get(int row) throws PageException {
058            return query.getAt(columnName,row);
059        }
060        
061        /**
062         * touch a value, means if key dosent exist, it will created
063         * @param row
064         * @return matching value or created value
065         * @throws PageException
066         */
067        public Object touch(int row) throws PageException {
068            Object o= query.getAt(columnName,row,NullSupportHelper.NULL());
069            if(o!=NullSupportHelper.NULL()) return o;
070            return query.setAt(columnName,row,new StructImpl());
071        }
072        
073        public Object touchEL(int row) {
074            Object o= query.getAt(columnName,row,NullSupportHelper.NULL());
075            if(o!=NullSupportHelper.NULL()) return o;
076            return query.setAtEL(columnName,row,new StructImpl());
077        }
078    
079        @Override
080        public Object get(int row, Object defaultValue) {
081            return query.getAt(columnName,row,defaultValue);
082        }
083    
084        @Override
085        public Object set(int row, Object value) throws DatabaseException {
086            throw new DatabaseException("can't change "+columnName+" value from Query",null,null,null);
087        }
088    
089        @Override
090        public Object setEL(int row, Object value) {
091            return query.getAt(columnName,row,null);
092        }
093    
094        @Override
095        public void add(Object value) {}
096    
097        @Override
098        public void addRow(int count) {}
099    
100        @Override
101        public int getType() {
102            return type;
103        }
104    
105        @Override
106        public String getTypeAsString() {
107            return QueryImpl.getColumTypeName(getType());
108        }
109    
110        @Override
111        public void cutRowsTo(int maxrows) {}
112    
113    
114        @Override
115        public int size() {
116            return query.size();
117        }
118    
119        @Override
120        public Collection.Key[] keys() {
121            Collection.Key[] k=new Collection.Key[size()];
122            for(int i=1;i<=k.length;i++) {
123                k[i-1]=KeyImpl.init(Caster.toString(i));
124            }
125            return k;
126        }
127    
128            @Override
129            public Object remove(Collection.Key key) throws PageException {
130                    throw new DatabaseException("can't remove "+key+" from Query",null,null,null);
131            }
132    
133            @Override
134            public Object removeEL(Collection.Key key) {
135                    return get(key,null);
136            }
137    
138        @Override
139        public void clear() {}
140    
141        @Override
142        public Object get(String key) throws PageException {
143            return get(Caster.toIntValue(key));
144        }
145    
146            @Override
147            public Object get(Collection.Key key) throws PageException {
148                    return get(Caster.toIntValue(key.getString()));
149            }
150    
151        @Override
152        public Object get(String key, Object defaultValue) {
153            return get(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),defaultValue);
154        }
155    
156            @Override
157            public Object get(Collection.Key key, Object defaultValue) {
158                    return get(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),defaultValue);
159            }
160    
161        @Override
162        public Object set(String key, Object value) throws PageException {
163            return set(Caster.toIntValue(key),value);
164        }
165    
166            @Override
167            public Object set(Collection.Key key, Object value) throws PageException {
168                    return set(Caster.toIntValue(key),value);
169            }
170    
171        @Override
172        public Object setEL(String key, Object value) {
173            return setEL(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),value);
174        }
175    
176            @Override
177            public Object setEL(Collection.Key key, Object value) {
178                    return setEL(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),value);
179            }
180    
181            @Override
182            public Iterator<Collection.Key> keyIterator() {
183            return new KeyIterator(keys());
184        }
185        
186            @Override
187            public Iterator<String> keysAsStringIterator() {
188            return new StringIterator(keys());
189        }
190            
191            @Override
192            public Iterator<Entry<Key, Object>> entryIterator() {
193                    return new EntryIterator(this, keys());
194            }
195        
196            @Override
197            public Iterator<Object> valueIterator() {
198                    return query.getColumn(columnName,null).valueIterator();
199            }
200    
201        @Override
202        public boolean containsKey(String key) {
203            return get(key,NullSupportHelper.NULL())!=NullSupportHelper.NULL();
204        }
205    
206            @Override
207            public boolean containsKey(Collection.Key key) {
208                    return get(key,NullSupportHelper.NULL())!=NullSupportHelper.NULL();
209            }
210    
211        @Override
212            public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) {
213                return DumpUtil.toDumpData(get(query.getCurrentrow(pageContext.getId()),null), pageContext,maxlevel,dp);
214        }
215    
216        @Override
217        public String castToString() throws PageException {
218            return Caster.toString(get(query.getCurrentrow(ThreadLocalPageContext.get().getId())));
219        }
220    
221            @Override
222            public String castToString(String defaultValue) {
223                    Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL());
224                    if(value==NullSupportHelper.NULL())return defaultValue;
225                    return Caster.toString(value,defaultValue);
226            }
227    
228        @Override
229        public boolean castToBooleanValue() throws PageException {
230            return Caster.toBooleanValue(get(query.getCurrentrow(ThreadLocalPageContext.get().getId())));
231        }
232        
233        @Override
234        public Boolean castToBoolean(Boolean defaultValue) {
235            Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL());
236                    if(value==NullSupportHelper.NULL())return defaultValue;
237                    return Caster.toBoolean(value,defaultValue);
238        }
239    
240        @Override
241        public double castToDoubleValue() throws PageException {
242            return Caster.toDoubleValue(get(query.getCurrentrow(ThreadLocalPageContext.get().getId())));
243        }
244        
245        @Override
246        public double castToDoubleValue(double defaultValue) {
247            Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL());
248                    if(value==NullSupportHelper.NULL())return defaultValue;
249                    return Caster.toDoubleValue(value,defaultValue);
250        }
251    
252        @Override
253        public DateTime castToDateTime() throws PageException {
254            return Caster.toDate(get(query.getCurrentrow(ThreadLocalPageContext.get().getId())),null);
255        }
256        
257        @Override
258        public DateTime castToDateTime(DateTime defaultValue) {
259            Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL());
260                    if(value==NullSupportHelper.NULL())return defaultValue;
261                    return DateCaster.toDateAdvanced(value,true,null,defaultValue);
262        }
263    
264            @Override
265            public int compareTo(boolean b) throws PageException {
266                    return Operator.compare(castToBooleanValue(), b);
267            }
268    
269            @Override
270            public int compareTo(DateTime dt) throws PageException {
271                    return Operator.compare((Date)castToDateTime(), (Date)dt);
272            }
273    
274            @Override
275            public int compareTo(double d) throws PageException {
276                    return Operator.compare(castToDoubleValue(), d);
277            }
278    
279            @Override
280            public int compareTo(String str) throws PageException {
281                    return Operator.compare(castToString(), str);
282            }
283    
284        @Override
285        public String getKeyAsString() throws PageException {
286            return columnName.toString();
287        }
288    
289        @Override
290        public Collection.Key getKey() throws PageException {
291            return columnName;
292        }
293    
294        @Override
295        public Object get(PageContext pc) throws PageException {
296            return get(query.getCurrentrow(pc.getId()));
297        }
298        
299        @Override
300        public Object get(PageContext pc, Object defaultValue) {
301            return get(query.getCurrentrow(pc.getId()),defaultValue);
302        }
303    
304        @Override
305        public Object removeRow(int row) throws DatabaseException {
306            throw new DatabaseException("can't remove row from Query",null,null,null);
307        }
308    
309        @Override
310        public Object touch(PageContext pc) throws PageException {
311            return touch(query.getCurrentrow(pc.getId()));
312        }
313    
314        @Override
315        public Object touchEL(PageContext pc) {
316            return touchEL(query.getCurrentrow(pc.getId()));
317        }
318    
319        @Override
320        public Object set(PageContext pc, Object value) throws PageException {
321            return set(query.getCurrentrow(pc.getId()),value);
322        }
323        
324        @Override
325        public Object setEL(PageContext pc, Object value) {
326            return setEL(query.getCurrentrow(pc.getId()),value);
327        }
328    
329        @Override
330        public Object remove(PageContext pc) throws PageException {
331            return remove(query.getCurrentrow(pc.getId()));
332        }
333    
334        @Override
335        public Object removeEL(PageContext pc) {
336            return removeEL(query.getCurrentrow(pc.getId()));
337        }
338    
339        @Override
340        public Object getParent() {
341            return query;
342        }
343    
344        @Override
345        public Object clone() {
346            QueryColumn clone=new QueryColumnRef(query,columnName,type);
347            return clone;
348        }
349    
350        @Override
351        public Collection duplicate(boolean deepCopy) {
352    //               MUST muss deepCopy checken
353            QueryColumn clone=new QueryColumnRef(query,columnName,type);
354            return clone;
355        }
356            
357    
358            @Override
359            public long sizeOf() {
360                    return QueryUtil.sizeOf(this);
361            }
362            
363            @Override
364            public java.util.Iterator<String> getIterator() {
365            return keysAsStringIterator();
366        }
367            
368            @Override
369            public boolean equals(Object obj){
370                    if(!(obj instanceof Collection)) return false;
371                    return CollectionUtil.equals(this,(Collection)obj);
372            }
373            
374            @Override
375            public int hashCode() {
376                    return CollectionUtil.hashCode(this);
377            }
378    }