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 }