package railo.intergral.fusiondebug.server.type.coll; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import railo.intergral.fusiondebug.server.type.FDValueSupport; import railo.intergral.fusiondebug.server.type.FDVariable; import railo.intergral.fusiondebug.server.util.FDCaster; import railo.runtime.Component; import railo.runtime.type.Array; import railo.runtime.type.Collection; import railo.runtime.type.Collection.Key; import railo.runtime.type.Struct; import railo.runtime.type.comparator.TextComparator; import railo.runtime.type.util.CollectionUtil; import com.intergral.fusiondebug.server.FDLanguageException; import com.intergral.fusiondebug.server.FDMutabilityException; import com.intergral.fusiondebug.server.IFDStackFrame; public class FDCollection extends FDValueSupport { private static final int INTERVAL = 10; private ArrayList children; private Collection coll; private String name; private Key[] keys; /** * Constructor of the class * @param frame * @param name * @param name * @param coll */ public FDCollection(IFDStackFrame frame, String name, Collection coll) { this(frame,name,coll,keys(coll)); } public FDCollection(IFDStackFrame frame, String name, Collection coll, Key[] keys) { this.name=name; this.coll=coll; this.keys=keys; //Key[] keys = coll.keys(); children=new ArrayList(); int interval=INTERVAL; while(interval*interval<keys.length) interval*=interval; if(keys.length>interval){ FDCollection node; int len=keys.length; int max; for(int i=0;i<len;i+=interval) { max=(i+(interval))<len?(interval):len-i; Key[] skeys=new Key[max]; for(int y=0;y<max;y++) { skeys[y]=keys[i+y]; } node = new FDCollection(frame,"Rows",coll,skeys); children.add(new FDVariable(frame,node.getName(),node)); } } else { FDCollectionNode node; for(int i=0;i<keys.length;i++){ node = new FDCollectionNode(frame,coll,keys[i]); children.add(new FDVariable(frame,node.getName(),node)); } } } private static Key[] keys(Collection coll) { Key[] keys=CollectionUtil.keys(coll); if(coll instanceof Array) return keys; TextComparator comp=new TextComparator(true,true); Arrays.sort(keys,comp); return keys; } @Override public List getChildren() { return children; } public IFDStackFrame getStackFrame() { // TODO Auto-generated method stub return null; } @Override public boolean isMutable() { return false; } public void set(String arg0) throws FDMutabilityException,FDLanguageException { throw new FDMutabilityException(); } @Override public boolean hasChildren() { return true; } @Override public String toString() { if(coll instanceof Array) return "["+fromto()+"]"; if(coll instanceof Component){ Component c=(Component) coll; return "Component "+c.getName()+"("+c.getPageSource().getDisplayPath()+")"; } if(coll instanceof Struct) return "{"+fromto()+"}"; return FDCaster.serialize(coll); } private String fromto() { StringBuffer sb=new StringBuffer(); for(int i=0;i<keys.length;i++){ if(i!=0)sb.append(","); sb.append(keys[i].toString()); } return keys[0]+" ... "+keys[keys.length-1]; } @Override public String getName() { return name; } }