public class ObjectTransformer extends AbstractTransformer
{
public void transform(Object object)
{
JSONContext context= getContext();
Path path= context.getPath();
ChainedSet visits= context.getVisits();
try
{
if (!visits.contains(object))
{
context.setVisits(new ChainedSet(visits));
context.getVisits().add(object);
// traverse object
BeanAnalyzer analyzer= BeanAnalyzer.analyze(resolveClass(object));
TypeContext typeContext= context.writeOpenObject();
context.writeName("@id");
Integer objectId= getObjectId(object, context);
context.getReferences().put(System.identityHashCode(object), objectId);
context.write("" + objectId);
context.writeComma();
for (BeanProperty prop : analyzer.getProperties())
{
String name= prop.getName();
path.enqueue(name);
if (context.isIncluded(prop))
{
Object value= prop.getValue(object);
//if (!context.getVisits().contains(value))
{
TransformerWrapper transformer= (TransformerWrapper) context.getTransformer(value);
if ("class".equals(name)) //revisar esto!!!!
transformer= new TransformerWrapper(new ClassTransformer());
if (transformer == null)
transformer= new TransformerWrapper(new NullTransformer());
if ((transformer.getTransformer() instanceof ObjectTransformer) || !context.getVisits().contains(value))
{
if (!transformer.isInline())
{
if (!typeContext.isFirst())
context.writeComma();
typeContext.setFirst(false);
context.writeName(name);
}
typeContext.setPropertyName(name);
transformer.transform(value);
}
}
}
path.pop();
}
context.writeCloseObject();
context.setVisits((ChainedSet) context.getVisits().getParent());
}
else
{
writeReference(object, context);