package railo.runtime.type; import java.util.Date; import java.util.Iterator; import java.util.Map.Entry; import railo.runtime.PageContext; import railo.runtime.config.NullSupportHelper; import railo.runtime.dump.DumpData; import railo.runtime.dump.DumpProperties; import railo.runtime.dump.DumpUtil; import railo.runtime.engine.ThreadLocalPageContext; import railo.runtime.exp.DatabaseException; import railo.runtime.exp.PageException; import railo.runtime.op.Caster; import railo.runtime.op.Operator; import railo.runtime.op.date.DateCaster; import railo.runtime.type.dt.DateTime; import railo.runtime.type.it.EntryIterator; import railo.runtime.type.it.KeyIterator; import railo.runtime.type.it.StringIterator; import railo.runtime.type.util.CollectionUtil; import railo.runtime.type.util.QueryUtil; /** * Recordcount Query Column */ public final class QueryColumnRef implements QueryColumn,Sizeable { private Query query; private Collection.Key columnName; private int type; /** * Constructor of the class * @param query * @param columnName * @param type */ public QueryColumnRef(Query query, Collection.Key columnName, int type) { this.query=query; this.columnName=columnName; this.type=type; } @Override public Object remove(int row) throws DatabaseException { throw new DatabaseException("can't remove "+columnName+" at row "+row+" value from Query",null,null,null); } @Override public Object removeEL(int row) { return query.getAt(columnName,row,null); } @Override public Object get(int row) throws PageException { return query.getAt(columnName,row); } /** * touch a value, means if key dosent exist, it will created * @param row * @return matching value or created value * @throws PageException */ public Object touch(int row) throws PageException { Object o= query.getAt(columnName,row,NullSupportHelper.NULL()); if(o!=NullSupportHelper.NULL()) return o; return query.setAt(columnName,row,new StructImpl()); } public Object touchEL(int row) { Object o= query.getAt(columnName,row,NullSupportHelper.NULL()); if(o!=NullSupportHelper.NULL()) return o; return query.setAtEL(columnName,row,new StructImpl()); } @Override public Object get(int row, Object defaultValue) { return query.getAt(columnName,row,defaultValue); } @Override public Object set(int row, Object value) throws DatabaseException { throw new DatabaseException("can't change "+columnName+" value from Query",null,null,null); } @Override public Object setEL(int row, Object value) { return query.getAt(columnName,row,null); } @Override public void add(Object value) {} @Override public void addRow(int count) {} @Override public int getType() { return type; } @Override public String getTypeAsString() { return QueryImpl.getColumTypeName(getType()); } @Override public void cutRowsTo(int maxrows) {} @Override public int size() { return query.size(); } @Override public Collection.Key[] keys() { Collection.Key[] k=new Collection.Key[size()]; for(int i=1;i<=k.length;i++) { k[i-1]=KeyImpl.init(Caster.toString(i)); } return k; } @Override public Object remove(Collection.Key key) throws PageException { throw new DatabaseException("can't remove "+key+" from Query",null,null,null); } @Override public Object removeEL(Collection.Key key) { return get(key,null); } @Override public void clear() {} @Override public Object get(String key) throws PageException { return get(Caster.toIntValue(key)); } @Override public Object get(Collection.Key key) throws PageException { return get(Caster.toIntValue(key.getString())); } @Override public Object get(String key, Object defaultValue) { return get(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),defaultValue); } @Override public Object get(Collection.Key key, Object defaultValue) { return get(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),defaultValue); } @Override public Object set(String key, Object value) throws PageException { return set(Caster.toIntValue(key),value); } @Override public Object set(Collection.Key key, Object value) throws PageException { return set(Caster.toIntValue(key),value); } @Override public Object setEL(String key, Object value) { return setEL(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),value); } @Override public Object setEL(Collection.Key key, Object value) { return setEL(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),value); } @Override public Iterator<Collection.Key> keyIterator() { return new KeyIterator(keys()); } @Override public Iterator<String> keysAsStringIterator() { return new StringIterator(keys()); } @Override public Iterator<Entry<Key, Object>> entryIterator() { return new EntryIterator(this, keys()); } @Override public Iterator<Object> valueIterator() { return query.getColumn(columnName,null).valueIterator(); } @Override public boolean containsKey(String key) { return get(key,NullSupportHelper.NULL())!=NullSupportHelper.NULL(); } @Override public boolean containsKey(Collection.Key key) { return get(key,NullSupportHelper.NULL())!=NullSupportHelper.NULL(); } @Override public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) { return DumpUtil.toDumpData(get(query.getCurrentrow(pageContext.getId()),null), pageContext,maxlevel,dp); } @Override public String castToString() throws PageException { return Caster.toString(get(query.getCurrentrow(ThreadLocalPageContext.get().getId()))); } @Override public String castToString(String defaultValue) { Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL()); if(value==NullSupportHelper.NULL())return defaultValue; return Caster.toString(value,defaultValue); } @Override public boolean castToBooleanValue() throws PageException { return Caster.toBooleanValue(get(query.getCurrentrow(ThreadLocalPageContext.get().getId()))); } @Override public Boolean castToBoolean(Boolean defaultValue) { Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL()); if(value==NullSupportHelper.NULL())return defaultValue; return Caster.toBoolean(value,defaultValue); } @Override public double castToDoubleValue() throws PageException { return Caster.toDoubleValue(get(query.getCurrentrow(ThreadLocalPageContext.get().getId()))); } @Override public double castToDoubleValue(double defaultValue) { Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL()); if(value==NullSupportHelper.NULL())return defaultValue; return Caster.toDoubleValue(value,defaultValue); } @Override public DateTime castToDateTime() throws PageException { return Caster.toDate(get(query.getCurrentrow(ThreadLocalPageContext.get().getId())),null); } @Override public DateTime castToDateTime(DateTime defaultValue) { Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL()); if(value==NullSupportHelper.NULL())return defaultValue; return DateCaster.toDateAdvanced(value,true,null,defaultValue); } @Override public int compareTo(boolean b) throws PageException { return Operator.compare(castToBooleanValue(), b); } @Override public int compareTo(DateTime dt) throws PageException { return Operator.compare((Date)castToDateTime(), (Date)dt); } @Override public int compareTo(double d) throws PageException { return Operator.compare(castToDoubleValue(), d); } @Override public int compareTo(String str) throws PageException { return Operator.compare(castToString(), str); } @Override public String getKeyAsString() throws PageException { return columnName.toString(); } @Override public Collection.Key getKey() throws PageException { return columnName; } @Override public Object get(PageContext pc) throws PageException { return get(query.getCurrentrow(pc.getId())); } @Override public Object get(PageContext pc, Object defaultValue) { return get(query.getCurrentrow(pc.getId()),defaultValue); } @Override public Object removeRow(int row) throws DatabaseException { throw new DatabaseException("can't remove row from Query",null,null,null); } @Override public Object touch(PageContext pc) throws PageException { return touch(query.getCurrentrow(pc.getId())); } @Override public Object touchEL(PageContext pc) { return touchEL(query.getCurrentrow(pc.getId())); } @Override public Object set(PageContext pc, Object value) throws PageException { return set(query.getCurrentrow(pc.getId()),value); } @Override public Object setEL(PageContext pc, Object value) { return setEL(query.getCurrentrow(pc.getId()),value); } @Override public Object remove(PageContext pc) throws PageException { return remove(query.getCurrentrow(pc.getId())); } @Override public Object removeEL(PageContext pc) { return removeEL(query.getCurrentrow(pc.getId())); } @Override public Object getParent() { return query; } @Override public Object clone() { QueryColumn clone=new QueryColumnRef(query,columnName,type); return clone; } @Override public Collection duplicate(boolean deepCopy) { // MUST muss deepCopy checken QueryColumn clone=new QueryColumnRef(query,columnName,type); return clone; } @Override public long sizeOf() { return QueryUtil.sizeOf(this); } @Override public java.util.Iterator<String> getIterator() { return keysAsStringIterator(); } @Override public boolean equals(Object obj){ if(!(obj instanceof Collection)) return false; return CollectionUtil.equals(this,(Collection)obj); } /*@Override public int hashCode() { return CollectionUtil.hashCode(this); }*/ }