public boolean init(StepMetaInterface smi, StepDataInterface sdi) {
    meta = (SalesforceDeleteMeta) smi;
    data = (SalesforceDeleteData) sdi;

    if (super.init(smi, sdi)) {

      try {
        data.realModule = environmentSubstitute(meta.getModule());
        // Check if module is specified
        if (Const.isEmpty(data.realModule)) {
          log.logError(
              BaseMessages.getString(PKG, "SalesforceDeleteDialog.ModuleMissing.DialogMessage"));
          return false;
        }

        String realUser = environmentSubstitute(meta.getUserName());
        // Check if username is specified
        if (Const.isEmpty(realUser)) {
          log.logError(
              BaseMessages.getString(PKG, "SalesforceDeleteDialog.UsernameMissing.DialogMessage"));
          return false;
        }

        // initialize variables
        data.realURL = environmentSubstitute(meta.getTargetURL());
        // create a Salesforce connection
        data.connection =
            new SalesforceConnection(
                log, data.realURL, realUser, environmentSubstitute(meta.getPassword()));
        // set timeout
        data.connection.setTimeOut(Const.toInt(environmentSubstitute(meta.getTimeOut()), 0));
        // Do we use compression?
        data.connection.setUsingCompression(meta.isUsingCompression());
        // Do we rollback all changes on error
        data.connection.rollbackAllChangesOnError(meta.isRollbackAllChangesOnError());

        // Now connect ...
        data.connection.connect();

        return true;
      } catch (KettleException ke) {
        logError(
            BaseMessages.getString(PKG, "SalesforceDelete.Log.ErrorOccurredDuringStepInitialize")
                + ke.getMessage()); // $NON-NLS-1$
      }
      return true;
    }
    return false;
  }