private void harvestPortfolio() {
    final int collectionId = 5;

    RFHarvesterState.updateConfiguration("Portfolio");
    if (RFHarvesterState.checkRunningStatus() != 1) {
      RFHarvesterState.updateStatus("ERREUR!!!");
      RFHarvesterState.updateMessage(
          "Impossible de lancer une moissons tant que l'historique contient des moissons ayant le statut: 'En cours'");
      System.exit(ExitCodes.EX_NOPERM.value());
    }

    final ArrayList<RFHarvesterUploaderInterface> uploadsList =
        new ArrayList<RFHarvesterUploaderInterface>();
    final RFHarvesterDownloaderInterface DI = new PortfolioDownloader(collectionId);
    //		long downloadMillis = 0;
    //		try
    //		{
    //			Date downloadDate = RFHarvesterDatation.DataToDate(2015, 2, 1);
    //			//downloadDate = RFHarvesterDatation.DataToDate(2015, 5, 4);
    //			downloadMillis = downloadDate.getTime();
    //		}
    //		catch(ParseException e)
    //		{
    //			e.printStackTrace();
    //			System.exit(0); // Program won't run with parsing error
    //		}

    final RFHarvesterUploaderInterface controlsMySQLUploader =
        new UploadControlsMySQL(collectionId);
    uploadsList.add(controlsMySQLUploader);
    final RFHarvesterUploaderInterface metadatasMySQLUploader =
        new UploadMetadatasMySQL(collectionId);
    uploadsList.add(metadatasMySQLUploader);
    final RFHarvesterUploaderInterface portfoliodatasMySQLUploader =
        new UploadPortfolioDatasMySQL(collectionId);
    uploadsList.add(portfoliodatasMySQLUploader);
    final RFHarvesterUploaderInterface volumesMySQLUploader = new UploadVolumesMySQL(collectionId);
    uploadsList.add(volumesMySQLUploader);
    final RFHarvesterUploaderInterface collectionsMySQLUploader =
        new UploadCollectionsMySQL(collectionId);
    uploadsList.add(collectionsMySQLUploader);

    final RFHarvesterUploaderInterface noticesSOLR6Uploader = new UploadNoticesSolr5(collectionId);
    uploadsList.add(noticesSOLR6Uploader);

    RFHarvesterLogger.info("Begin initialisation phase");
    ExecutorService es = Executors.newCachedThreadPool();
    for (final RFHarvesterUploaderInterface UI : uploadsList)
      es.execute(
          new Runnable() {
            public void run() {
              UI.initTable();
            }
          });

    es.shutdown();
    try {
      while (!es.awaitTermination(10, TimeUnit.SECONDS)) ;
    } catch (InterruptedException e) {
      e.printStackTrace();
      System.exit(0);
    }

    final long usedDownloadMillis = 0;
    RFHarvesterLogger.info("Begin backup/downloading phase");
    es = Executors.newCachedThreadPool();
    //		for(final RFHarvesterUploaderInterface UI : uploadsList)
    //			es.execute(new Runnable()
    //			{
    //				public void run()
    //				{
    //					UI.copyIntoOld();
    //				}
    //			});
    es.execute(
        new Runnable() {
          public void run() {
            try {
              DI.download(uploadsList, usedDownloadMillis);
            } catch (Exception e) {
              e.printStackTrace();
              System.exit(0);
            }
          }
        });

    es.shutdown();
    try {
      while (!es.awaitTermination(10, TimeUnit.SECONDS)) ;
    } catch (InterruptedException e) {
      e.printStackTrace();
      System.exit(0);
    }

    RFHarvesterLogger.info("Begin merging phase");
    es = Executors.newCachedThreadPool();

    controlsMySQLUploader.mergeOldTable();
    //		noticesSOLRUploader.mergeOldTable();
    //		noticesSOLR1Uploader.mergeOldTable();
    noticesSOLR6Uploader.mergeOldTable();
    metadatasMySQLUploader.mergeOldTable();
    volumesMySQLUploader.mergeOldTable();
    portfoliodatasMySQLUploader.mergeOldTable();
    collectionsMySQLUploader.mergeOldTable();

    RFHarvesterLogger.info("Begin replacement phase");
    es = Executors.newCachedThreadPool();
    //		es.execute(new Runnable()
    //		{
    //			public void run()
    //			{
    //				noticesSOLRUploader.replaceOldTable();
    //			}
    //		});
    //		es.execute(new Runnable()
    //		{
    //			public void run()
    //			{
    //				noticesSOLR1Uploader.replaceOldTable();
    //			}
    //		});
    es.execute(
        new Runnable() {
          public void run() {
            noticesSOLR6Uploader.replaceOldTable();
          }
        });
    es.shutdown();
    try {
      while (!es.awaitTermination(1, TimeUnit.SECONDS)) ;
    } catch (InterruptedException e) {
      e.printStackTrace();
      System.exit(0);
    }

    es = Executors.newCachedThreadPool();
    es.execute(
        new Runnable() {
          public void run() {
            controlsMySQLUploader.replaceOldTable();
          }
        });
    es.execute(
        new Runnable() {
          public void run() {
            metadatasMySQLUploader.replaceOldTable();
          }
        });
    es.execute(
        new Runnable() {
          public void run() {
            portfoliodatasMySQLUploader.replaceOldTable();
          }
        });
    es.execute(
        new Runnable() {
          public void run() {
            volumesMySQLUploader.replaceOldTable();
          }
        });
    es.execute(
        new Runnable() {
          public void run() {
            collectionsMySQLUploader.replaceOldTable();
          }
        });
    es.shutdown();
    try {
      while (!es.awaitTermination(1, TimeUnit.SECONDS)) ;
    } catch (InterruptedException e) {
      e.printStackTrace();
      System.exit(0);
    }
  }
  /**
   * Starting point
   *
   * @param args
   */
  public static void main(String args[]) {
    System.out.println("Program initialisation");

    // Initializing Logs
    final long startTime = System.currentTimeMillis();

    System.out.println("Initializing logs");

    String logDirectory = "./log";
    String allLogFileName = "all.log";
    String infoLogFileName = "info.log";
    String warningLogFileName = "warning.log";
    String errorLogFileName = "error.log";
    String debugLogFileName = "debug.log";
    String harvesterLogFileName = "log/harvester.log";

    File logdir = new File(logDirectory);
    logdir.mkdir();
    File allFile = new File(logDirectory + "/" + allLogFileName);
    File infoFile = new File(logDirectory + "/" + infoLogFileName);
    File warningFile = new File(logDirectory + "/" + warningLogFileName);
    File errorFile = new File(logDirectory + "/" + errorLogFileName);
    File debugFile = new File(logDirectory + "/" + debugLogFileName);
    File harvesterFile = new File(harvesterLogFileName);

    allFile.delete();
    infoFile.delete();
    warningFile.delete();
    errorFile.delete();
    debugFile.delete();

    // Set loggers outputs
    try {
      FileOutputStream allFileOutputStream = new FileOutputStream(allFile, true);
      FileOutputStream harvesterFileOutputStream = new FileOutputStream(harvesterFile, true);
      FileOutputStream infoFileOutputStream = new FileOutputStream(infoFile, true);
      FileOutputStream warningFileOutputStream = new FileOutputStream(warningFile, true);
      FileOutputStream errorFileOutputStream = new FileOutputStream(errorFile, true);
      FileOutputStream debugFileOutputStream = new FileOutputStream(debugFile, true);
      RFHarvesterLogger.setInfoLog(
          new TeeOutputStream(
              System.out,
              new TeeOutputStream(
                  harvesterFileOutputStream,
                  new TeeOutputStream(allFileOutputStream, infoFileOutputStream))));
      RFHarvesterLogger.setWarningLog(
          new TeeOutputStream(
              System.out,
              new TeeOutputStream(
                  harvesterFileOutputStream,
                  new TeeOutputStream(allFileOutputStream, warningFileOutputStream))));
      RFHarvesterLogger.setErrorLog(
          new TeeOutputStream(
              System.out,
              new TeeOutputStream(
                  harvesterFileOutputStream,
                  new TeeOutputStream(allFileOutputStream, errorFileOutputStream))));
      RFHarvesterLogger.setDebugLog(
          new TeeOutputStream(
              System.out,
              new TeeOutputStream(
                  harvesterFileOutputStream,
                  new TeeOutputStream(allFileOutputStream, debugFileOutputStream))));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
      System.exit(
          ExitCodes.EX_CANTCREAT.value()); // Program won't run without correctly set loggers.
    }

    RFHarvesterLogger.setDatation(true);
    RFHarvesterLogger.info("Logs correctly initialized");

    RFHarvesterState.begin();

    Runtime.getRuntime()
        .addShutdownHook(
            new Thread() {
              @Override
              public void run() {
                if (RFHarvesterState.checkRunningStatus() > 0) {
                  RFHarvesterState.updateStatus("Interrompue");
                  RFHarvesterState.updateMessage("Moisson interrompue.");
                }
                RFHarvesterState.endStatus();
                long endTime = System.currentTimeMillis();
                RFHarvesterLogger.info(
                    "Program ended at:   " + RFHarvesterDatation.getDateHour(endTime));
                RFHarvesterLogger.info(
                    "Program Total duration : "
                        + RFHarvesterDatation.duration(endTime - startTime));
                RFHarvesterLogger.info(
                    "------------------------------------------------------------------------------------------------------------------------");
                RFHarvesterLogger.debug(
                    "------------------------------------------------------------------------------------------------------------------------");
                RFHarvesterLogger.warning(
                    "------------------------------------------------------------------------------------------------------------------------");
                RFHarvesterLogger.error(
                    "------------------------------------------------------------------------------------------------------------------------");
              }
            });

    RFHarvesterLogger.info("Program started at: " + RFHarvesterDatation.getDateHour(startTime));

    MainClass program = new MainClass();
    ArrayList<String> arguments = new ArrayList<String>(Arrays.asList(args));

    int flags = 0b00000000000000000000000000000000;
    final int harvestFlag = 0b00000000000000000000000000000001;
    final int harvestParameter = 0b00000000000000000000000000000100;

    for (String arg : arguments) {
      RFHarvesterLogger.debug(arg);
      String[] argWithValues = arg.split("=");
      switch (argWithValues[0]) {
        case "--harvest":
          flags |= harvestFlag;
          if (argWithValues.length > 1) flags |= harvestParameter;
          break;
          // NEW WAY TO RUN CONFIGURATION, OTHER ONES ARE DEPRECATED
        case "--configuration":
          int exitCode = ExitCodes.EX_OK.value();
          if (argWithValues.length <= 1) {
            RFHarvesterLogger.error("ERROR: Missing configuration value.");
            RFHarvesterState.updateStatus("ERREUR!!!");
            RFHarvesterState.updateMessage("Missing configuration value.");
            exitCode = ExitCodes.EX_USAGE.value();
          } else {
            try {
              RFHarvesterState.updateConfiguration("ID: " + argWithValues[1]);
              program.runConfiguration(argWithValues[1]);
              RFHarvesterState.updateStatus("Terminée");
            } catch (Exception e) {
              String exceptionMessage = RFHarvesterLogger.exceptionToString(e);
              RFHarvesterLogger.error("FATAL ERROR!!!" + exceptionMessage);
              RFHarvesterState.updateStatus("ERREUR!!!");
              RFHarvesterState.updateMessage(exceptionMessage.split("\n")[1].trim());
              exitCode = ExitCodes.EX_SOFTWARE.value();
            }
          }
          System.exit(exitCode);
          break;

        case "--info":
        case "--list-properties":
        case "--version":
          break;
        default:
          System.out.println("Unknown property: " + argWithValues[0]);
          System.exit(ExitCodes.EX_USAGE.value());
          break;
      }
    }
    if (((flags & harvestFlag) != harvestFlag)) {
      System.out.println("Missing mandatory property --harvest");
      System.exit(ExitCodes.EX_USAGE.value());
    } else if ((flags & harvestParameter) != harvestParameter) {
      System.out.println("Property --harvest have no defined value");
      System.exit(ExitCodes.EX_USAGE.value());
    }

    String harvest = null;
    for (String arg : arguments) {
      String[] argWithValues = arg.split("=");
      switch (argWithValues[0]) {
        case "--list-properties":
          System.getProperties().list(System.out);
          break;
        case "--restore":
          if (argWithValues.length > 2) {
            System.out.println("Property --harvest wrongly defined: " + arg.substring(10));
            System.exit(ExitCodes.EX_USAGE.value());
          }
          harvest = argWithValues[1];
          break;
        case "--harvest":
          if (argWithValues.length > 2) {
            System.out.println("Property --harvest wrongly defined: " + arg.substring(10));
            System.exit(ExitCodes.EX_USAGE.value());
          }
          harvest = argWithValues[1];
          break;
        default:
          break;
      }
    }

    if (((flags & harvestFlag) == harvestFlag)) {
      switch (harvest) {
        case "portfolio":
          program.harvestPortfolio();
          RFHarvesterState.updateStatus("Terminée");
          break;
        case "authorities":
          program.harvestAuthorities();
          RFHarvesterState.updateStatus("Terminée");
          break;
        default:
          RFHarvesterLogger.error("Unrecognized harvesting value: " + harvest);
          break;
      }
    }
  }