コード例 #1
0
ファイル: ObjectWriter.java プロジェクト: e-ucm/eadventure
  @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;
  }