This is an automated email from the git hooks/post-receive script. New commit to branch feature/4304_synchro_marees in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit dae0234c6559d7de0076c5bdfc5732e451677126 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 8 12:08:05 2016 +0200 Début d'implantation de la logique de synchronisation de données --- .../ui/admin/datasynchro/DataSynchroUIHandler.java | 68 +++++++++++++- .../datasynchro/DataSynchronizeCopyTask.java | 27 ++++++ .../datasynchro/DataSynchronizeDeleteTask.java | 14 +++ .../datasynchro/DataSynchronizeRequest.java | 90 ++++++++++++++++++ .../datasynchro/DataSynchronizeService.java | 41 +++++++++ .../datasynchro/DataSyncrhonizeTaskSupport.java | 26 ++++++ .../datasynchro/DataSynchronizeServiceTopia.java | 102 +++++++++++++++++++++ 7 files changed, 367 insertions(+), 1 deletion(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUIHandler.java index 0c0a3a2..f59acf1 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUIHandler.java @@ -1,9 +1,14 @@ package fr.ird.observe.ui.admin.datasynchro; import fr.ird.observe.db.ObserveSwingDataSource; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.dto.DataReference; import fr.ird.observe.services.dto.referential.ProgramDto; import fr.ird.observe.services.dto.referential.ReferentialReference; +import fr.ird.observe.services.service.actions.datasynchro.DataSynchronizeCopyTask; +import fr.ird.observe.services.service.actions.datasynchro.DataSynchronizeDeleteTask; +import fr.ird.observe.services.service.actions.datasynchro.DataSynchronizeRequest; +import fr.ird.observe.services.service.actions.datasynchro.DataSynchronizeService; import fr.ird.observe.ui.admin.AdminTabUIHandler; import fr.ird.observe.ui.admin.AdminUI; import fr.ird.observe.ui.storage.tabs.DataSelectionModel; @@ -14,6 +19,7 @@ import jaxx.runtime.swing.wizard.ext.WizardState; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import javax.swing.DefaultListModel; import javax.swing.JList; import javax.swing.border.TitledBorder; import java.awt.event.MouseEvent; @@ -241,7 +247,67 @@ public class DataSynchroUIHandler extends AdminTabUIHandler { public void doExecuteAction() { - //TODO + ObserveSwingDataSource leftSource = getStepModel().getLeftSource(); + boolean leftSourceIsH2 = leftSource.getConfiguration() instanceof ObserveDataSourceConfigurationTopiaH2; + + ObserveSwingDataSource rightSource = getStepModel().getRightSource(); + boolean rightSourceIsH2 = rightSource.getConfiguration() instanceof ObserveDataSourceConfigurationTopiaH2; + + DefaultListModel<DataSynchronizeTaskSupport> tasks = getStepModel().getTasks(); + int size = tasks.size(); + + DataSynchronizeRequest.Builder leftDataSynchronizeRequestBuilder = DataSynchronizeRequest.builder(rightSourceIsH2); + DataSynchronizeRequest.Builder rightDataSynchronizeRequestBuilder = DataSynchronizeRequest.builder(leftSourceIsH2); + for (int i = 0; i < size; i++) { + + DataSynchronizeTaskSupport task = tasks.getElementAt(i); + + if (task instanceof DeleteFromLeftDataSynchronizeTask) { + + leftDataSynchronizeRequestBuilder.addDeleteTask(new DataSynchronizeDeleteTask(task.getProgram().getId(), task.getTrip().getId())); + continue; + } + + if (task instanceof DeleteFromRightDataSynchronizeTask) { + rightDataSynchronizeRequestBuilder.addDeleteTask(new DataSynchronizeDeleteTask(task.getProgram().getId(), task.getTrip().getId())); + continue; + } + + if (task instanceof CopyToLeftDataSynchronizeTask) { + CopyToLeftDataSynchronizeTask copyTask = (CopyToLeftDataSynchronizeTask) task; + if (copyTask.isTripExistOnLeft()) { + leftDataSynchronizeRequestBuilder.addDeleteTask(new DataSynchronizeDeleteTask(task.getProgram().getId(), task.getTrip().getId())); + } + leftDataSynchronizeRequestBuilder.addCopyTask(new DataSynchronizeCopyTask(task.getProgram().getId(), task.getTrip().getId())); + continue; + } + + if (task instanceof CopyToRightDataSynchronizeTask) { + CopyToRightDataSynchronizeTask copyTask = (CopyToRightDataSynchronizeTask) task; + if (copyTask.isTripExistOnRight()) { + rightDataSynchronizeRequestBuilder.addDeleteTask(new DataSynchronizeDeleteTask(task.getProgram().getId(), task.getTrip().getId())); + } + rightDataSynchronizeRequestBuilder.addCopyTask(new DataSynchronizeCopyTask(task.getProgram().getId(), task.getTrip().getId())); + } + + } + + + DataSynchronizeService leftDataSynchronizeService = leftSource.newDataSynchronizeService(); + DataSynchronizeService rightDataSynchronizeService = rightSource.newDataSynchronizeService(); + + DataSynchronizeRequest leftDataSynchronizeRequest = leftDataSynchronizeRequestBuilder.build(); + if (leftDataSynchronizeRequest.isNotEmpty()) { + rightDataSynchronizeService.prepareRequestOnOppositeDataSource(leftDataSynchronizeRequest); + leftDataSynchronizeService.executeRequest(leftDataSynchronizeRequest); + } + + DataSynchronizeRequest rightDataSynchronizeRequest = rightDataSynchronizeRequestBuilder.build(); + if (rightDataSynchronizeRequest.isNotEmpty()) { + leftDataSynchronizeService.prepareRequestOnOppositeDataSource(rightDataSynchronizeRequest); + rightDataSynchronizeService.executeRequest(rightDataSynchronizeRequest); + } + getModel().setStepState(WizardState.SUCCESSED); } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeCopyTask.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeCopyTask.java new file mode 100644 index 0000000..2217414 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeCopyTask.java @@ -0,0 +1,27 @@ +package fr.ird.observe.services.service.actions.datasynchro; + +/** + * Created on 08/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class DataSynchronizeCopyTask extends DataSyncrhonizeTaskSupport { + + /** + * Contient le code sql de la copie de la marée. + */ + private byte[] dataContent; + + public DataSynchronizeCopyTask(String programId, String tripId) { + super(programId, tripId); + } + + public byte[] getDataContent() { + return dataContent; + } + + public void setDataContent(byte[] dataContent) { + this.dataContent = dataContent; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeDeleteTask.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeDeleteTask.java new file mode 100644 index 0000000..490eae0 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeDeleteTask.java @@ -0,0 +1,14 @@ +package fr.ird.observe.services.service.actions.datasynchro; + +/** + * Created on 08/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class DataSynchronizeDeleteTask extends DataSyncrhonizeTaskSupport { + + public DataSynchronizeDeleteTask(String programId, String tripId) { + super(programId, tripId); + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeRequest.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeRequest.java new file mode 100644 index 0000000..16cc43f --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeRequest.java @@ -0,0 +1,90 @@ +package fr.ird.observe.services.service.actions.datasynchro; + +import com.google.common.collect.ImmutableSet; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Created on 08/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class DataSynchronizeRequest { + + /** Logger. */ + private static final Log log = LogFactory.getLog(DataSynchronizeRequest.class); + + public static Builder builder(boolean oppositeH2) { + return new Builder(oppositeH2); + } + + /** + * Is opposite data source use h2 ? + */ + private final boolean oppositeH2; + /** + * Copy tasks. + */ + private final ImmutableSet<DataSynchronizeCopyTask> copyTasks; + + /** + * Delete tasks. + */ + private final ImmutableSet<DataSynchronizeDeleteTask> deleteTasks; + + public static class Builder { + + private final boolean oppositeH2; + private final ImmutableSet.Builder<DataSynchronizeCopyTask> copyTasksBuilder = ImmutableSet.builder(); + private final ImmutableSet.Builder<DataSynchronizeDeleteTask> deleteTasksBuilder = ImmutableSet.builder(); + + public Builder(boolean oppositeH2) { + this.oppositeH2 = oppositeH2; + } + + public DataSynchronizeRequest build() { + return new DataSynchronizeRequest(oppositeH2, copyTasksBuilder.build(), deleteTasksBuilder.build()); + } + + public Builder addDeleteTask(DataSynchronizeDeleteTask deleteTask) { + + if (log.isInfoEnabled()) { + log.info("Add delete task for trip: " + deleteTask.getProgramId() + " / " + deleteTask.getTripId()); + } + deleteTasksBuilder.add(deleteTask); + return this; + } + + public Builder addCopyTask(DataSynchronizeCopyTask copyTask) { + if (log.isInfoEnabled()) { + log.info("Add copy task for trip: " + copyTask.getProgramId() + " / " + copyTask.getTripId()); + } + copyTasksBuilder.add(copyTask); + return this; + } + + } + + public ImmutableSet<DataSynchronizeCopyTask> getCopyTasks() { + return copyTasks; + } + + public ImmutableSet<DataSynchronizeDeleteTask> getDeleteTasks() { + return deleteTasks; + } + + public boolean isNotEmpty() { + return !(copyTasks.isEmpty() && deleteTasks.isEmpty()); + } + + public boolean isOppositeH2() { + return oppositeH2; + } + + private DataSynchronizeRequest(boolean oppositeH2, ImmutableSet<DataSynchronizeCopyTask> copyTasks, ImmutableSet<DataSynchronizeDeleteTask> deleteTasks) { + this.oppositeH2 = oppositeH2; + this.copyTasks = copyTasks; + this.deleteTasks = deleteTasks; + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeService.java new file mode 100644 index 0000000..1f15d58 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeService.java @@ -0,0 +1,41 @@ +package fr.ird.observe.services.service.actions.datasynchro; + +import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.spi.PostRequest; +import fr.ird.observe.services.spi.ReadDataPermission; +import fr.ird.observe.services.spi.Write; +import fr.ird.observe.services.spi.WriteDataPermission; + +/** + * Created on 08/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public interface DataSynchronizeService extends ObserveService { + + /** + * Prépare la demande donnée en paramètre. Par exemple s'il y a des demandes de recopie, on récupère le code sql de recopie. + * + * Cette méthode doit être executée sur la base opposée. + * + * @param request la demande des tâches à préparer. + */ + @ReadDataPermission + @PostRequest + void prepareRequestOnOppositeDataSource(DataSynchronizeRequest request); + + /** + * Exécution de la demande donnée en paramètre. + * + * Cette méthode doit être exécutée sur la base cible. + * + * @param request la demande des tâches à réaliser. + */ + @ReadDataPermission + @WriteDataPermission + @Write + @PostRequest + void executeRequest(DataSynchronizeRequest request); + +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSyncrhonizeTaskSupport.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSyncrhonizeTaskSupport.java new file mode 100644 index 0000000..c90b217 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSyncrhonizeTaskSupport.java @@ -0,0 +1,26 @@ +package fr.ird.observe.services.service.actions.datasynchro; + +/** + * Created on 08/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public abstract class DataSyncrhonizeTaskSupport { + + private final String programId; + private final String tripId; + + protected DataSyncrhonizeTaskSupport(String programId, String tripId) { + this.programId = programId; + this.tripId = tripId; + } + + public String getProgramId() { + return programId; + } + + public String getTripId() { + return tripId; + } +} diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeServiceTopia.java new file mode 100644 index 0000000..3dead6c --- /dev/null +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/actions/datasynchro/DataSynchronizeServiceTopia.java @@ -0,0 +1,102 @@ +package fr.ird.observe.services.service.actions.datasynchro; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.entities.Entities; +import fr.ird.observe.entities.longline.TripLongline; +import fr.ird.observe.entities.longline.TripLonglineTopiaDao; +import fr.ird.observe.entities.seine.TripSeine; +import fr.ird.observe.entities.seine.TripSeineTopiaDao; +import fr.ird.observe.services.ObserveServiceContextTopia; +import fr.ird.observe.services.ObserveServiceTopia; +import fr.ird.observe.services.service.SqlScriptProducerRequest; +import fr.ird.observe.services.service.SqlScriptProducerService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Created on 08/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class DataSynchronizeServiceTopia extends ObserveServiceTopia implements DataSynchronizeService { + + /** Logger. */ + private static final Log log = LogFactory.getLog(DataSynchronizeServiceTopia.class); + + protected SqlScriptProducerService sqlScriptProducerService; + + @Override + public void setServiceContext(ObserveServiceContextTopia serviceContext) { + super.setServiceContext(serviceContext); + sqlScriptProducerService = serviceContext.newService(SqlScriptProducerService.class); + } + + @Override + public void prepareRequestOnOppositeDataSource(DataSynchronizeRequest request) { + + for (DataSynchronizeCopyTask copyTask : request.getCopyTasks()) { + + if (log.isInfoEnabled()) { + log.info("Obtain trip sql content: " + copyTask.getProgramId() + " / " + copyTask.getTripId()); + } + + // get the data content + + SqlScriptProducerRequest sqlRequest; + if (request.isOppositeH2()) { + sqlRequest = SqlScriptProducerRequest.forH2(); + } else { + sqlRequest = SqlScriptProducerRequest.forPostgres(); + } + sqlRequest.addDataIds(ImmutableSet.of(copyTask.getTripId())); + byte[] sqlScript = sqlScriptProducerService.produceSqlScript(sqlRequest); + + // store it in task + copyTask.setDataContent(sqlScript); + + } + + } + + @Override + public void executeRequest(DataSynchronizeRequest request) { + + TripSeineTopiaDao tripSeineDao = serviceContext.getTopiaPersistenceContext().getTripSeineDao(); + TripLonglineTopiaDao tripLonglineDao = serviceContext.getTopiaPersistenceContext().getTripLonglineDao(); + + for (DataSynchronizeDeleteTask deleteTask : request.getDeleteTasks()) { + + String tripId = deleteTask.getTripId(); + boolean longlineId = Entities.isLonglineId(tripId); + + if (longlineId) { + + if (log.isInfoEnabled()) { + log.info("Delete longline trip: " + deleteTask.getProgramId() + " / " + deleteTask.getTripId()); + } + TripLongline tripLongline = tripLonglineDao.forTopiaIdEquals(tripId).findUnique(); + tripLonglineDao.delete(tripLongline); + + } else { + + if (log.isInfoEnabled()) { + log.info("Delete seine trip: " + deleteTask.getProgramId() + " / " + deleteTask.getTripId()); + } + TripSeine tripSeine = tripSeineDao.forTopiaIdEquals(tripId).findUnique(); + tripSeineDao.delete(tripSeine); + + } + + } + + for (DataSynchronizeCopyTask copyTask : request.getCopyTasks()) { + + if (log.isInfoEnabled()) { + log.info("Copy trip: " + copyTask.getProgramId() + " / " + copyTask.getTripId()); + } + serviceContext.getTopiaApplicationContext().executeSqlStatements(copyTask.getDataContent()); + + } + } +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.