BAG2MutatieProcesRunner.java

  1. /*
  2.  * Copyright (C) 2021 B3Partners B.V.
  3.  *
  4.  * SPDX-License-Identifier: MIT
  5.  *
  6.  */

  7. package nl.b3p.brmo.service.scanner;

  8. import static nl.b3p.brmo.persistence.staging.AutomatischProces.ProcessingStatus.ERROR;
  9. import static nl.b3p.brmo.persistence.staging.AutomatischProces.ProcessingStatus.PROCESSING;
  10. import static nl.b3p.brmo.persistence.staging.AutomatischProces.ProcessingStatus.WAITING;

  11. import java.sql.Connection;
  12. import java.sql.SQLException;
  13. import java.util.Date;
  14. import javax.persistence.Transient;
  15. import nl.b3p.brmo.bag2.loader.BAG2Database;
  16. import nl.b3p.brmo.bag2.loader.cli.BAG2DatabaseOptions;
  17. import nl.b3p.brmo.bag2.loader.cli.BAG2LoadOptions;
  18. import nl.b3p.brmo.bag2.loader.cli.BAG2LoaderMain;
  19. import nl.b3p.brmo.bag2.loader.cli.BAG2MutatiesCommand;
  20. import nl.b3p.brmo.bag2.loader.cli.BAG2ProgressOptions;
  21. import nl.b3p.brmo.bgt.loader.ProgressReporter;
  22. import nl.b3p.brmo.loader.util.BrmoException;
  23. import nl.b3p.brmo.persistence.staging.BAG2MutatieProces;
  24. import nl.b3p.brmo.persistence.staging.ClobElement;
  25. import nl.b3p.brmo.service.util.ConfigUtil;
  26. import nl.b3p.jdbc.util.converter.PGConnectionUnwrapper;
  27. import org.apache.commons.logging.Log;
  28. import org.apache.commons.logging.LogFactory;
  29. import org.stripesstuff.stripersist.Stripersist;

  30. public class BAG2MutatieProcesRunner extends AbstractExecutableProces {
  31.   private static final Log LOG = LogFactory.getLog(BAG2MutatieProcesRunner.class);
  32.   private final BAG2MutatieProces config;

  33.   @Transient private ProgressUpdateListener listener;

  34.   public BAG2MutatieProcesRunner(BAG2MutatieProces config) {
  35.     this.config = config;
  36.   }

  37.   /**
  38.    * Voert deze taak eenmalig uit.
  39.    *
  40.    * @throws BrmoException als er een fout optreed in het uitvoeren van het proces.
  41.    */
  42.   @Override
  43.   public void execute() throws BrmoException {
  44.     this.execute(
  45.         new ProgressUpdateListener() {
  46.           @Override
  47.           public void total(long total) {}

  48.           @Override
  49.           public void progress(long progress) {}

  50.           @Override
  51.           public void exception(Throwable t) {
  52.             LOG.error(t);
  53.           }

  54.           @Override
  55.           public void updateStatus(String status) {}

  56.           @Override
  57.           public void addLog(String log) {
  58.             LOG.info(log);
  59.             config.updateSamenvattingEnLogfile(log);
  60.             Stripersist.getEntityManager().merge(config);
  61.           }
  62.         });
  63.   }

  64.   /**
  65.    * Voert de taak uit en rapporteert de voortgang.
  66.    *
  67.    * @param listener voortgangs listener
  68.    */
  69.   @Override
  70.   public void execute(ProgressUpdateListener listener) {
  71.     this.listener = listener;
  72.     BAG2LoaderMain.configureLogging(false);
  73.     listener.addLog(String.format("Het BAG2 mutatie proces is gestart op %tc.", new Date()));
  74.     if (config.getStatus().equals(WAITING) || config.getStatus().equals(ERROR)) {
  75.       if (config.getStatus().equals(ERROR)) {
  76.         listener.addLog("Vorige run is met ERROR status afgerond, opnieuw proberen");
  77.       }

  78.       int exitCode = -1;
  79.       BAG2Database bag2Database;
  80.       try (Connection rsgbbagConnection = ConfigUtil.getDataSourceRsgbBag().getConnection()) {

  81.         BAG2DatabaseOptions databaseOptions = new BAG2DatabaseOptions();
  82.         // Niet nodig (rsgbbagConnection wordt gebruikt), maar voor de duidelijkheid
  83.         databaseOptions.setConnectionString(rsgbbagConnection.getMetaData().getURL());
  84.         Connection connection = rsgbbagConnection;
  85.         if (databaseOptions.getConnectionString().startsWith("jdbc:postgresql:")) {
  86.           // Voor gebruik van pgCopy is unwrappen van de connectie nodig.
  87.           // Ook al doet PostGISCopyInsertBatch zelf ook een unwrap, de
  88.           // PGConnectionUnwrapper kan ook Tomcat JNDI
  89.           // connection pool unwrapping aan welke niet met een normale Connection.unwrap()
  90.           // werkt.
  91.           connection = (Connection) PGConnectionUnwrapper.unwrap(rsgbbagConnection);
  92.           databaseOptions.setUsePgCopy(true);
  93.         }
  94.         bag2Database =
  95.             new BAG2Database(databaseOptions, connection) {
  96.               /** connectie niet sluiten; dat doen we later als we helemaal klaar zijn */
  97.               @Override
  98.               public void close() {
  99.                 LOG.debug("Had de BAG2 databaseconnectie kunnen sluiten... maar niet gedaan.");
  100.               }
  101.             };

  102.         BAG2LoaderMain main = new BAG2LoaderMain();
  103.         main.setBag2Database(bag2Database);
  104.         BAG2MutatiesCommand mutatiesCommand = new BAG2MutatiesCommand();
  105.         mutatiesCommand.setParent(main);

  106.         // Use defaults
  107.         BAG2LoadOptions loadOptions = new BAG2LoadOptions();
  108.         loadOptions.setGeoFilter(ClobElement.nullSafeGet(config.getConfig().get("geo-filter")));
  109.         BAG2DatabaseOptions dbOptions = new BAG2DatabaseOptions();

  110.         listener.updateStatus(PROCESSING.toString());
  111.         config.setStatus(PROCESSING);
  112.         Stripersist.getEntityManager().merge(config);
  113.         Stripersist.getEntityManager().flush();

  114.         String mode = ClobElement.nullSafeGet(config.getConfig().get("mode"));
  115.         String directory = ClobElement.nullSafeGet(config.getConfig().get("directory"));
  116.         String url = ClobElement.nullSafeGet(config.getConfig().get("url"));
  117.         String kadasterUser = ClobElement.nullSafeGet(config.getConfig().get("kadaster-username"));
  118.         String kadasterPassword =
  119.             ClobElement.nullSafeGet(config.getConfig().get("kadaster-password"));
  120.         String queryParams = ClobElement.nullSafeGet(config.getConfig().get("query"));

  121.         if (!mode.equals("applyFromMirror")) {
  122.           // Let op, zet URL naar die van BAG Bestanden, niet de default publieke mirror
  123.           // voor applyFromMirror modus
  124.           // (alhoewel downloaden/verwerken van de mirror en op andere computer 'load'
  125.           // modus ook zou kunnen, maar dan
  126.           // moet de default value voor de 'url' config niet ingevuld worden als nu)
  127.           url = BAG2MutatiesCommand.LVBAG_BESTANDEN_API_URL;
  128.         }
  129.         if (queryParams == null || queryParams.trim().isEmpty()) {
  130.           // Defaultwaarde voor dagmutaties, anders krijg je ook standen er bij...
  131.           queryParams = "artikelnummers=2529";
  132.         }
  133.         final BAG2ProgressOptions progress = new BAG2ProgressOptions();
  134.         progress.setCustomProgressReporter(
  135.             new ProgressReporter() {
  136.               @Override
  137.               protected void log(String msg) {
  138.                 listener.addLog(msg);
  139.               }

  140.               @Override
  141.               protected void status(String msg) {
  142.                 listener.updateStatus(msg);
  143.               }
  144.             });

  145.         switch (mode) {
  146.           case "applyFromMirror":
  147.             listener.updateStatus("Verwerken van BAG2 mutatiebestanden...");
  148.             listener.addLog(
  149.                 String.format(
  150.                     "Verwerken van BAG2 mutatiebestanden van publieke mirror \"%s\"", url));
  151.             exitCode =
  152.                 mutatiesCommand.apply(
  153.                     dbOptions, progress, loadOptions, null, null, url, queryParams, false);
  154.             listener.addLog("Einde verwerken BAG2 bestanden");
  155.             break;
  156.           case "apply":
  157.             listener.updateStatus("Verwerken van BAG2 mutatiebestanden...");
  158.             listener.addLog(
  159.                 String.format(
  160.                     "Verwerken van BAG2 mutatiebestanden van BAG Bestanden, gebruikersnaam %s",
  161.                     kadasterUser));
  162.             exitCode =
  163.                 mutatiesCommand.apply(
  164.                     dbOptions,
  165.                     progress,
  166.                     loadOptions,
  167.                     kadasterUser,
  168.                     kadasterPassword,
  169.                     url,
  170.                     queryParams,
  171.                     false);
  172.             listener.addLog("Einde verwerken BAG2 bestanden");
  173.             break;
  174.           case "download":
  175.             listener.updateStatus("Downloaden van BAG2 mutatiebestanden...");
  176.             listener.addLog(
  177.                 String.format(
  178.                     "Downloaden van BAG2 mutatiebestanden naar directory %s, gebruikersnaam %s",
  179.                     directory, kadasterUser));
  180.             exitCode =
  181.                 mutatiesCommand.download(
  182.                     false, kadasterUser, kadasterPassword, url, queryParams, directory, "", false);
  183.             listener.addLog("Einde downloaden BAG2 bestanden");
  184.             break;
  185.           case "load":
  186.             listener.updateStatus("Laden van BAG2 bestanden...");
  187.             listener.addLog("Laden van BAG2 bestanden uit directory " + directory);
  188.             exitCode = main.load(dbOptions, loadOptions, progress, new String[] {directory}, false);
  189.             listener.addLog("Einde laden BAG2 bestanden");
  190.             break;
  191.         }
  192.       } catch (ClassNotFoundException e) {
  193.         LOG.error(e.getLocalizedMessage());
  194.         listener.exception(e);
  195.       } catch (BrmoException | SQLException e) {
  196.         LOG.error("Fout tijdens benaderen BAG2 database", e);
  197.         listener.exception(e);
  198.       } catch (Exception e) {
  199.         LOG.error("Fout tijdens BAG2 proces", e);
  200.         listener.exception(e);
  201.       } finally {
  202.         if (exitCode == 0) {
  203.           config.setStatus(WAITING);
  204.           config.setLastrun(new Date());

  205.           listener.updateStatus(WAITING.toString());
  206.         } else {
  207.           config.setStatus(ERROR);
  208.           config.setLastrun(new Date());
  209.           listener.updateStatus(ERROR.toString());
  210.         }
  211.         listener.addLog("BAG2 mutatieproces afgerond op " + new Date());
  212.         config.setLastrun(new Date());
  213.         Stripersist.getEntityManager().merge(config);
  214.         Stripersist.getEntityManager().flush();
  215.       }
  216.     }
  217.   }
  218. }