Skip to content
Snippets Groups Projects
Commit 0ca7ddff authored by Olivier Maury's avatar Olivier Maury
Browse files

Enregistrer la date et l'heure de l'intégration. fixes #6

parent e4d2faf6
No related branches found
No related tags found
1 merge request!8Resolve "Enregistrer la date et l'heure de l'intégration"
package fr.agrometinfo.seasonhandler.dao;
import java.time.LocalDate;
/**
* DAO for table "simulation" in AgroMetInfo database.
*
* @author Olivier Maury
*/
public interface AmiSimulationDao {
/**
* Create a row.
*
* @param date date to simulate
* @param simulationId ID of simulation
*/
void create(LocalDate date, Integer simulationId);
/**
* Update ended column for the simulation.
*
* @param simulationId ID of simulation
*/
void setEnded(Integer simulationId);
}
package fr.agrometinfo.seasonhandler.dao;
import java.time.LocalDate;
import fr.inrae.agroclim.season.core.dao.DaoHibernate;
import fr.inrae.agroclim.season.core.dao.PersistenceManager;
/**
* DAO implementation for table "simulation" in AgroMetInfo database.
*
* @author Olivier Maury
*/
public class AmiSimulationDaoHibernate extends DaoHibernate implements AmiSimulationDao {
/**
* Constructor.
*
* @param persistenceManager JPA persistence manager for the Simulation
* database.
*/
public AmiSimulationDaoHibernate(final PersistenceManager persistenceManager) {
super(persistenceManager);
}
@Override
public final void create(final LocalDate date, final Integer simulationId) {
doInJpaTransaction(em -> {
final var sql = "INSERT INTO agrometinfo.simulation (date, simulationid) VALUES (?, ?)";
final var query = em.createNativeQuery(sql);
query.setParameter(1, date);
query.setParameter(2, simulationId);
query.executeUpdate();
});
}
@Override
public final void setEnded(final Integer simulationId) {
doInJpaTransaction(em -> {
final var sql = "UPDATE agrometinfo.simulation SET ended=CURRENT_TIMESTAMP WHERE simulationid=?";
final var query = em.createNativeQuery(sql);
query.setParameter(1, simulationId);
query.executeUpdate();
});
}
}
......@@ -19,6 +19,8 @@ package fr.agrometinfo.seasonhandler.di;
import java.util.Locale;
import fr.agrometinfo.seasonhandler.MainConfiguration;
import fr.agrometinfo.seasonhandler.dao.AmiSimulationDao;
import fr.agrometinfo.seasonhandler.dao.AmiSimulationDaoHibernate;
import fr.agrometinfo.seasonhandler.dao.DailyvalueDao;
import fr.agrometinfo.seasonhandler.dao.DailyvalueDaoHibernate;
import fr.agrometinfo.seasonhandler.jms.SafranReceiver;
......@@ -34,6 +36,8 @@ import fr.inrae.agroclim.season.core.dao.SimulationResultDao;
import fr.inrae.agroclim.season.core.dao.SimulationResultDaoHibernate;
import fr.inrae.agroclim.season.core.dao.VarietyParameterDao;
import fr.inrae.agroclim.season.core.dao.VarietyParameterDaoHibernate;
import fr.inrae.agroclim.season.core.model.Simulation;
import fr.inrae.agroclim.season.core.model.SimulationResult;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
......@@ -68,6 +72,7 @@ public final class DiHelper {
public void inject(final SafranReceiver receiver) {
final PersistenceManager pm = providePersitenceManager();
receiver.setConfig(config);
receiver.setAmiSimulationDao(provideAmiSimulationDao(pm));
receiver.setClimaticScenarioDao(provideClimaticScenarioDao(pm));
receiver.setVarietyParameterDao(provideVarietyParameterDao(pm));
final SimulationLauncher launcher = new SimulationLauncher(config.getDatabaseRoles(), pm);
......@@ -82,9 +87,19 @@ public final class DiHelper {
* @param receiver receiver.
*/
public void inject(final SimulationDoneReceiver receiver) {
receiver.setDailyvalueDao(provideDailyvalueDao());
receiver.setSimulationDao(provideSimulationDao());
receiver.setSimulationResultDao(provideSimulationResultDao());
final PersistenceManager pm = providePersitenceManager();
receiver.setAmiSimulationDao(provideAmiSimulationDao(pm));
receiver.setDailyvalueDao(provideDailyvalueDao(pm));
receiver.setSimulationDao(provideSimulationDao(pm));
receiver.setSimulationResultDao(provideSimulationResultDao(pm));
}
/**
* @param pm JPA persistence manager
* @return DAO for AmiSimulationDao.
*/
private AmiSimulationDao provideAmiSimulationDao(final PersistenceManager pm) {
return new AmiSimulationDaoHibernate(pm);
}
/**
......@@ -96,10 +111,10 @@ public final class DiHelper {
}
/**
* @param pm JPA persistence manager
* @return DAO for dailyvalue table.
*/
private DailyvalueDao provideDailyvalueDao() {
final PersistenceManager pm = providePersitenceManager();
private DailyvalueDao provideDailyvalueDao(final PersistenceManager pm) {
return new DailyvalueDaoHibernate(pm);
}
......@@ -115,18 +130,18 @@ public final class DiHelper {
}
/**
* @param pm JPA persistence manager
* @return DAO for {@link Simulation}.
*/
private SimulationDao provideSimulationDao() {
final PersistenceManager pm = providePersitenceManager();
private SimulationDao provideSimulationDao(final PersistenceManager pm) {
return new SimulationDaoHibernate(pm);
}
/**
* @param pm JPA persistence manager
* @return DAO for {@link SimulationResult}.
*/
private SimulationResultDao provideSimulationResultDao() {
final PersistenceManager pm = providePersitenceManager();
private SimulationResultDao provideSimulationResultDao(final PersistenceManager pm) {
return new SimulationResultDaoHibernate(pm, config.getDatabaseRoles());
}
......
......@@ -17,9 +17,12 @@
package fr.agrometinfo.seasonhandler.jms;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.jms.Destination;
import javax.jms.JMSConsumer;
......@@ -31,6 +34,7 @@ import javax.jms.MessageListener;
import org.apache.activemq.artemis.jms.client.ActiveMQMessage;
import fr.agrometinfo.seasonhandler.MainConfiguration;
import fr.agrometinfo.seasonhandler.dao.AmiSimulationDao;
import fr.inrae.agroclim.indicators.exception.IndicatorsException;
import fr.inrae.agroclim.indicators.model.Evaluation;
import fr.inrae.agroclim.indicators.model.indicator.CompositeIndicator;
......@@ -39,9 +43,6 @@ import fr.inrae.agroclim.season.core.dao.ClimaticScenarioDao;
import fr.inrae.agroclim.season.core.dao.VarietyParameterDao;
import fr.inrae.agroclim.season.core.model.ClimaticScenario;
import fr.inrae.agroclim.season.core.simulationproperties.SimulationProperties;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
......@@ -61,15 +62,16 @@ public final class SafranReceiver implements MessageListener, Runnable {
private static final String USERNAME = "agrometinfo";
/**
* DAO for {@link ClimaticScenario}.
* DAO for table "simulation" in AgroMetInfo database.
*/
@Setter
private ClimaticScenarioDao climaticScenarioDao;
private AmiSimulationDao amiSimulationDao;
/**
* Consumer of JMS messages.
* DAO for {@link ClimaticScenario}.
*/
private final JMSConsumer consumer;
@Setter
private ClimaticScenarioDao climaticScenarioDao;
/**
* Application configuration.
......@@ -77,6 +79,11 @@ public final class SafranReceiver implements MessageListener, Runnable {
@Setter
private MainConfiguration config;
/**
* Consumer of JMS messages.
*/
private final JMSConsumer consumer;
/**
* Last date received from JMS message.
*/
......@@ -148,7 +155,7 @@ public final class SafranReceiver implements MessageListener, Runnable {
final int lastDoy = lastDate.getDayOfYear() + doyOffset;
LOGGER.trace("nban: {}, lastDoy: {}", nbOfYears, lastDoy);
LOGGER.traceEntry("Loop on each phase of the evaluation");
List<CompositeIndicator> phasesToRemove = new ArrayList<>();
final List<CompositeIndicator> phasesToRemove = new ArrayList<>();
for (final CompositeIndicator phase : evaluation.getPhases()) {
final String endStage = phase.getName();
final String startStage = phase.getFirstIndicator().getName();
......@@ -172,7 +179,7 @@ public final class SafranReceiver implements MessageListener, Runnable {
stage.setValue(lastDoy);
}
}
var newStages = stages.entrySet().stream() //
final var newStages = stages.entrySet().stream() //
.map(e -> e.getKey().concat(": ").concat(String.valueOf(e.getValue()))) //
.collect(Collectors.joining(", "));
props.set(SimulationProperties.Property.STAGES, newStages);
......@@ -188,6 +195,7 @@ public final class SafranReceiver implements MessageListener, Runnable {
props.unset(SimulationProperties.Property.PHENOLOGICAL_MODEL);
final Integer simulationId = launcher.launch(evaluation, props, USERNAME);
LOGGER.info("Simulation is created: #{}", simulationId);
amiSimulationDao.create(lastDate, simulationId);
}
/**
......
package fr.agrometinfo.seasonhandler.jms;
import fr.agrometinfo.seasonhandler.dao.DailyvalueDao;
import fr.inrae.agroclim.season.core.dao.SimulationDao;
import fr.inrae.agroclim.season.core.dao.SimulationResultDao;
import fr.inrae.agroclim.season.core.model.Simulation;
import java.util.Objects;
import javax.jms.Destination;
import javax.jms.JMSConsumer;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import lombok.Setter;
import org.apache.activemq.artemis.jms.client.ActiveMQMessage;
import fr.agrometinfo.seasonhandler.dao.AmiSimulationDao;
import fr.agrometinfo.seasonhandler.dao.DailyvalueDao;
import fr.inrae.agroclim.season.core.dao.SimulationDao;
import fr.inrae.agroclim.season.core.dao.SimulationResultDao;
import fr.inrae.agroclim.season.core.model.Simulation;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
/**
......@@ -26,28 +28,34 @@ import lombok.extern.log4j.Log4j2;
*/
@Log4j2
public final class SimulationDoneReceiver implements MessageListener, Runnable {
/**
* DAO for table "simulation" in AgroMetInfo database.
*/
@Setter
private AmiSimulationDao amiSimulationDao;
/**
* Consumer of JMS messages.
*/
private final JMSConsumer consumer;
/**
* DAO for {@link Simuation}.
* DAO for {@code dailyvalue} table.
*/
@Setter
private SimulationDao simulationDao;
private DailyvalueDao dailyvalueDao;
/**
* DAO for {@link SimuationResult}.
* DAO for {@link Simulation}.
*/
@Setter
private SimulationResultDao simulationResultDao;
private SimulationDao simulationDao;
/**
* DAO for {@code dailyvalue} table.
* DAO for {@link SimuationResult}.
*/
@Setter
private DailyvalueDao dailyvalueDao;
private SimulationResultDao simulationResultDao;
/**
* Constructor.
......@@ -81,6 +89,7 @@ public final class SimulationDoneReceiver implements MessageListener, Runnable {
LOGGER.info("Simulation results in {}.{}", schemaName, tableName);
dailyvalueDao.insertFromTable(tableName);
msg.acknowledge();
amiSimulationDao.setEnded(simulationId);
LOGGER.info("Simulation results in {}.{} handled", schemaName, tableName);
} catch (final JMSException ex) {
LOGGER.fatal(ex);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment