001    package railo.runtime.converter;
002    
003    import java.util.HashSet;
004    import java.util.Iterator;
005    import java.util.Set;
006    
007    import railo.runtime.op.Caster;
008    import railo.runtime.text.xml.struct.XMLStruct;
009    import railo.runtime.type.Array;
010    import railo.runtime.type.Collection;
011    import railo.runtime.type.SimpleValue;
012    import railo.runtime.type.Struct;
013    
014    public class LazyConverter {
015            
016            public static String serialize(Object o)  {
017                    return serialize(o,new HashSet<Object>());
018            }
019            
020            
021            private static String serialize(Object o,Set<Object> done)  {
022                    
023                    if(o==null) return "null";
024                    Object raw=toRaw(o);
025                    
026                    if(done.contains(raw)) return "parent reference";
027                    done.add(raw);
028                    try{
029                             if(o instanceof Array)return serializeArray((Array)o,done);
030                             if(o instanceof Struct){
031                                     return serializeStruct((Struct)o,done);
032                             }
033                             if(o instanceof SimpleValue || o instanceof Number || o instanceof Boolean)return Caster.toString(o,null);
034                             return o.toString();
035                    }
036                    finally {
037                            done.remove(raw);
038                    }
039            }
040    
041            public static Object toRaw(Object o) {
042                    if(o instanceof XMLStruct)return ((XMLStruct)o).toNode();
043                    return o;
044            }
045    
046    
047            private static String serializeStruct(Struct struct, Set<Object> done) {
048                    StringBuffer sb=new StringBuffer("{");
049                    Iterator it = struct.keyIterator();
050                    Object key;
051                    boolean notFirst=false;
052                    while(it.hasNext()) {
053                            if(notFirst)sb.append(", ");
054                            key=it.next();
055                            sb.append(key);
056                            sb.append("={");
057                            if(key instanceof String)
058                                    sb.append(serialize(struct.get((String)key,null),done));
059                            else
060                                    sb.append(serialize(struct.get((Collection.Key)key,null),done));
061                            sb.append("}");
062                            notFirst=true;
063                    }
064                    
065                    return sb.append("}").toString();
066            }
067    
068            private static String serializeArray(Array array, Set<Object> done) {
069                    StringBuffer sb=new StringBuffer("[");
070                    int len=array.size();
071                    for(int i=1;i<=len;i++){
072                            if(i>1)sb.append(", ");
073                            sb.append(serialize(array.get(i,null),done));
074                    }
075                    return sb.append("]").toString();
076            }
077    }