public Result execute()

in plugins/misc/mail/src/main/java/org/apache/hop/mail/workflow/actions/getpop/ActionGetPOP.java [307:736]


  public Result execute(Result previousResult, int nr) throws HopException {
    Result result = previousResult;
    result.setResult(false);

    connection = null;
    Session session = null;
    mailConn = null;
    Date beginDate = null;
    Date endDate = null;

    SimpleDateFormat df = new SimpleDateFormat(DATE_PATTERN);

    try {

      boolean usePOP3;
      if (connectionName != null) {
        usePOP3 = getProtocol().equals(MailServerConnection.PROTOCOL_STRING_POP3);
      } else {
        usePOP3 = getProtocol().equals(MailConnectionMeta.PROTOCOL_STRING_POP3);
      }
      boolean moveafter = false;
      int nbrmailtoretrieve =
          usePOP3
              ? (getRetrieveMails() == 2 ? Const.toInt(getFirstMails(), 0) : 0)
              : Const.toInt(getImapFirstMails(), 0);

      String realOutputFolder = createOutputDirectory(ActionGetPOP.FOLDER_OUTPUT);
      String targetAttachmentFolder = createOutputDirectory(ActionGetPOP.FOLDER_ATTACHMENTS);

      // Check destination folder
      String realMoveToIMAPFolder = resolve(getMoveToIMAPFolder());
      if (StringUtils.isEmpty(connectionName)) {
        if (getProtocol().equals(MailServerConnection.PROTOCOL_STRING_IMAP)
                && (getActionType() == MailServerConnection.ACTION_TYPE_MOVE)
            || (getActionType() == MailServerConnection.ACTION_TYPE_GET
                && getAfterGetIMAP() == MailServerConnection.AFTER_GET_IMAP_MOVE)) {
          if (Utils.isEmpty(realMoveToIMAPFolder)) {
            throw new HopException(
                BaseMessages.getString(PKG, "ActionGetMailsFromPOP.Error.MoveToIMAPFolderEmpty"));
          }
          moveafter = true;
        }
      } else {
        if (getProtocol().equals(MailConnectionMeta.PROTOCOL_STRING_IMAP)
                && (getActionType() == MailConnectionMeta.ACTION_TYPE_MOVE)
            || (getActionType() == MailConnectionMeta.ACTION_TYPE_GET
                && getAfterGetIMAP() == MailConnectionMeta.AFTER_GET_IMAP_MOVE)) {
          if (Utils.isEmpty(realMoveToIMAPFolder)) {
            throw new HopException(
                BaseMessages.getString(PKG, "ActionGetMailsFromPOP.Error.MoveToIMAPFolderEmpty"));
          }
          moveafter = true;
        }
      }

      // check search terms
      // Received Date
      if (StringUtils.isEmpty(connectionName)) {
        switch (getConditionReceivedDate()) {
          case MailServerConnection.CONDITION_DATE_EQUAL,
              MailServerConnection.CONDITION_DATE_GREATER,
              MailServerConnection.CONDITION_DATE_SMALLER:
            String realBeginDate = resolve(getReceivedDate1());
            if (Utils.isEmpty(realBeginDate)) {
              throw new HopException(
                  BaseMessages.getString(
                      PKG, "ActionGetMailsFromPOP.Error.ReceivedDateSearchTermEmpty"));
            }
            beginDate = df.parse(realBeginDate);
            break;
          case MailServerConnection.CONDITION_DATE_BETWEEN:
            realBeginDate = resolve(getReceivedDate1());
            if (Utils.isEmpty(realBeginDate)) {
              throw new HopException(
                  BaseMessages.getString(
                      PKG, "ActionGetMailsFromPOP.Error.ReceivedDatesSearchTermEmpty"));
            }
            beginDate = df.parse(realBeginDate);
            String realEndDate = resolve(getReceivedDate2());
            if (Utils.isEmpty(realEndDate)) {
              throw new HopException(
                  BaseMessages.getString(
                      PKG, "ActionGetMailsFromPOP.Error.ReceivedDatesSearchTermEmpty"));
            }
            endDate = df.parse(realEndDate);
            break;
          default:
            break;
        }
      } else {
        switch (getConditionReceivedDate()) {
          case MailConnectionMeta.CONDITION_DATE_EQUAL,
              MailConnectionMeta.CONDITION_DATE_GREATER,
              MailConnectionMeta.CONDITION_DATE_SMALLER:
            String realBeginDate = resolve(getReceivedDate1());
            if (Utils.isEmpty(realBeginDate)) {
              throw new HopException(
                  BaseMessages.getString(
                      PKG, "ActionGetMailsFromPOP.Error.ReceivedDateSearchTermEmpty"));
            }
            beginDate = df.parse(realBeginDate);
            break;
          case MailConnectionMeta.CONDITION_DATE_BETWEEN:
            realBeginDate = resolve(getReceivedDate1());
            if (Utils.isEmpty(realBeginDate)) {
              throw new HopException(
                  BaseMessages.getString(
                      PKG, "ActionGetMailsFromPOP.Error.ReceivedDatesSearchTermEmpty"));
            }
            beginDate = df.parse(realBeginDate);
            String realEndDate = resolve(getReceivedDate2());
            if (Utils.isEmpty(realEndDate)) {
              throw new HopException(
                  BaseMessages.getString(
                      PKG, "ActionGetMailsFromPOP.Error.ReceivedDatesSearchTermEmpty"));
            }
            endDate = df.parse(realEndDate);
            break;
          default:
            break;
        }
      }

      String realserver = getRealServername();
      String realusername = getRealUsername();
      String realpassword = getRealPassword(getPassword());
      String realFilenamePattern = getRealFilenamePattern();
      int realport = Const.toInt(resolve(sslPort), -1);
      String realIMAPFolder = resolve(getImapFolder());
      String realProxyUsername = getRealProxyUsername();

      initVariables();

      // Check if we have a connection name, create a MailServerConnection (metadata item) if we
      // have.
      // Create a mail connection object (locally in the action) if we don't.
      if (!StringUtils.isEmpty(connectionName)) {
        try {
          connection =
              getMetadataProvider().getSerializer(MailServerConnection.class).load(connectionName);
        } catch (HopException e) {
          throw new RuntimeException(
              "Mail server connection '" + connectionName + "' could not be found", e);
        }
        try {
          connection.getSession(getVariables());
          connection.getStore().connect();
        } catch (Exception e) {
          throw new RuntimeException(
              "A connection to mail server connection '"
                  + connectionName
                  + "' could not be established",
              e);
        }
      } else {
        mailConn =
            new MailConnection(
                getLogChannel(),
                MailConnectionMeta.getProtocolFromString(
                    getProtocol(), MailConnectionMeta.PROTOCOL_IMAP),
                realserver,
                realport,
                realusername,
                realpassword,
                isUseSsl(),
                isUseXOauth2(),
                isUseProxy(),
                realProxyUsername);
        // connect
        mailConn.connect();
      }

      if (moveafter) {
        if (connection != null) {
          connection.setDestinationFolder(realMoveToIMAPFolder, isCreateMoveToFolder());
        } else {
          // Set destination folder
          // Check if folder exists
          mailConn.setDestinationFolder(realMoveToIMAPFolder, isCreateMoveToFolder());
        }
      }

      // apply search term?
      String realSearchSender = resolve(getSenderSearch());
      if (!Utils.isEmpty(realSearchSender)) {
        // apply FROM
        if (connection != null) {
          connection.setSenderTerm(realSearchSender, isNotTermSenderSearch());
        } else {
          mailConn.setSenderTerm(realSearchSender, isNotTermSenderSearch());
        }
      }

      String realSearchReceipient = resolve(getRecipientSearch());
      if (!Utils.isEmpty(realSearchReceipient)) {
        // apply TO
        if (connection != null) {
          connection.setReceipientTerm(realSearchReceipient);
        } else {
          mailConn.setReceipientTerm(realSearchReceipient);
        }
      }
      String realSearchSubject = resolve(getSubjectSearch());
      if (!Utils.isEmpty(realSearchSubject)) {
        // apply Subject
        if (connection != null) {
          connection.setSubjectTerm(realSearchSubject, isNotTermSubjectSearch());
        } else {
          mailConn.setSubjectTerm(realSearchSubject, isNotTermSubjectSearch());
        }
      }

      String realSearchBody = resolve(getBodySearch());
      if (!Utils.isEmpty(realSearchBody)) {
        // apply body
        if (connection != null) {
          connection.setBodyTerm(realSearchBody, isNotTermBodySearch());
        } else {
          mailConn.setBodyTerm(realSearchBody, isNotTermBodySearch());
        }
      }

      // Received Date
      if (connection != null) {
        switch (getConditionReceivedDate()) {
          case MailServerConnection.CONDITION_DATE_EQUAL:
            connection.setReceivedDateTermEQ(beginDate);
            break;
          case MailServerConnection.CONDITION_DATE_GREATER:
            connection.setReceivedDateTermGT(beginDate);
            break;
          case MailServerConnection.CONDITION_DATE_SMALLER:
            connection.setReceivedDateTermLT(beginDate);
            break;
          case MailServerConnection.CONDITION_DATE_BETWEEN:
            connection.setReceivedDateTermBetween(beginDate, endDate);
            break;
          default:
            break;
        }
      } else {
        switch (getConditionReceivedDate()) {
          case MailConnectionMeta.CONDITION_DATE_EQUAL:
            mailConn.setReceivedDateTermEQ(beginDate);
            break;
          case MailConnectionMeta.CONDITION_DATE_GREATER:
            mailConn.setReceivedDateTermGT(beginDate);
            break;
          case MailConnectionMeta.CONDITION_DATE_SMALLER:
            mailConn.setReceivedDateTermLT(beginDate);
            break;
          case MailConnectionMeta.CONDITION_DATE_BETWEEN:
            mailConn.setReceivedDateTermBetween(beginDate, endDate);
            break;
          default:
            break;
        }
      }
      // set FlagTerm?
      if (usePOP3) {
        // retrieve messages
        if (getRetrieveMails() == 1) {
          // New messages
          // POP doesn't support the concept of "new" messages!
          if (connection != null) {
            connection.setFlagTermUnread();
          } else {
            mailConn.setFlagTermUnread();
          }
        }
      } else {
        if (connection != null) {
          switch (getValueIMAPList()) {
            case MailServerConnection.VALUE_IMAP_LIST_NEW:
              connection.setFlagTermNew();
              break;
            case MailServerConnection.VALUE_IMAP_LIST_OLD:
              connection.setFlagTermOld();
              break;
            case MailServerConnection.VALUE_IMAP_LIST_READ:
              connection.setFlagTermRead();
              break;
            case MailServerConnection.VALUE_IMAP_LIST_UNREAD:
              connection.setFlagTermUnread();
              break;
            case MailServerConnection.VALUE_IMAP_LIST_FLAGGED:
              connection.setFlagTermFlagged();
              break;
            case MailServerConnection.VALUE_IMAP_LIST_NOT_FLAGGED:
              connection.setFlagTermNotFlagged();
              break;
            case MailServerConnection.VALUE_IMAP_LIST_DRAFT:
              connection.setFlagTermDraft();
              break;
            case MailServerConnection.VALUE_IMAP_LIST_NOT_DRAFT:
              connection.setFlagTermNotDraft();
              break;
            default:
              break;
          }
        } else {
          switch (getValueIMAPList()) {
            case MailConnectionMeta.VALUE_IMAP_LIST_NEW:
              mailConn.setFlagTermNew();
              break;
            case MailConnectionMeta.VALUE_IMAP_LIST_OLD:
              mailConn.setFlagTermOld();
              break;
            case MailConnectionMeta.VALUE_IMAP_LIST_READ:
              mailConn.setFlagTermRead();
              break;
            case MailConnectionMeta.VALUE_IMAP_LIST_UNREAD:
              mailConn.setFlagTermUnread();
              break;
            case MailConnectionMeta.VALUE_IMAP_LIST_FLAGGED:
              mailConn.setFlagTermFlagged();
              break;
            case MailConnectionMeta.VALUE_IMAP_LIST_NOT_FLAGGED:
              mailConn.setFlagTermNotFlagged();
              break;
            case MailConnectionMeta.VALUE_IMAP_LIST_DRAFT:
              mailConn.setFlagTermDraft();
              break;
            case MailConnectionMeta.VALUE_IMAP_LIST_NOT_DRAFT:
              mailConn.setFlagTermNotDraft();
              break;
            default:
              break;
          }
        }
      }
      // open folder and retrieve messages
      fetchOneFolder(
          usePOP3,
          realIMAPFolder,
          realOutputFolder,
          targetAttachmentFolder,
          realMoveToIMAPFolder,
          realFilenamePattern,
          nbrmailtoretrieve,
          df);

      if (isIncludeSubFolders()) {
        // Fetch also sub folders?
        if (isDebug()) {
          logDebug(BaseMessages.getString(PKG, "ActionGetPOP.FetchingSubFolders"));
        }
        String[] subfolders = null;
        if (connection != null) {
          subfolders = connection.returnAllFolders();
        } else {
          subfolders = mailConn.returnAllFolders();
        }
        if (subfolders.length == 0) {
          if (isDebug()) {
            logDebug(BaseMessages.getString(PKG, "ActionGetPOP.NoSubFolders"));
          }
        } else {
          for (int i = 0; i < subfolders.length; i++) {
            fetchOneFolder(
                usePOP3,
                subfolders[i],
                realOutputFolder,
                targetAttachmentFolder,
                realMoveToIMAPFolder,
                realFilenamePattern,
                nbrmailtoretrieve,
                df);
          }
        }
      }

      result.setResult(true);
      if (connection != null) {
        result.setNrFilesRetrieved(connection.getSavedAttachedFilesCounter());
        result.setNrLinesWritten(connection.getSavedMessagesCounter());
        result.setNrLinesDeleted(connection.getDeletedMessagesCounter());
        result.setNrLinesUpdated(connection.getMovedMessagesCounter());
      } else {
        result.setNrFilesRetrieved(mailConn.getSavedAttachedFilesCounter());
        result.setNrLinesWritten(mailConn.getSavedMessagesCounter());
        result.setNrLinesDeleted(mailConn.getDeletedMessagesCounter());
        result.setNrLinesUpdated(mailConn.getMovedMessagesCounter());
      }

      if (isDetailed()) {
        logDetailed("=======================================");
        logDetailed(
            BaseMessages.getString(
                PKG, "ActionGetPOP.Log.Info.SavedMessages", "" + result.getNrLinesWritten()));
        logDetailed(
            BaseMessages.getString(
                PKG, "ActionGetPOP.Log.Info.DeletedMessages", "" + result.getNrLinesDeleted()));
        logDetailed(
            BaseMessages.getString(
                PKG, "ActionGetPOP.Log.Info.MovedMessages", "" + result.getNrLinesUpdated()));

        if (((connection != null && getActionType() == MailServerConnection.ACTION_TYPE_GET)
                || (connection == null && getActionType() == MailConnectionMeta.ACTION_TYPE_GET))
            && isSaveAttachment()) {
          logDetailed(
              BaseMessages.getString(
                  PKG,
                  "ActionGetPOP.Log.Info.AttachedMessagesSuccess",
                  "" + result.getNrFilesRetrieved()));
        }
        logDetailed("=======================================");
      }
    } catch (Exception e) {
      result.setNrErrors(1);
      logError("Unexpected error: " + e.getMessage());
      logError(Const.getStackTracker(e));
    } finally {
      try {
        if (connection != null) {
          connection.disconnect();
          connection = null;
        } else {
          if (mailConn != null) {
            mailConn.disconnect();
            mailConn = null;
          }
        }
      } catch (Exception e) {
        /* Ignore */
      }
    }

    return result;
  }