package fr.openwide.core.jpa.more.business.history.transaction;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import com.google.common.collect.Sets;
import fr.openwide.core.commons.util.collections.CollectionUtils;
import fr.openwide.core.jpa.more.business.history.util.FactoredHistoryLogBeforeCommitWithDifferencesTask;
import fr.openwide.core.jpa.more.business.history.util.HistoryLogBeforeCommitWithDifferencesTask;
import fr.openwide.core.jpa.more.util.transaction.model.ITransactionSynchronizationBeforeCommitTask;
import fr.openwide.core.jpa.more.util.transaction.model.TransactionSynchronizationTasks;
import fr.openwide.core.jpa.more.util.transaction.util.ITransactionSynchronizationTaskMerger;
import fr.openwide.core.spring.util.SpringBeanUtils;
@Component
public class HistoryLogTransactionSynchronizationTaskMerger implements ITransactionSynchronizationTaskMerger {
@Autowired
private ApplicationContext applicationContext;
@Override
public void merge(TransactionSynchronizationTasks tasks) {
mergeHistoryLogBeforeCommitWithDifferences(tasks.getBeforeCommitTasks());
}
private void mergeHistoryLogBeforeCommitWithDifferences(List<ITransactionSynchronizationBeforeCommitTask> tasks) {
if (!tasks.isEmpty()) {
// We simply use .hashcode() and .equals() to remove the duplicates
Set<ITransactionSynchronizationBeforeCommitTask> merged = Sets.newLinkedHashSet();
Set<HistoryLogBeforeCommitWithDifferencesTask<?, ?, ?, ?, ?>> differenceTasks = Sets.newLinkedHashSet();
for (ITransactionSynchronizationBeforeCommitTask task : tasks) {
if (task instanceof HistoryLogBeforeCommitWithDifferencesTask) {
differenceTasks.add((HistoryLogBeforeCommitWithDifferencesTask<?, ?, ?, ?, ?>)task);
} else {
merged.add(task);
}
}
if (!differenceTasks.isEmpty()) {
FactoredHistoryLogBeforeCommitWithDifferencesTask factoredTask
= new FactoredHistoryLogBeforeCommitWithDifferencesTask(differenceTasks);
SpringBeanUtils.autowireBean(applicationContext, factoredTask);
merged.add(factoredTask);
}
CollectionUtils.replaceAll(tasks, merged);
}
}
}