/**
   * tuvToMonoLingualObject converts a given tuv element into a MoonLingualObject
   *
   * @param tuv the tuv Element
   * @return the MonoLingualObject for the given tuv
   */
  public MonoLingualObject tuvToMonoLingualObject(Element tuv) {
    // get the attributes, props and notes
    LinguisticProperties linguisticProperties = createLinguisticProperties(tuv);
    LinguisticProperty tuProp = new LinguisticProperty("tuv", tuv);
    String segment = this.elementContentToString(this.getSeg(tuv));
    String plainTextSegment = MonoLingualObject.simpleComputePlainText(segment);
    MonoLingualObject mono =
        new MonoLingualObject(
            linguisticProperties,
            LinguisticTypes.TMX,
            segment,
            plainTextSegment,
            this.getTuvLang(tuv));

    String uniquidvalue = (String) linguisticProperties.search("unique-id");
    if ((uniquidvalue != null) && !uniquidvalue.equals("")) {
      mono.setStUniqueID(uniquidvalue);
    }

    String stlastAccessTime = (String) linguisticProperties.search("lastAccessTime");
    if ((stlastAccessTime != null) && !stlastAccessTime.equals("")) {
      try {
        long lastAccessTime = Long.parseLong(stlastAccessTime);
        mono.setLastAccessTime(lastAccessTime);
      } catch (NumberFormatException e) {
      }
    }

    mono.addLinguisticProperty(tuProp);
    return mono;
  }
  /**
   * tuToMultiLingualObject converts a given tu element into a MultiLingualObject
   *
   * @param tu the tu Element
   * @return the MultiLingualObject for the given tu
   */
  public MultiLingualObject tuToMultiLingualObject(Element tu) {
    LinguisticProperties linguisticProperties = createLinguisticProperties(tu);

    MultiLingualObject multi = new MultiLingualObject(linguisticProperties, LinguisticTypes.TMX);
    LinguisticProperty tuProp = new LinguisticProperty("tu", tu);
    multi.addLinguisticProperty(tuProp);

    String uniquidvalue = (String) linguisticProperties.search("unique-id");
    if ((uniquidvalue != null) && !uniquidvalue.equals("")) {
      multi.setStUniqueID(uniquidvalue);
    }

    String stlastAccessTime = (String) linguisticProperties.search("lastAccessTime");
    if ((stlastAccessTime != null) && !stlastAccessTime.equals("")) {
      try {
        long lastAccessTime = Long.parseLong(stlastAccessTime);
        multi.setLastAccessTime(lastAccessTime);
      } catch (NumberFormatException e) {
      }
    }

    List<Element> tuvs = this.getTuvList(tu);
    for (int i = 0; i < tuvs.size(); i++) {
      MonoLingualObject mono = tuvToMonoLingualObject(tuvs.get(i));
      if (mono != null) multi.addMonoLingualObject(mono);
    }
    return multi;
  }
  /**
   * saveModifiedLinguisticProperties
   *
   * @param multiLingualObject
   */
  @SuppressWarnings("unchecked")
  public Element saveModifiedLinguisticProperties(MultiLingualObject multiLingualObject) {
    LinguisticProperty lingtu = multiLingualObject.getObjectLinguisticProperty("tu");
    Element tu = (Element) lingtu.getValue();
    if (tu == null) return tu;

    LinguisticProperties linguisticProperties = multiLingualObject.getLinguisticProperties();
    if (linguisticProperties == null) return tu;
    Set<String> enumprop = linguisticProperties.keySet();
    Iterator<String> it = enumprop.iterator();
    while (it.hasNext()) {
      String key = (String) it.next();
      Object value = (Object) linguisticProperties.get(key);
      Object data = null;
      TmxProp tmxProp = null;
      LinguisticProperty ling = null;
      if (value.getClass().getName().equals("java.util.Vector")) {
        for (int i = 0; i < ((Vector<LinguisticProperty>) value).size(); i++) {
          ling = ((Vector<LinguisticProperty>) value).get(i);
          if (ling.getPropStatus().equals(LinguisticProperty.PropStatus.NEW)) continue;
          Object lingValue = ling.getValue();
          String classname = lingValue.getClass().getName();
          if (classname.equals("de.folt.models.documentmodel.tmx.TmxProp")) {
            tmxProp = (TmxProp) lingValue;
            data = ling.getData();
            handleTmxProp(tmxProp, ling, tu, data);
          }
        }
      } else {
        ling = (LinguisticProperty) linguisticProperties.get(key);
        Object lingValue = ling.getValue();
        String classname = lingValue.getClass().getName();
        if (classname.equals("de.folt.models.documentmodel.tmx.TmxProp")) {
          if (ling.getPropStatus().equals(LinguisticProperty.PropStatus.OLD)) continue;
          tmxProp = (TmxProp) lingValue;
          data = ling.getData();
          handleTmxProp(tmxProp, ling, tu, data);
        }
      }
    }

    return tu;
  }
  /**
   * create LinguisticProperties Method returns the attributes of the element as
   * LinguisticProperties
   *
   * @param element the element to retrieve the attributes from
   * @return the LinguisticProperties for the element
   */
  @SuppressWarnings("unchecked")
  public LinguisticProperties createLinguisticProperties(Element element) {
    LinguisticProperties linguisticProperties = new LinguisticProperties();

    List<Attribute> attributes = element.getAttributes();
    for (int i = 0; i < attributes.size(); i++) {
      Attribute att = attributes.get(i);
      if (att.getName().equals("lang")) // ignore language
      continue;
      TmxProp tmxProp =
          new TmxProp(att.getValue(), "", "", TmxProp.PropType.CORE, att.getName(), idVal++);
      LinguisticProperty lingProp = new LinguisticProperty(tmxProp.toString(), tmxProp);
      lingProp.setData(att);
      lingProp.setPropStatus(LinguisticProperty.PropStatus.NEW);
      linguisticProperties.add(lingProp);
    }

    List<Element> props = element.getChildren("prop");
    for (int i = 0; i < props.size(); i++) {
      TmxProp tmxProp = new TmxProp(props.get(i), idVal++);
      LinguisticProperty lingProp = new LinguisticProperty(tmxProp.toString(), tmxProp);
      lingProp.setData(props.get(i));
      lingProp.setPropStatus(LinguisticProperty.PropStatus.NEW);
      linguisticProperties.add(lingProp);
    }

    List<Element> notes = element.getChildren("note");
    for (int i = 0; i < notes.size(); i++) {
      TmxProp tmxProp = new TmxProp(notes.get(i), idVal++);
      LinguisticProperty lingProp = new LinguisticProperty(tmxProp.toString(), tmxProp);
      lingProp.setData(notes.get(i));
      lingProp.setPropStatus(LinguisticProperty.PropStatus.NEW);
      linguisticProperties.add(lingProp);
    }

    return linguisticProperties;
  }