public void updateXmlForm(AttachmentPK pk, String language, String xmlFormName)
     throws AttachmentException {
   Connection con = getConnection();
   try {
     if (!I18NHelper.isI18N || !StringUtil.isDefined(language)) {
       dao.updateXmlForm(con, pk, xmlFormName);
     } else {
       AttachmentDetail attachment = dao.findByPrimaryKey(con, pk);
       if (!StringUtil.isDefined(attachment.getLanguage())
           || attachment.getLanguage().equals(language)) {
         dao.updateXmlForm(con, pk, xmlFormName);
       } else {
         AttachmentI18NDAO.updateXmlForm(con, pk, language, xmlFormName);
       }
     }
   } catch (SQLException se) {
     throw new AttachmentException(
         "AttachmentBmImpl.updateXmlForm()",
         SilverpeasException.ERROR,
         "EX_RECORD_NOT_UPDATE_ATTACHMENT",
         se);
   } finally {
     closeConnection(con);
   }
 }
  @Override
  public void updateAttachment(AttachmentDetail attachDetail) throws AttachmentException {
    Connection con = getConnection();
    try {
      boolean updateDefault = false;
      AttachmentDetail oldAttachment = dao.findByPrimaryKey(con, attachDetail.getPK());
      String oldLang = oldAttachment.getLanguage();

      if (attachDetail.isRemoveTranslation()) {
        if ("-1".equals(attachDetail.getTranslationId())) {
          List<AttachmentDetailI18N> translations =
              AttachmentI18NDAO.getTranslations(con, attachDetail.getPK());

          if (translations != null && translations.size() > 0) {
            AttachmentDetailI18N translation = translations.get(0);
            attachDetail.setPhysicalName(translation.getPhysicalName());
            attachDetail.setLogicalName(translation.getLogicalName());
            attachDetail.setType(translation.getType());
            attachDetail.setCreationDate(translation.getCreationDate());
            attachDetail.setSize(translation.getSize());
            attachDetail.setAuthor(translation.getAuthor());
            attachDetail.setTitle(translation.getTitle());
            attachDetail.setInfo(translation.getInfo());
            attachDetail.setLanguage(translation.getLanguage());
            AttachmentI18NDAO.removeTranslation(con, translation.getId());
            updateDefault = true;
          }
        } else {
          AttachmentI18NDAO.removeTranslation(con, attachDetail.getTranslationId());
        }
      } else {
        // Add or update a translation
        if (attachDetail.getLanguage() != null) {
          if (oldLang == null) {
            // translation for the first time
            oldLang = I18NHelper.defaultLanguage;
          }

          if (!oldLang.equalsIgnoreCase(attachDetail.getLanguage())) {
            AttachmentDetailI18N translation = new AttachmentDetailI18N(attachDetail);
            String translationId = attachDetail.getTranslationId();

            if (translationId != null && !"-1".equals(translationId)) {
              AttachmentI18NDAO.updateTranslation(con, translation);
            } else {
              AttachmentI18NDAO.addTranslation(con, translation);
            }
            attachDetail.setPhysicalName(oldAttachment.getPhysicalName());
            attachDetail.setLogicalName(oldAttachment.getLogicalName());
            attachDetail.setType(oldAttachment.getType());
            attachDetail.setCreationDate(oldAttachment.getCreationDate());
            attachDetail.setSize(oldAttachment.getSize());
            attachDetail.setAuthor(oldAttachment.getAuthor());
            attachDetail.setTitle(oldAttachment.getTitle());
            attachDetail.setInfo(oldAttachment.getInfo());
            attachDetail.setLanguage(oldLang);
          } else {
            updateDefault = true;
          }
        } else {
          updateDefault = true;
        }
      }
      if (updateDefault) {
        dao.updateRow(con, attachDetail);
      }
    } catch (SQLException se) {
      throw new AttachmentException(
          "AttachmentBmImpl.updateAttachment()",
          SilverpeasException.ERROR,
          "attachment.EX_RECORD_NOT_UPDATE_ATTACHMENT",
          se);
    } finally {
      closeConnection(con);
    }
  }