This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit 0d9ee4e8dd307031c8e4cdb13727dbe3edb5d4cd Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Apr 7 22:15:54 2015 +0200 add fix in ReplicationService to reattach after replication missing tdr association --- .../java/fr/ird/observe/db/ReplicationService.java | 112 ++++++++++++++++++++- .../observe/entities/longline/TripLonglines.java | 32 ++++++ 2 files changed, 142 insertions(+), 2 deletions(-) diff --git a/observe-business/src/main/java/fr/ird/observe/db/ReplicationService.java b/observe-business/src/main/java/fr/ird/observe/db/ReplicationService.java index 3817c8a..0468030 100644 --- a/observe-business/src/main/java/fr/ird/observe/db/ReplicationService.java +++ b/observe-business/src/main/java/fr/ird/observe/db/ReplicationService.java @@ -21,24 +21,38 @@ */ package fr.ird.observe.db; -import fr.ird.observe.entities.Entities; import fr.ird.observe.DecoratorService; import fr.ird.observe.ObserveDAOHelper; import fr.ird.observe.ObserveServiceHelper; import fr.ird.observe.db.constants.DataSourceState; +import fr.ird.observe.entities.Entities; +import fr.ird.observe.entities.Trip; +import fr.ird.observe.entities.longline.TripLongline; +import fr.ird.observe.entities.longline.TripLonglines; import fr.ird.observe.entities.seine.TripSeine; import fr.ird.observe.entities.seine.TripSeineDAO; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; +import org.nuiton.topia.framework.TopiaContextImplementor; +import org.nuiton.topia.framework.TopiaSQLQuery; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.util.TopiaEntityHelper; import org.nuiton.topia.replication.TopiaReplicationService; import org.nuiton.topia.replication.model.ReplicationModel; import org.nuiton.util.StringUtil; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -50,6 +64,9 @@ import static org.nuiton.i18n.I18n.t; */ public class ReplicationService { + /** Logger. */ + private static final Log log = LogFactory.getLog(ReplicationService.class); + protected DecoratorService decoratorService; public DecoratorService getDecoratorService() { @@ -229,12 +246,25 @@ public class ReplicationService { throw new DataSourceException(e, "replicateData"); } + // To fix missing tdr associations (see https://forge.codelutin.com/issues/6611) + List<Pair<String, String>> tdrAssociation = null; + TopiaContext srcCtxt = srcService.beginTransaction("replicateData"); try { TopiaEntity e = srcCtxt.findByTopiaId(id); String label = t(DecoratorService.getEntityLabel(e.getClass())); srcService.fireNewMessage(t("observe.storage.message.replicate.data.entity", label, dstLabel)); + if (e instanceof Trip && Entities.isLonglineId(id)) { + + // Grab tdr missing associations (see https://forge.codelutin.com/issues/6611) + if (log.isInfoEnabled()) { + log.info("Should keep SetLongline - Tdr association ids for: " + id); + } + + tdrAssociation = getTdrAssociationIds(srcCtxt, (TripLongline) e); + + } } catch (TopiaException e) { throw new DataSourceException(e, "replicateData"); } finally { @@ -247,6 +277,9 @@ public class ReplicationService { // do the replicate service.doReplicate(model, dstCtxt); + // Apply back tdr missing associations (see https://forge.codelutin.com/issues/6611) + applyTdrAssociationFix(dstCtxt, tdrAssociation); + // commit the result dstService.commitTransaction(dstCtxt, "replicateData"); @@ -258,4 +291,79 @@ public class ReplicationService { } } + + private void applyTdrAssociationFix(TopiaContext dstCtxt, List<Pair<String, String>> tdrAssociation) throws TopiaException { + + String request = "\nUPDATE OBSERVE_LONGLINE.TDR SET SET = '%s' WHERE topiaid = '%s';"; + + StringBuilder builder = new StringBuilder(); + + if (CollectionUtils.isNotEmpty(tdrAssociation)) { + for (Pair<String, String> entry : tdrAssociation) { + builder.append(String.format(request, entry.getKey(), entry.getValue())); + } + } + + dstCtxt.executeSQL(builder.toString()); + + } + + private List<Pair<String, String>> getTdrAssociationIds(TopiaContext srcCtxt, TripLongline e) throws TopiaException { + + List<Pair<String, String>> result = new ArrayList<Pair<String, String>>(); + + Set<String> setIds = TripLonglines.getSetIdsWithTdr(e); + + GetTdrIdsQuery query = new GetTdrIdsQuery(); + + for (String setId : setIds) { + + List<Pair<String, String>> multipleResult = query.execute((TopiaContextImplementor) srcCtxt, setId); + + if (log.isDebugEnabled()) { + log.debug("Found TDR associations: " + multipleResult); + } + result.addAll(multipleResult); + + } + + return result; + } + + + private static class GetTdrIdsQuery extends TopiaSQLQuery<Pair<String, String>> { + + private String setId; + + public List<Pair<String, String>> execute(TopiaContextImplementor tx, String setId) throws TopiaException { + try { + + this.setId = setId; + return findMultipleResult(tx); + + } finally { + + this.setId = null; + + } + } + + @Override + protected PreparedStatement prepareQuery(Connection connection) throws SQLException { + String sql = "SELECT t.SET, t.topiaId " + + "FROM OBSERVE_LONGLINE.TDR t " + + "WHERE t.SET = ?"; + PreparedStatement ps = connection.prepareStatement(sql); + ps.setString(1, setId); + return ps; + } + + @Override + protected Pair<String, String> prepareResult(ResultSet set) throws SQLException { + Pair<String, String> result = + Pair.of(set.getString(1), set.getString(2)); + return result; + } + + } } diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/longline/TripLonglines.java b/observe-entities/src/main/java/fr/ird/observe/entities/longline/TripLonglines.java new file mode 100644 index 0000000..6d20eaf --- /dev/null +++ b/observe-entities/src/main/java/fr/ird/observe/entities/longline/TripLonglines.java @@ -0,0 +1,32 @@ +package fr.ird.observe.entities.longline; + +import java.util.HashSet; +import java.util.Set; + +/** + * Created on 4/7/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.16 + */ +public class TripLonglines { + + public static Set<String> getSetIdsWithTdr(TripLongline tripLongline) { + + Set<String> setIds = new HashSet<String>(); + + for (ActivityLongline activityLongline : tripLongline.getActivityLongline()) { + + SetLongline setLongline = activityLongline.getSetLongline(); + + if (!setLongline.isTdrEmpty()) { + + String setLonglineTopiaId = setLongline.getTopiaId(); + setIds.add(setLonglineTopiaId); + + } + } + return setIds; + + } +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.