/**
   * Gets document name and sets valid content file format for the document.
   *
   * @param idfSession
   * @param idfDocument
   * @throws DfException
   */
  private void setContentTypeFromName(IDfSession idfSession, IDfDocument idfDocument)
      throws DfException {
    String strObjectName = null;
    String[] strFullObjectName = idfDocument.getObjectName().split("/");

    if (strFullObjectName.length > 1) {
      strObjectName = strFullObjectName[strFullObjectName.length - 1];
    } else {
      strObjectName = strFullObjectName[0];
    }

    DfLogger.debug(this, utilObj.getSpaces() + "strObjectName : " + strObjectName, null, null);

    idfDocument.setObjectName(strObjectName);

    IDfClientX cl = new DfClientX();
    IDfFormatRecognizer fileFormat = cl.getFormatRecognizer(idfSession, strObjectName, null);
    DfLogger.debug(this, utilObj.getSpaces() + "File Format is= " + fileFormat, null, null);

    String validFileFormat = fileFormat.getDefaultSuggestedFileFormat();

    if (null == validFileFormat || "".equals(validFileFormat)) {
      validFileFormat = IConstants.UNKNOWN_FORMAT;
      DfLogger.error(this, "Can not obtain the format for : " + strObjectName, null, null);
      DfLogger.error(this, "Setting format : " + validFileFormat, null, null);
    }

    DfLogger.debug(
        this, utilObj.getSpaces() + "Valid File Format : " + validFileFormat, null, null);
    idfDocument.setContentType(validFileFormat);
    idfDocument.setSubject(strObjectName);
    idfDocument.save();
  }
  public void setAttachmentsContentTypeForElf(
      IDfSession idfSession,
      String[] attachmentIds,
      String strArticleFolderPath,
      String strStageName)
      throws DfException, XPathExpressionException, ParserConfigurationException, SAXException,
          IOException {
    DfLogger.debug(
        this,
        utilObj.getSpaces()
            + "setAttachmentsContentType :::: Length of Attachments : "
            + attachmentIds.length,
        null,
        null);
    String strDeliveryFolderName = "";
    String strStageFolderName = "";

    if (IConstants.ATTR_STAGE_NAME_200.equalsIgnoreCase(strStageName)) {
      strDeliveryFolderName =
          IConstants.PATH_AMPP_COPY_EDITING; // IConstants.PATH_AMPP_DELIVERY_FOLDER;
      strStageFolderName = IConstants.FOLDER_NAME_STAGE_200;
    } else {
      strDeliveryFolderName =
          IConstants.PATH_AMPP_COPY_EDITING; // IConstants.PATH_AMPP_DELIVERY_FOLDER;
      strStageFolderName = IConstants.FOLDER_NAME_STAGE_300;
    }

    for (int i = 0; i < attachmentIds.length; i++) {
      if (DfId.isObjectId(attachmentIds[i])) {

        DfLogger.debug(
            this, utilObj.getSpaces() + "Attachment ID : " + attachmentIds[i], null, null);

        IDfDocument idfDocument = (IDfDocument) idfSession.getObject(new DfId(attachmentIds[i]));
        if (idfDocument != null) {
          setContentTypeFromName(idfSession, idfDocument);

          idfDocument.fetch(null);
          setAttachmentToArticleForElf(
              idfSession,
              idfDocument,
              strArticleFolderPath,
              strStageFolderName,
              strDeliveryFolderName);
        }
      }
    }
  }
  /**
   * This is the main method which processes AMPP received documents.
   *
   * @param idfSession
   * @param attachmentIds
   * @param strArticleFolderPath
   * @throws DfException
   */
  public void setAttachmentsContentTypeForAMPP(
      IDfSession idfSession,
      String[] attachmentIds,
      String strArticleFolderPath,
      String strStageName)
      throws DfException {
    DfLogger.debug(this, utilObj.getSpaces() + "setAttachmentsContentType ::::", null, null);
    String strDeliveryFolderName = "";
    String strStageFolderName = "";

    if (IConstants.ATTR_STAGE_NAME_200.equalsIgnoreCase(strStageName)) {
      strDeliveryFolderName =
          IConstants.PATH_AMPP_COPY_EDITING; // IConstants.PATH_AMPP_DELIVERY_FOLDER;
      strStageFolderName = IConstants.FOLDER_NAME_STAGE_200;
    } else {
      // Pramod | 30 Oct 2014 | All files will be stored under
      // Stage/Delivery Folder
      // strDeliveryFolderName = IConstants.PATH_AMPP_300_DELIVERY_FOLDER;
      strDeliveryFolderName =
          IConstants.PATH_AMPP_COPY_EDITING; // IConstants.PATH_AMPP_DELIVERY_FOLDER;
      strStageFolderName = IConstants.FOLDER_NAME_STAGE_300;
    }

    for (int i = 0; i < attachmentIds.length; i++) {
      if (DfId.isObjectId(attachmentIds[i])) {

        DfLogger.debug(
            this, utilObj.getSpaces() + "Attachment ID : " + attachmentIds[i], null, null);

        IDfDocument idfDocument = (IDfDocument) idfSession.getObject(new DfId(attachmentIds[i]));
        if (idfDocument != null) {

          DfLogger.debug(
              this,
              "File Path before setting content type : " + idfDocument.getFile(null),
              null,
              null);
          setContentTypeFromName(idfSession, idfDocument);
          idfDocument.save();
          idfDocument.fetch(null);
          setAttachmentToArticleForAMPP(
              idfSession,
              idfDocument,
              strArticleFolderPath,
              strStageFolderName,
              strDeliveryFolderName);
          if (idfDocument.isDeleted() != true) {
            idfDocument.save();
            DfLogger.debug(
                this,
                utilObj.getSpaces()
                    + "Attachment "
                    + idfDocument.getObjectName()
                    + " Processed and Saved successfully ",
                null,
                null);
          }
        }
      }
    }
  }
  private void setAttachmentToArticleForElf(
      IDfSession idfSession,
      IDfDocument idfAttachmentDocObj,
      String strArticleFolderPath,
      String strStageFolderName,
      String strDeliveryFolderName) {
    DfLogger.debug(
        this, utilObj.getSpaces() + "Inside method setAttachmentToArticleForElf.", null, null);
    Boolean isCheckedOut = false;
    IDfDocument docObj = null;
    String strObjectName = "";
    boolean isLogObject = false;
    boolean isImageObject = false;
    String strObjectType = "";
    String strItemType = "";
    String strLogCategory = "";
    String strLogType = "";

    StringBuilder strFolderPah = new StringBuilder(strArticleFolderPath + "/" + strStageFolderName);

    try {
      strObjectName = idfAttachmentDocObj.getObjectName();
      DfLogger.debug(null, "strObjectName-->" + strObjectName, null, null);

      if (strObjectName.toLowerCase().contains(IConstants.STR_CHECK_PDF_ONLINE)
          && strObjectName.toLowerCase().endsWith(".pdf")) {

        strItemType = IConstants.ITEM_TYPE_CHECK_PDF_ONLINE;
        strObjectType = IConstants.TYPE_WORKITEM_OBJECT;
        strFolderPah.append(IConstants.PATH_GRAPHICS_FOLDER);
      } else if (strObjectName.toLowerCase().contains(IConstants.STR_CHECK_PDF_PRINT)
          && strObjectName.toLowerCase().endsWith(".pdf")) {

        strItemType = IConstants.ITEM_TYPE_CHECK_PDF_PRINT;
        strObjectType = IConstants.TYPE_WORKITEM_OBJECT;
        strFolderPah.append(IConstants.PATH_GRAPHICS_FOLDER);
      } else if (strObjectName.toLowerCase().contains(IConstants.STR_COLOR_ON_PAGE_PRINT)
          && strObjectName.toLowerCase().endsWith(".pdf")) {

        strItemType = IConstants.ITEM_TYPE_COLOR_ON_PAGE_PRINT;
        strObjectType = IConstants.TYPE_WORKITEM_OBJECT;
        strFolderPah.append(IConstants.PATH_GRAPHICS_FOLDER);
      } else if (strObjectName.toLowerCase().contains(IConstants.ELF_FILE_PREFIX_METADATA_XML)
          && strObjectName.endsWith(".xml")) {

        strObjectType = IConstants.TYPE_LOG_OBJECT;
        strLogCategory = IConstants.ATTR_LOG_CATEGORY_ELF_METADATA;

        isLogObject = true;
        strFolderPah.append(IConstants.PATH_GRAPHICS_FOLDER + "/" + IConstants.FOLDER_NAME_LOGS);
      } else if (strObjectName.toLowerCase().contains(IConstants.IMAGE_RENDITION_HTML)
          && (strObjectName.toLowerCase().endsWith(".jpg")
              || strObjectName.toLowerCase().endsWith(".gif"))) {

        strItemType = IConstants.ITEM_TYPE_ONLINE_IMAGE;
        strObjectType = IConstants.TYPE_WORKITEM_OBJECT;
        strFolderPah.append(IConstants.PATH_GRAPHICS_FOLDER + "/" + IConstants.ONLINE_FOLDER);
        isImageObject = true;
        DfLogger.debug(this, "isImageObject : " + isImageObject, null, null);
      } else if (strObjectName.toLowerCase().contains(IConstants.ELF_FILE_PREFIX_ERROR_XML)
          && strObjectName.endsWith(".xml")) {

        strObjectType = IConstants.TYPE_LOG_OBJECT;
        strLogCategory = IConstants.ATTR_LOG_CATEGORY_ELF_MESSAGES;
        isLogObject = true;
        strFolderPah.append(IConstants.PATH_GRAPHICS_FOLDER + "/" + IConstants.FOLDER_NAME_LOGS);
      } else {

        // idfAttachmentDocObj.destroy();
        idfAttachmentDocObj.mark("DELETE");
        idfAttachmentDocObj.save();

        DfLogger.warn(
            this,
            "Unexpected file received : "
                + strObjectName
                + " | no operations required on Object.. ",
            null,
            null);
        return;
      }

      DfLogger.debug(this, "setAttachmentToArticle folder path : " + strFolderPah, null, null);

      if (!isLogObject) {
        docObj =
            (IDfDocument)
                idfSession.getObjectByQualification(
                    strObjectType
                        + " where Folder('"
                        + strFolderPah
                        + "') "
                        + " and object_name = '"
                        + idfAttachmentDocObj.getObjectName()
                        + "' and item_type='"
                        + strItemType
                        + "'");

        DfLogger.debug(
            this,
            strObjectType
                + " where Folder('"
                + strFolderPah
                + "') "
                + " and object_name = '"
                + idfAttachmentDocObj.getObjectName()
                + "' and item_type='"
                + strItemType
                + "'",
            null,
            null);
      } else {
        docObj =
            (IDfDocument)
                idfSession.getObjectByQualification(
                    strObjectType
                        + " where Folder('"
                        + strFolderPah
                        + "') "
                        + " and "
                        + IConstants.ATTR_LOG_CATEGORY
                        + " = '"
                        + strLogCategory
                        + "'");

        DfLogger.debug(
            this,
            strObjectType
                + " where Folder('"
                + strFolderPah
                + "') "
                + " and "
                + IConstants.ATTR_LOG_CATEGORY
                + " = '"
                + strLogCategory
                + "'",
            null,
            null);
      }

      if (docObj != null) {

        DfLogger.debug(
            this,
            utilObj.getSpaces()
                + "Existing version found.Creating new version inside Article Folder",
            null,
            null);
        // [TODO] see if checking of "if checked out" can be added in
        // executeCheckoutOperation
        if (docObj.isCheckedOut()) {
          docObj.cancelCheckout();
        }
        isCheckedOut = utilObj.executeCheckoutOperation(docObj);

        if (isCheckedOut) {
          IDfDocument idfNewVersion =
              utilObj.executeCheckinOperation(idfSession, docObj, idfAttachmentDocObj);
          if (idfNewVersion != null) {

            idfNewVersion.save();

            // idfAttachmentDocObj.destroy();
            // Pramod | Attachment object is no longer required on
            // creation of new version so it will be marked as
            // DELETE and will be deleted at the end of the
            // processing
            idfAttachmentDocObj.mark("DELETE");
            idfAttachmentDocObj.save();

            DfLogger.info(
                this,
                " ---------------------- "
                    + idfAttachmentDocObj.getObjectName()
                    + " Marked as to be deleted ",
                null,
                null);
          }
        }
      } else {
        DfLogger.debug(
            this,
            utilObj.getSpaces() + "New document processing. Linking to article folder",
            null,
            null);

        if (isLogObject == true) {
          DfLogger.debug(this, "Object Name of log file : " + strObjectName, null, null);
          IDfQuery qry = new DfQuery();
          String strObjId = idfAttachmentDocObj.getObjectId().getId();
          qry.setDQL(
              "change "
                  + IConstants.TYPE_WORKITEM_OBJECT
                  + " objects to dm_document where r_object_id='"
                  + strObjId
                  + "'");
          IDfCollection idfColl1 = qry.execute(idfSession, IDfQuery.DF_EXEC_QUERY);
          if (null != idfColl1 && IDfCollection.DF_CLOSED_STATE != idfColl1.getState()) {
            idfColl1.close();
          }
          qry.setDQL(
              "change dm_document objects to "
                  + IConstants.TYPE_LOG_OBJECT
                  + " where r_object_id='"
                  + strObjId
                  + "'");

          IDfCollection idfColl2 = qry.execute(idfSession, IDfQuery.DF_EXEC_QUERY);
          if (null != idfColl2 && IDfCollection.DF_CLOSED_STATE != idfColl2.getState()) {
            idfColl2.close();
          }
          idfAttachmentDocObj.fetch(null);
          idfAttachmentDocObj.setString(IConstants.ATTR_LOG_TYPE, strLogType);
          idfAttachmentDocObj.setString(IConstants.ATTR_LOG_CATEGORY, strLogCategory);
          idfAttachmentDocObj.setObjectName(strObjectName);
          idfAttachmentDocObj.save();
        }

        IDfACL folderAcl = idfSession.getFolderByPath(strFolderPah.toString()).getACL();

        if (isImageObject && strObjectName.split("_").length == 5) {
          idfAttachmentDocObj.setTitle(strObjectName.split("_")[3]);
        }

        idfAttachmentDocObj.setACL(folderAcl);
        idfAttachmentDocObj.unlink(idfAttachmentDocObj.getFolderId(0).toString());
        idfAttachmentDocObj.link(strFolderPah.toString());
        setWorkitemMetadata(idfAttachmentDocObj);

        idfAttachmentDocObj.save();
      }
      DfLogger.debug(
          this,
          utilObj.getSpaces() + "Method processAttachments completed successfully.",
          null,
          null);
    } catch (RuntimeException ex) {
      DfLogger.error(this, ex.getMessage(), null, null);
      throw ex;
    } catch (DfException e) {
      DfLogger.error(this, "Error occured in processing attachment: " + e.getMessage(), null, e);
    }
  }
  /**
   * Handles versioning for AMPP documents. Major version will be created if document of particular
   * type already exists in Article Delivery Folder.
   *
   * @param idfSession
   * @param idfAttachmentDocObj
   * @param strArticleFolderPath
   */
  private void setAttachmentToArticleForAMPP(
      IDfSession idfSession,
      IDfDocument idfAttachmentDocObj,
      String strArticleFolderPath,
      String strStageFolderName,
      String strDeliveryFolderName) {
    DfLogger.debug(this, utilObj.getSpaces() + "Inside method processAttachments.", null, null);
    Boolean isCheckedOut = false;
    IDfDocument docObj = null;
    String strObjectName = "";
    boolean isLogObject = false;
    String strObjectType = "";
    String strItemType = "";
    String strLogCategory = "";
    String strLogType = "";

    StringBuilder strFolderPah = new StringBuilder(strArticleFolderPath + "/" + strStageFolderName);

    try {
      strObjectName = idfAttachmentDocObj.getObjectName();

      if (strObjectName.toLowerCase().contains(IConstants.AMPP_FILE_SUFFIX_ARTICLE_XML)) {

        strItemType = IConstants.AMPP_WORKITEM_VALUE_XML;
        strObjectType = IConstants.TYPE_WORKITEM_OBJECT;
        strFolderPah.append(IConstants.PATH_AMPP_COPY_EDITING);
      } else if (strObjectName.toLowerCase().contains(IConstants.FILE_SUFFIX_ARTICLE_PDF)) {

        strItemType = IConstants.AMPP_WORKITEM_VALUE_ONLINE_PDF;
        strObjectType = IConstants.TYPE_WORKITEM_OBJECT;
        strFolderPah.append(IConstants.PATH_AMPP_COPY_EDITING);
      } else if (strObjectName
          .toLowerCase()
          .contains(IConstants.AMPP_FILE_SUFFIX_VALIDATION_LOGL)) {

        strObjectType = IConstants.TYPE_LOG_OBJECT;
        strLogCategory = IConstants.ATTR_LOG_CATEGORY_AMPP_CC;
        isLogObject = true;
        strFolderPah.append(IConstants.PATH_COPY_EDITING_LOG_FOLDER);
      } else if (strObjectName.toLowerCase().contains(IConstants.AMPP_FILE_PREFX_ERROR_LOG)
          && strObjectName.endsWith(".xml")) {

        strObjectType = IConstants.TYPE_LOG_OBJECT;
        strLogCategory = IConstants.ATTR_LOG_CATEGORY_AMPP_MESSAGES;
        strLogType = IConstants.LOG_TYPE_FAILURE;
        isLogObject = true;
        strFolderPah.append(
            IConstants.PATH_COPY_EDITING_FOLDER + "/" + IConstants.FOLDER_NAME_LOGS);
      } else if (strObjectName.toLowerCase().contains(IConstants.BREEZE_FILE_SUFFIX_ERROR_LOG)
          && strObjectName.endsWith(".txt")) {

        strObjectType = IConstants.TYPE_LOG_OBJECT;
        strLogCategory = IConstants.ATTR_LOG_CATEGORY_BREEZE;
        isLogObject = true;
        strFolderPah.append(
            IConstants.PATH_COPY_EDITING_FOLDER + "/" + IConstants.FOLDER_NAME_LOGS);
      } else if (strObjectName.toLowerCase().contains(IConstants.BREEZE_FILE_SUFFIX_SUCCESS_LOG)
          && strObjectName.endsWith(".txt")) {

        strObjectType = IConstants.TYPE_LOG_OBJECT;
        strLogCategory = IConstants.ATTR_LOG_CATEGORY_BREEZE;
        isLogObject = true;
        strFolderPah.append(
            IConstants.PATH_COPY_EDITING_FOLDER + "/" + IConstants.FOLDER_NAME_LOGS);
      } else if (strObjectName.toLowerCase().contains(IConstants.AMPP_FILE_SUFFIX_STYLED_DOC)) {

        for (String strExtensions : IConstants.AMPP_FILE_EXT_STYLED_DOC) {
          if (strObjectName.contains("." + strExtensions)) {
            strItemType = IConstants.AMPP_WORKITEM_VALUE_DOC;
            strObjectType = IConstants.TYPE_WORKITEM_OBJECT;
            strFolderPah.append(IConstants.PATH_COPY_EDITING_FOLDER);
            break;
          }
        }
      } else {
        idfAttachmentDocObj.destroy();
        throw new RuntimeException(
            "Unexpected file received : " + strObjectName + " | Destroyed Object.. ");
      }

      DfLogger.debug(this, "setAttachmentToArticle folder path : " + strFolderPah, null, null);

      if (!isLogObject) {
        docObj =
            (IDfDocument)
                idfSession.getObjectByQualification(
                    strObjectType
                        + " where Folder('"
                        + strFolderPah
                        + "') "
                        + " and item_type='"
                        + strItemType
                        + "'");
      } else {
        docObj =
            (IDfDocument)
                idfSession.getObjectByQualification(
                    strObjectType
                        + " where Folder('"
                        + strFolderPah
                        + "') "
                        + " and "
                        + IConstants.ATTR_LOG_CATEGORY
                        + " = '"
                        + strLogCategory
                        + "'");
      }

      idfAttachmentDocObj.getFile(null);

      if (docObj != null) {

        DfLogger.debug(
            this,
            utilObj.getSpaces()
                + "Existing version found.Creating new version inside Delivery Folder",
            null,
            null);
        // [TODO] see if checking of "if checked out" can be added in
        // executeCheckoutOperation
        if (docObj.isCheckedOut()) {
          docObj.cancelCheckout();
        }
        isCheckedOut = utilObj.executeCheckoutOperation(docObj);

        if (isCheckedOut) {
          utilObj.executeCheckinOperation(idfSession, docObj, idfAttachmentDocObj);
        }
      } else {
        DfLogger.debug(
            this,
            utilObj.getSpaces() + "New document processing. Linking to article folder",
            null,
            null);

        if (isLogObject == true) {
          DfLogger.debug(this, "Object Name of log file : " + strObjectName, null, null);
          IDfQuery qry = new DfQuery();
          String strObjId = idfAttachmentDocObj.getObjectId().getId();
          qry.setDQL(
              "change "
                  + IConstants.TYPE_WORKITEM_OBJECT
                  + " objects to dm_document where r_object_id='"
                  + strObjId
                  + "'");
          DfLogger.debug(this, qry.getDQL(), null, null);

          IDfCollection idfColl1 = qry.execute(idfSession, IDfQuery.DF_EXEC_QUERY);
          if (null != idfColl1 && IDfCollection.DF_CLOSED_STATE != idfColl1.getState()) {
            idfColl1.close();
          }

          qry.setDQL(
              "change dm_document objects to "
                  + IConstants.TYPE_LOG_OBJECT
                  + " where r_object_id='"
                  + strObjId
                  + "'");
          DfLogger.debug(this, qry.getDQL(), null, null);

          IDfCollection idfColl2 = qry.execute(idfSession, IDfQuery.DF_EXEC_QUERY);
          if (null != idfColl2 && IDfCollection.DF_CLOSED_STATE != idfColl2.getState()) {
            idfColl2.close();
          }
          idfAttachmentDocObj.fetch(null);
          idfAttachmentDocObj.setString(IConstants.ATTR_LOG_TYPE, strLogType);
          idfAttachmentDocObj.setString(IConstants.ATTR_LOG_CATEGORY, strLogCategory);
          idfAttachmentDocObj.setObjectName(strObjectName);
          idfAttachmentDocObj.save();
        }

        IDfACL folderAcl = idfSession.getFolderByPath(strFolderPah.toString()).getACL();
        DfLogger.debug(this, folderAcl.getObjectName(), null, null);

        idfAttachmentDocObj.setACL(folderAcl);
        idfAttachmentDocObj.unlink(idfAttachmentDocObj.getFolderId(0).toString());
        idfAttachmentDocObj.link(strFolderPah.toString());
        setWorkitemMetadata(idfAttachmentDocObj);
      }
      DfLogger.debug(
          this,
          utilObj.getSpaces() + "Method processAttachments completed successfully.",
          null,
          null);
    } catch (DfException e) {
      DfLogger.error(this, "Error occured in processing attachment: " + e.getMessage(), null, e);
    }
  }