@Override public XMLNode write(Identified object, WriterContext context) { if (object == null) { return null; } XMLNode node = new XMLNode(DOMTags.ELEMENT_TAG); if (object.getId() != null && context.containsId(object.getId())) { node.setText(object.getId()); } else { // Set id if necessary if (object.getId() == null) { object.setId(context.generateNewId()); } object = (Identified) context.process(object, node); // If it's a reference if (object.getClass() == BasicElement.class) { node.setText(object.getId()); } else { node.setAttribute(DOMTags.ID_AT, object.getId()); ReflectionClass<?> clazz = ReflectionClassLoader.getReflectionClass(object.getClass()); node.setAttribute(DOMTags.CLASS_AT, context.translateClass(clazz.getType())); while (clazz != null) { for (ReflectionField f : clazz.getFields()) { // Only store fields annotated with param if (f.getAnnotation(Param.class) != null) { Object value = f.getFieldValue(object); if (value != null) { modelVisitor.writeElement( value, object, new ObjectWriterListener(context.translateField(f.getName()), node)); } } } clazz = clazz.getSuperclass(); } } } // Detect duplicated ids Object o = pointers.get(object.getId()); if (o != null && o != object) { if (o.getClass() != BasicElement.class && object.getClass() != BasicElement.class) { logger.error("Duplicated id {}", object.getId()); } } else { // We don't add references to the pointers list if (object.getClass() != BasicElement.class) { pointers.put(object.getId(), object); } } return node; }