TopNLRsgbTransformer.java

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

import static nl.b3p.brmo.loader.entity.LaadProces.STATUS;

import java.io.File;
import java.net.MalformedURLException;
import java.sql.SQLException;
import javax.sql.DataSource;
import javax.xml.bind.JAXBException;
import nl.b3p.brmo.loader.ProgressUpdateListener;
import nl.b3p.brmo.loader.StagingProxy;
import nl.b3p.brmo.loader.entity.LaadProces;
import nl.b3p.topnl.Processor;
import nl.b3p.topnl.TopNLType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdom2.JDOMException;

/**
 * @author Meine Toonen
 */
public class TopNLRsgbTransformer implements Runnable {

  private static final Log LOG = LogFactory.getLog(TopNLRsgbTransformer.class);
  private final StagingProxy stagingProxy;
  private final DataSource dataSourceTopNL;
  private final ProgressUpdateListener listener;
  private final long[] lpIDs;
  private Processor processor = null;

  public TopNLRsgbTransformer(
      DataSource dataSourceTopNL,
      StagingProxy stagingProxy,
      long[] lpIDs,
      ProgressUpdateListener listener)
      throws JAXBException, SQLException {
    this.stagingProxy = stagingProxy;
    this.dataSourceTopNL = dataSourceTopNL;
    this.lpIDs = lpIDs;
    this.listener = listener;
    this.processor = new Processor(this.dataSourceTopNL);
  }

  private void transform(long lpID) throws SQLException {
    STATUS status;
    String opmerkingen;
    LaadProces lp = stagingProxy.getLaadProcesById(lpID);

    if (TopNLType.isTopNLType(lp.getSoort()) && lp.getStatus() == STATUS.STAGING_OK) {
      stagingProxy.updateLaadProcesStatus(lp, STATUS.RSGB_TOPNL_WAITING, "Transformatie loopt...");
      File gml = new File(lp.getBestandNaam());
      try {
        processor.importIntoDb(gml.toURI().toURL(), TopNLType.valueOf(lp.getSoort().toUpperCase()));
        switch (processor.getStatus()) {
          case OK:
            status = STATUS.RSGB_TOPNL_OK;
            opmerkingen = "Geen fouten bij inladen.";
            break;
          case NOK:
          default:
            status = STATUS.RSGB_TOPNL_NOK;
            opmerkingen =
                "Er zijn herstelbare fouten bij inladen opgetreden. Waarschijnlijk is niet alle data geladen van bestand "
                    + gml;
        }
        stagingProxy.updateLaadProcesStatus(lp, status, opmerkingen);
      } catch (JDOMException | MalformedURLException ex) {
        LOG.debug("Error loading gml file", ex);
        opmerkingen = "Laden van bestand " + gml + " is mislukt: " + ex.getLocalizedMessage();
        status = STATUS.RSGB_TOPNL_NOK;
        stagingProxy.updateLaadProcesStatus(lp, status, opmerkingen);
      }
    } else {
      LOG.warn(
          "LaadProces "
              + lp.getId()
              + " van soort "
              + lp.getSoort()
              + " met status: "
              + lp.getStatus()
              + " is overgeslagen.");
    }
  }

  public void init() throws SQLException {
    /* geomjdbc = GeometryJdbcConverterFactory.getGeometryJdbcConverter(dataSourceTopNL.getConnection());

    params.put("jndiReferenceName", "java:comp/env/jdbc/brmo/topnl");
    params.put("dbtype", geomjdbc.getGeotoolsDBTypeName());
    params.put("schema", geomjdbc.getSchema());

    gmlLoader.setDbConnProps(params);
    gmlLoader.setBijwerkDatum(new Date());
    gmlLoader.setIsOracle(geomjdbc.getGeotoolsDBTypeName().toLowerCase().contains("oracle"));*/
  }

  @Override
  public void run() {
    try {
      init();
      int count = 0;
      if (listener != null) {
        listener.total(lpIDs.length);
        listener.progress(count);
      }
      for (long id : lpIDs) {
        this.transform(id);
        count++;
        if (listener != null) {
          listener.progress(count);
        }
      }
    } catch (Exception e) {
      LOG.error("Fout tijdens verwerken TOPNL laadprocessen", e);
      if (listener != null) {
        listener.exception(e);
      }
    }
  }
}