1 package fr.ifremer.quadrige2.synchro.intercept.data;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import com.google.common.base.Joiner;
27 import com.google.common.collect.ImmutableList;
28 import com.google.common.collect.Sets;
29 import com.google.common.eventbus.Subscribe;
30 import fr.ifremer.common.synchro.intercept.SynchroInterceptorBase;
31 import fr.ifremer.common.synchro.meta.SynchroTableMetadata;
32 import fr.ifremer.common.synchro.meta.event.CreateQueryEvent;
33 import fr.ifremer.common.synchro.meta.event.LoadTableEvent;
34 import fr.ifremer.common.synchro.query.SynchroQueryBuilder;
35 import fr.ifremer.common.synchro.query.SynchroQueryOperator;
36 import fr.ifremer.quadrige2.core.dao.ObjectTypes;
37 import fr.ifremer.quadrige2.synchro.meta.DatabaseColumns;
38 import fr.ifremer.quadrige2.synchro.meta.data.DataSynchroTables;
39 import fr.ifremer.quadrige2.synchro.service.SynchroDirection;
40 import org.apache.commons.collections4.CollectionUtils;
41
42 import java.util.List;
43 import java.util.Set;
44
45
46
47
48
49
50
51 public class DeletedItemHistoryInterceptor extends AbstractDataInterceptor {
52
53
54 public static final List<String> NATURAL_ID_COLUMNS = ImmutableList.of(
55 DatabaseColumns.OBJECT_TYPE_CD.name(),
56 DatabaseColumns.OBJECT_ID.name(),
57 DatabaseColumns.OBJECT_CD.name());
58
59 private String whereClauseOnTableIncludes = null;
60
61 private String whereClauseForExportLocal2Temp = null;
62
63
64
65
66
67
68 public DeletedItemHistoryInterceptor() {
69
70 super(DataSynchroTables.DELETED_ITEM_HISTORY.name(),
71
72 SynchroDirection.IMPORT_SERVER2TEMP,
73 SynchroDirection.EXPORT_LOCAL2TEMP,
74 SynchroDirection.EXPORT_TEMP2SERVER);
75 }
76
77
78 @Override
79 public SynchroInterceptorBase clone() {
80 DeletedItemHistoryInterceptor newBean = (DeletedItemHistoryInterceptor) super.clone();
81 newBean.whereClauseOnTableIncludes = this.whereClauseOnTableIncludes;
82 return newBean;
83 }
84
85
86
87
88
89
90
91
92
93 @Subscribe
94 public void handleCreateQuery(CreateQueryEvent e) {
95 switch (e.queryName) {
96 case count:
97 case countFromUpdateDate:
98 case select:
99 case selectFromUpdateDate:
100 case selectMaxUpdateDate:
101 e.sql = addRestrictions(e.sql);
102 break;
103
104 default:
105 break;
106 }
107 }
108
109
110
111
112
113
114
115
116
117 @Subscribe
118 public void handleTableLoad(LoadTableEvent e) {
119 SynchroTableMetadata table = e.table;
120 SynchroDirection direction = getConfig().getDirection();
121
122
123 boolean isRoot = isInDirections(SynchroDirection.IMPORT_SERVER2TEMP,
124 SynchroDirection.EXPORT_LOCAL2TEMP,
125 SynchroDirection.EXPORT_TEMP2SERVER);
126
127 e.table.setRoot(isRoot);
128
129
130 if (direction == SynchroDirection.EXPORT_TEMP2SERVER) {
131
132 table.addUniqueConstraint("NATURAL_ID_UNIQUE_C", NATURAL_ID_COLUMNS, SynchroTableMetadata.DuplicateKeyStrategy.WARN);
133 }
134 }
135
136
137
138 private String addRestrictions(String sql) {
139
140 SynchroQueryBuilder query = SynchroQueryBuilder.newBuilder(sql);
141
142
143 if (whereClauseOnTableIncludes == null) {
144 whereClauseOnTableIncludes = createWhereClauseOnTableIncludes();
145 }
146 query.addWhere(SynchroQueryOperator.AND, whereClauseOnTableIncludes);
147
148
149 if (getConfig().getDirection() == SynchroDirection.EXPORT_LOCAL2TEMP) {
150 if (whereClauseForExportLocal2Temp == null) {
151 whereClauseForExportLocal2Temp = createWhereClauseForExportLocal2Temp();
152 }
153
154 query.addWhere(SynchroQueryOperator.AND, whereClauseForExportLocal2Temp);
155 }
156
157 return query.build();
158 }
159
160 private String createWhereClauseOnTableIncludes() {
161 Set<String> tableToIncludes = DataSynchroTables.getImportTablesIncludes();
162
163
164 if (CollectionUtils.isEmpty(tableToIncludes)) {
165 return "1=2";
166 }
167
168 Set<String> allObjectTypeCds = Sets.newHashSet();
169 for (String tableName : tableToIncludes) {
170 Set<String> objectTypeCds = ObjectTypes.getObjectTypeFromTableName(tableName);
171 if (CollectionUtils.isNotEmpty(objectTypeCds)) {
172 allObjectTypeCds.addAll(objectTypeCds);
173 }
174 else {
175
176 allObjectTypeCds.add(tableName);
177 }
178 }
179
180
181 allObjectTypeCds.remove(DataSynchroTables.DELETED_ITEM_HISTORY.name());
182
183 return new StringBuilder()
184 .append(DatabaseColumns.OBJECT_TYPE_CD)
185 .append(" IN ('")
186 .append(Joiner.on("','").join(allObjectTypeCds))
187 .append("')")
188 .toString();
189 }
190
191 private String createWhereClauseForExportLocal2Temp() {
192
193
194
195
196
197 return DatabaseColumns.REMOTE_ID.name() + " is null";
198 }
199 }