1 package fr.ifremer.quadrige2.synchro.intercept.referential;
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.eventbus.Subscribe;
27 import fr.ifremer.common.synchro.intercept.SynchroInterceptorBase;
28 import fr.ifremer.common.synchro.meta.SynchroTableMetadata;
29 import fr.ifremer.common.synchro.meta.event.CreateQueryEvent;
30 import fr.ifremer.common.synchro.meta.event.LoadTableEvent;
31 import fr.ifremer.common.synchro.query.SynchroQueryBuilder;
32 import fr.ifremer.common.synchro.query.SynchroQueryName;
33 import fr.ifremer.common.synchro.query.SynchroQueryOperator;
34 import fr.ifremer.quadrige2.core.dao.referential.StatusCode;
35 import fr.ifremer.quadrige2.synchro.meta.DatabaseColumns;
36 import fr.ifremer.quadrige2.synchro.meta.referential.ReferentialSynchroTables;
37 import fr.ifremer.quadrige2.synchro.service.SynchroDirection;
38 import fr.ifremer.quadrige2.synchro.service.referential.ReferentialSynchroDatabaseConfiguration;
39 import org.apache.commons.collections4.CollectionUtils;
40 import org.apache.commons.logging.Log;
41 import org.apache.commons.logging.LogFactory;
42
43 import java.util.Set;
44
45
46
47
48
49
50
51
52
53
54
55 public class ReferenceTaxonInterceptor extends AbstractReferentialInterceptor {
56
57 private static final Log log = LogFactory.getLog(ReferenceTaxonInterceptor.class);
58
59 private String localOnlyWhereClause;
60
61
62
63
64
65
66 public ReferenceTaxonInterceptor() {
67 super(ReferentialSynchroTables.REFERENCE_TAXON.name());
68 }
69
70
71 @Override
72 protected void init(ReferentialSynchroDatabaseConfiguration config) {
73 localOnlyWhereClause = createLocalOnlyWhereClause(config);
74 }
75
76
77 @Override
78 public SynchroInterceptorBase clone() {
79 ReferenceTaxonInterceptor result = (ReferenceTaxonInterceptor) super.clone();
80 result.localOnlyWhereClause = this.localOnlyWhereClause;
81 return result;
82 }
83
84
85
86
87
88
89
90
91
92 @Subscribe
93 public void handleQuery(CreateQueryEvent e) {
94
95 switch (e.queryName) {
96 case count:
97 case countFromUpdateDate:
98 case select:
99 case selectFromUpdateDate:
100 case selectMaxUpdateDate:
101
102 e.sql = addRestriction(e.source, e.queryName, e.sql);
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 if (!table.isRoot()
124 && localOnlyWhereClause != null) {
125 table.setRoot(true);
126 }
127 }
128
129
130
131
132
133
134
135
136
137
138
139
140
141 protected String createLocalOnlyWhereClause(ReferentialSynchroDatabaseConfiguration config) {
142
143 Set<String> statusCodeIncludes = config.getStatusCodeIncludes();
144 if (CollectionUtils.isEmpty(statusCodeIncludes)
145 || (!statusCodeIncludes.contains(StatusCode.LOCAL_DISABLE.getValue())
146 && !statusCodeIncludes.contains(StatusCode.LOCAL_ENABLE.getValue()))) {
147 return null;
148 }
149
150
151 return String.format("t.%s < 0",
152 DatabaseColumns.REF_TAXON_ID);
153 }
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168 protected String addRestriction(SynchroTableMetadata table, SynchroQueryName queryName, String sql) {
169
170
171 if (localOnlyWhereClause == null) {
172 return sql;
173 }
174
175 SynchroQueryBuilder queryBuilder = SynchroQueryBuilder.newBuilder(sql);
176 queryBuilder.addWhere(SynchroQueryOperator.AND, localOnlyWhereClause);
177
178 return queryBuilder.build();
179 }
180
181 }