AbstractExecutableProces.java
/*
* Copyright (C) 2015 B3Partners B.V.
*/
package nl.b3p.brmo.service.scanner;
import java.io.File;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import nl.b3p.brmo.loader.util.BrmoException;
import nl.b3p.brmo.persistence.staging.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.stripesstuff.stripersist.Stripersist;
/**
* Abstract to make sure comparisons are done right.
*
* @author Mark Prins
*/
public abstract class AbstractExecutableProces implements ProcesExecutable {
private static final Log log = LogFactory.getLog(AbstractExecutableProces.class);
/** maximale lengte waarna log wordt ingekort, moet een veelvoud van 10 zijn. */
protected static final int OLD_LOG_LENGTH = 3000;
volatile boolean active = false;
/**
* ProcesExecutable factory.
*
* @param config the type of {@code ProcesExecutable} to create.
* @return an instance of the specified type
*/
public static ProcesExecutable getProces(AutomatischProces config) {
ProcessingImple imple = ProcessingImple.valueOf(config.getClass().getSimpleName());
switch (imple) {
case BAG2MutatieProces:
return new BAG2MutatieProcesRunner((BAG2MutatieProces) config);
case BRK2ScannerProces:
return new BRK2DirectoryScanner((BRK2ScannerProces) config);
case BRKScannerProces:
return new BRKDirectoryScanner((BRKScannerProces) config);
case MailRapportageProces:
return new MailRapportage((MailRapportageProces) config);
case GDS2OphaalProces:
return new GDS2OphalenProces((GDS2OphaalProces) config);
case BerichtTransformatieProces:
return new BerichtTransformatieUitvoeren((BerichtTransformatieProces) config);
case BerichtDoorstuurProces:
return new BerichtDoorsturenProces((BerichtDoorstuurProces) config);
case LaadprocesTransformatieProces:
return new LaadprocesTransformatieUitvoeren((LaadprocesTransformatieProces) config);
case MaterializedViewRefresh:
return new MaterializedViewRefreshUitvoeren((MaterializedViewRefresh) config);
case BerichtstatusRapportProces:
return new BerichtstatusRapport((BerichtstatusRapportProces) config);
case LaadprocesStatusRapportProces:
return new LaadprocesStatusRapport((LaadprocesStatusRapportProces) config);
case TopNLScannerProces:
return new TopNLDirectoryScanner((TopNLScannerProces) config);
case AfgifteNummerScannerProces:
return new AfgifteNummerScanner((AfgifteNummerScannerProces) config);
case BGTLoaderProces:
return new BGTLoader((BGTLoaderProces) config);
default:
throw new IllegalArgumentException(imple.name() + " is is geen ondersteund proces...");
}
}
@Override
public boolean isRunning() {
return this.active;
}
@Override
public void stop() {
this.active = false;
}
@Override
public void run() {
while (active) {
try {
this.execute();
// TODO
Thread.sleep(5000);
} catch (InterruptedException | BrmoException e) {
log.error(e.getMessage(), e);
}
}
}
/**
* bepaal of het bestand een duplicaat is op basis van de bestandsnaam en soort.
*
* <p>De flow in
*
* <pre>
* loadFromFile(bericht)
* → stagingProxy.loadBr(InputStream stream, String type, String fileName,...)
* → snapshot reader van de input stream parsed het bericht in een BrkSnapshotXMLReader of Brk2SnapshotXMLReader die bericht voor bericht uitgelezen kunnen worden
* → bepaal of laadproces bestaat stagingProxy.laadProcesExists(filenaam/datum)
* → laadproces in database maken stagingProxy.writeLaadProces(bestand_naam/bestand_datum/soort/gebied/opmerking/status/status_datum/contact_email)
* → uitlezen xml bericht als
* → !stagingProxy.berichtExists(laadprocesid/object_ref/datum/volgordenummer)
* → stagingProxy.writeBericht(b)
* </pre>
*
* @param input een input bestand
* @param soort het type registratie, bijvoorbeeld {@value
* nl.b3p.brmo.loader.BrmoFramework#BR_BRK2}
* @return {@code true} als het bestand een duplicaat betreft, anders {@code false}
*/
protected boolean isDuplicaatLaadProces(File input, String soort) {
log.debug(
"Controle voor duplicaat laadproces, soort: '" + soort + "', bestand: " + input.getName());
final String name = getBestandsNaam(input);
EntityManager em = Stripersist.getEntityManager();
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<LaadProces> criteriaQuery = criteriaBuilder.createQuery(LaadProces.class);
Root<LaadProces> from = criteriaQuery.from(LaadProces.class);
CriteriaQuery<LaadProces> select = criteriaQuery.select(from);
Predicate _bestand_naam = criteriaBuilder.equal(from.get("bestand_naam"), name);
Predicate _soort = criteriaBuilder.equal(from.get("soort"), soort);
criteriaQuery.where(criteriaBuilder.and(_bestand_naam, _soort));
TypedQuery<LaadProces> typedQuery = em.createQuery(select);
return !typedQuery.getResultList().isEmpty();
}
/**
* bepaal bestandnaam.
*
* @param f het bestand
* @return de naam van het bestand tbv oa. duplicaat controle
* @see #isDuplicaatLaadProces(java.io.File, java.lang.String)
*/
protected String getBestandsNaam(File f) {
return f.getAbsolutePath();
}
protected Date getBestandsDatum(File f) {
return new Date(f.lastModified());
}
}