BerichtTransformatieUitvoeren.java

  1. /*
  2.  * Copyright (C) 2015 B3Partners B.V.
  3.  */
  4. package nl.b3p.brmo.service.scanner;

  5. import static nl.b3p.brmo.persistence.staging.AfgifteNummerScannerProces.MISSINGNUMBERSFOUND;
  6. import static nl.b3p.brmo.persistence.staging.AutomatischProces.ProcessingStatus.ERROR;
  7. import static nl.b3p.brmo.persistence.staging.AutomatischProces.ProcessingStatus.PROCESSING;
  8. import static nl.b3p.brmo.persistence.staging.AutomatischProces.ProcessingStatus.WAITING;

  9. import java.util.Calendar;
  10. import java.util.Date;
  11. import javax.sql.DataSource;
  12. import nl.b3p.brmo.loader.BrmoFramework;
  13. import nl.b3p.brmo.loader.util.BrmoException;
  14. import nl.b3p.brmo.persistence.staging.AutomatischProces;
  15. import nl.b3p.brmo.persistence.staging.BerichtTransformatieProces;
  16. import nl.b3p.brmo.service.util.ConfigUtil;
  17. import org.apache.commons.lang3.exception.ExceptionUtils;
  18. import org.apache.commons.logging.Log;
  19. import org.apache.commons.logging.LogFactory;
  20. import org.stripesstuff.stripersist.Stripersist;

  21. /**
  22.  * Transformatie van berichten in een automatisch proces gebruikmakend van BrmoFramework.
  23.  *
  24.  * @see nl.b3p.brmo.loader.BrmoFramework
  25.  * @author mprins
  26.  */
  27. public class BerichtTransformatieUitvoeren extends AbstractExecutableProces {

  28.   private static final Log log = LogFactory.getLog(BerichtTransformatieUitvoeren.class);

  29.   private final BerichtTransformatieProces config;

  30.   private ProgressUpdateListener l;

  31.   private boolean transformErrorOccured = false;

  32.   private long blockTransformIndicators;
  33.   private long statusMissingFound;

  34.   public BerichtTransformatieUitvoeren(BerichtTransformatieProces config) {
  35.     this.config = config;
  36.   }

  37.   @Override
  38.   public void execute() throws BrmoException {
  39.     this.execute(
  40.         new ProgressUpdateListener() {
  41.           @Override
  42.           public void total(long total) {}

  43.           @Override
  44.           public void progress(long progress) {}

  45.           @Override
  46.           public void exception(Throwable t) {
  47.             // afvangen van de fout conditie zodat de status van het proces goed kan
  48.             // worden gezet
  49.             transformErrorOccured = true;
  50.             log.error(t);
  51.           }

  52.           @Override
  53.           public void updateStatus(String status) {}

  54.           @Override
  55.           public void addLog(String log) {}
  56.         });
  57.   }

  58.   @Override
  59.   public void execute(ProgressUpdateListener listener) {
  60.     this.l = listener;
  61.     l.updateStatus("Initialiseren...");
  62.     l.addLog(String.format("Initialiseren... %tc", new Date()));
  63.     this.config.setStatus(PROCESSING);
  64.     this.config.setLastrun(new Date());
  65.     Stripersist.getEntityManager().merge(config);
  66.     Stripersist.getEntityManager().flush();

  67.     final StringBuilder sb = new StringBuilder(AutomatischProces.LOG_NEWLINE);
  68.     String oldLog = config.getLogfile();
  69.     if (oldLog != null) {
  70.       if (oldLog.length() > OLD_LOG_LENGTH) {
  71.         sb.append(oldLog.substring(oldLog.length() - OLD_LOG_LENGTH / 10));
  72.       } else {
  73.         sb.append(oldLog);
  74.       }
  75.     }

  76.     String msg =
  77.         String.format(
  78.             "Het bericht transformatie proces met ID %d is gestart op %tc.",
  79.             config.getId(), Calendar.getInstance());
  80.     log.info(msg);
  81.     l.addLog(msg);
  82.     sb.append(msg).append(AutomatischProces.LOG_NEWLINE);

  83.     if (this.config.getBlockOnMissingNumbers()
  84.         && (this.shouldBlockTransformationByChecks() && this.shouldBlockTransformationByStatus())) {
  85.       msg = "Er zijn " + blockTransformIndicators + " indicaties voor ontbrekende afgiftenummers";
  86.       log.warn(msg);
  87.       l.addLog(msg);
  88.       sb.append(msg).append(AutomatischProces.LOG_NEWLINE);
  89.       msg = "Er zijn " + statusMissingFound + " laadprocessen met status STAGING_MISSING";
  90.       log.warn(msg);
  91.       l.addLog(msg);
  92.       sb.append(msg).append(AutomatischProces.LOG_NEWLINE);
  93.       msg = "De automatische transformatie wordt niet gestart";
  94.       l.addLog(msg);
  95.       sb.append(msg).append(AutomatischProces.LOG_NEWLINE);
  96.       this.config.setSamenvatting(msg);
  97.       this.config.setLogfile(sb.toString());
  98.       this.config.setStatus(WAITING);
  99.     } else {
  100.       BrmoFramework brmo = null;
  101.       try {
  102.         DataSource dataSourceStaging = ConfigUtil.getDataSourceStaging();
  103.         DataSource dataSourceRsgb = ConfigUtil.getDataSourceRsgb();
  104.         DataSource dataSourceRsgbBrk = ConfigUtil.getDataSourceRsgbBrk();
  105.         brmo = new BrmoFramework(dataSourceStaging, dataSourceRsgb, dataSourceRsgbBrk);
  106.         brmo.setEnablePipeline(true);
  107.         brmo.setOrderBerichten(true);
  108.         brmo.setTransformPipelineCapacity(100);

  109.         Thread t =
  110.             brmo.toRsgb(
  111.                 new nl.b3p.brmo.loader.ProgressUpdateListener() {
  112.                   @Override
  113.                   public void total(long total) {
  114.                     sb.append("Totaal te transformeren: ")
  115.                         .append(total)
  116.                         .append(AutomatischProces.LOG_NEWLINE);
  117.                     l.total(total);
  118.                   }

  119.                   @Override
  120.                   public void progress(long progress) {
  121.                     l.progress(progress);
  122.                   }

  123.                   @Override
  124.                   public void exception(Throwable t) {
  125.                     sb.append("Fout tijdens transformeren: ")
  126.                         .append(t.getLocalizedMessage())
  127.                         .append(AutomatischProces.LOG_NEWLINE);
  128.                     l.exception(t);
  129.                   }
  130.                 });
  131.         t.join();

  132.         if (transformErrorOccured) {
  133.           this.config.setStatus(ERROR);
  134.           msg = "Handmatige transformatie vanuit de berichten pagina is noodzakelijk.";
  135.           sb.append(msg).append(AutomatischProces.LOG_NEWLINE);
  136.           log.warn(msg);
  137.           msg =
  138.               String.format(
  139.                   "Bericht transformatie proces met ID %d is niet succesvol afgerond op %tc.",
  140.                   config.getId(), Calendar.getInstance());
  141.           log.error(msg);
  142.         } else {
  143.           this.config.setStatus(WAITING);
  144.           msg =
  145.               String.format(
  146.                   "Bericht transformatie proces met ID %d is succesvol afgerond op %tc.",
  147.                   config.getId(), Calendar.getInstance());
  148.           log.info(msg);
  149.         }
  150.         sb.append(msg).append(AutomatischProces.LOG_NEWLINE);
  151.         l.addLog(msg);
  152.         this.config.setSamenvatting(msg);
  153.         this.config.setLogfile(sb.toString());
  154.       } catch (BrmoException | InterruptedException t) {
  155.         log.error("Fout bij transformeren berichten naar RSGB", t);
  156.         String m = "Fout bij transformeren berichten naar RSGB: " + ExceptionUtils.getMessage(t);
  157.         if (t.getCause() != null) {
  158.           m += ", oorzaak: " + ExceptionUtils.getRootCauseMessage(t);
  159.         }
  160.         this.config.setLogfile(sb.toString());
  161.         this.config.updateSamenvattingEnLogfile(m);
  162.         this.config.setStatus(ERROR);
  163.       } finally {
  164.         if (brmo != null) {
  165.           brmo.closeBrmoFramework();
  166.         }
  167.       }
  168.     }
  169.     Stripersist.getEntityManager().merge(this.config);
  170.     Stripersist.getEntityManager().flush();
  171.   }

  172.   private boolean shouldBlockTransformationByChecks() {
  173.     final String sql =
  174.         "select count(config_key) from automatisch_proces_config where config_key='"
  175.             + MISSINGNUMBERSFOUND
  176.             + "' and value = 'true' ";
  177.     Object o = Stripersist.getEntityManager().createNativeQuery(sql).getSingleResult();
  178.     blockTransformIndicators = ((Number) o).longValue();
  179.     return blockTransformIndicators > 0;
  180.   }

  181.   private boolean shouldBlockTransformationByStatus() {
  182.     final String sql = "select count(status) from laadproces where status = 'STAGING_MISSING'";
  183.     Object o = Stripersist.getEntityManager().createNativeQuery(sql).getSingleResult();
  184.     statusMissingFound = ((Number) o).longValue();
  185.     return statusMissingFound > 0;
  186.   }
  187. }