1 package fr.ifremer.quadrige2.synchro.intercept.administration;
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.dao.SynchroTableDao;
28 import fr.ifremer.common.synchro.intercept.SynchroInterceptorBase;
29 import fr.ifremer.common.synchro.intercept.SynchroOperationRepository;
30 import fr.ifremer.common.synchro.meta.SynchroDatabaseMetadata;
31 import fr.ifremer.common.synchro.meta.SynchroTableMetadata;
32 import fr.ifremer.common.synchro.meta.event.CreateQueryEvent;
33 import fr.ifremer.common.synchro.query.SynchroQueryBuilder;
34 import fr.ifremer.common.synchro.query.SynchroQueryName;
35 import fr.ifremer.common.synchro.query.SynchroQueryOperator;
36 import fr.ifremer.quadrige2.synchro.meta.DatabaseColumns;
37 import fr.ifremer.quadrige2.synchro.meta.administration.ProgramStrategySynchroTables;
38 import fr.ifremer.quadrige2.synchro.service.referential.ReferentialSynchroDatabaseConfiguration;
39 import org.hibernate.tool.hbm2ddl.TableMetadata;
40
41 import java.sql.SQLException;
42 import java.util.List;
43
44
45
46
47
48
49
50
51
52
53 public class TableWithProgCdInterceptor extends AbstractProgramStrategyInterceptor {
54
55 private String programWhereClauseOrNull = null;
56
57
58
59
60
61
62 public TableWithProgCdInterceptor() {
63 super(ProgramStrategySynchroTables.tableNames());
64 }
65
66
67 @Override
68 protected void init(ReferentialSynchroDatabaseConfiguration config) {
69 super.init(config);
70 programWhereClauseOrNull = createProgramWhereClauseOrNull(getConfig(), "t." + DatabaseColumns.PROG_CD.name() + " IN (%s)");
71 }
72
73
74 @Override
75 public SynchroInterceptorBase clone() {
76 TableWithProgCdInterceptor result = (TableWithProgCdInterceptor) super.clone();
77 result.programWhereClauseOrNull = this.programWhereClauseOrNull;
78 return result;
79 }
80
81
82 @Override
83 public boolean doApply(SynchroDatabaseMetadata meta, TableMetadata table) {
84 return super.doApply(meta, table)
85 && programWhereClauseOrNull != null
86 && hasColumns(table, DatabaseColumns.PROG_CD.name());
87 }
88
89
90
91
92
93
94
95
96
97 @Subscribe
98 public void handleQuery(CreateQueryEvent e) {
99
100 switch (e.queryName) {
101 case count:
102 case countFromUpdateDate:
103 case select:
104 case selectFromUpdateDate:
105 case selectMaxUpdateDate:
106
107 e.sql = addRestriction(e.source, e.queryName, e.sql);
108
109 default:
110 break;
111 }
112 }
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 protected String addRestriction(SynchroTableMetadata table, SynchroQueryName queryName, String sql) {
130 SynchroQueryBuilder queryBuilder = SynchroQueryBuilder.newBuilder(sql);
131
132
133 queryBuilder.addWhere(SynchroQueryOperator.AND, programWhereClauseOrNull);
134 return queryBuilder.build();
135 }
136 }