BerichtstatusRapport.java

/*
 * Copyright (C) 2017 B3Partners B.V.
 */
package nl.b3p.brmo.service.scanner;

import static nl.b3p.brmo.persistence.staging.AutomatischProces.ProcessingStatus.PROCESSING;
import static nl.b3p.brmo.persistence.staging.AutomatischProces.ProcessingStatus.WAITING;

import java.util.Calendar;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.Transient;
import nl.b3p.brmo.loader.BrmoFramework;
import nl.b3p.brmo.loader.entity.Bericht;
import nl.b3p.brmo.loader.util.BrmoException;
import nl.b3p.brmo.persistence.staging.AutomatischProces;
import nl.b3p.brmo.persistence.staging.BerichtstatusRapportProces;
import nl.b3p.brmo.service.util.ConfigUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.stripesstuff.stripersist.Stripersist;

/**
 * @author mprins
 */
public class BerichtstatusRapport extends AbstractExecutableProces {

  private static final Log LOG = LogFactory.getLog(MailRapportage.class);
  private BerichtstatusRapportProces config;
  @Transient private ProgressUpdateListener listener;

  public BerichtstatusRapport(BerichtstatusRapportProces config) {
    this.config = config;
  }

  @Override
  public void execute() throws BrmoException {
    this.execute(
        new ProgressUpdateListener() {
          @Override
          public void total(long total) {}

          @Override
          public void progress(long progress) {}

          @Override
          public void exception(Throwable t) {
            LOG.error(t);
          }

          @Override
          public void updateStatus(String status) {}

          @Override
          public void addLog(String log) {}
        });
  }

  @Override
  public void execute(ProgressUpdateListener listener) {
    EntityManager em = Stripersist.getEntityManager();

    this.listener = listener;
    config.setStatus(PROCESSING);
    config.setLastrun(new Date());
    em.merge(config);
    em.flush();

    StringBuilder sb = new StringBuilder(AutomatischProces.LOG_NEWLINE);
    String oldLog = config.getLogfile();
    if (oldLog != null) {
      if (oldLog.length() > OLD_LOG_LENGTH) {
        sb.append(oldLog.substring(oldLog.length() - OLD_LOG_LENGTH / 10));
      } else {
        sb.append(oldLog).append(AutomatischProces.LOG_NEWLINE);
      }
    }

    config.setStatus(PROCESSING);
    String msg =
        String.format(
            "De Berichtstatus Rapportage met ID %d is gestart op %tc.",
            config.getId(), Calendar.getInstance());
    LOG.info(msg);
    listener.updateStatus(msg);
    listener.addLog(msg);
    sb.append(msg).append(AutomatischProces.LOG_NEWLINE);
    this.active = true;

    LOG.info("Ophalen bericht status informatie.");
    BrmoFramework brmo = null;
    long aantal = -1L;
    StringBuilder samenvatting = new StringBuilder("Berichtstatus overzicht");
    samenvatting.append(AutomatischProces.LOG_NEWLINE);
    try {
      brmo = new BrmoFramework(ConfigUtil.getDataSourceStaging(), null, null);
      for (Bericht.STATUS status : Bericht.STATUS.values()) {
        aantal = brmo.getCountBerichten(null, status.name());
        msg = String.format("Aantal berichten met status %s: %s.", status.name(), aantal);
        sb.append(msg).append(AutomatischProces.LOG_NEWLINE);
        samenvatting.append(msg).append(AutomatischProces.LOG_NEWLINE);
        LOG.info(msg);
        listener.updateStatus(msg);
        listener.addLog(msg);
      }
    } catch (BrmoException ex) {
      LOG.error(ex.getLocalizedMessage());
      listener.exception(ex);
      sb.append(ex.getLocalizedMessage()).append(AutomatischProces.LOG_NEWLINE);
    } finally {
      if (brmo != null) {
        brmo.closeBrmoFramework();
      }
    }
    msg =
        String.format(
            "De Berichtstatus Rapportage met ID %d is afgerond op %tc.",
            config.getId(), Calendar.getInstance());
    LOG.info(msg);
    listener.updateStatus(msg);
    listener.addLog(msg);
    sb.append(msg).append(AutomatischProces.LOG_NEWLINE);
    config.setSamenvatting(samenvatting.toString());
    config.setStatus(WAITING);
    config.setLastrun(new Date());
    config.setLogfile(sb.toString());
  }
}