1
|
/**
|
2
|
* Copyright (C) 2007 EDIT
|
3
|
* European Distributed Institute of Taxonomy
|
4
|
* http://www.e-taxonomy.eu
|
5
|
*
|
6
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
7
|
* See LICENSE.TXT at the top of this package for the full license terms.
|
8
|
*/
|
9
|
|
10
|
package eu.etaxonomy.cdm.io.berlinModel.in.validation;
|
11
|
|
12
|
import java.sql.ResultSet;
|
13
|
import java.sql.SQLException;
|
14
|
|
15
|
import org.apache.commons.lang.StringUtils;
|
16
|
import org.apache.log4j.Logger;
|
17
|
|
18
|
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
|
19
|
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
|
20
|
import eu.etaxonomy.cdm.io.common.IOValidator;
|
21
|
import eu.etaxonomy.cdm.io.common.Source;
|
22
|
|
23
|
/**
|
24
|
* @author a.mueller
|
25
|
* @since 17.02.2010
|
26
|
*/
|
27
|
public class BerlinModelTaxonRelationImportValidator implements IOValidator<BerlinModelImportState> {
|
28
|
@SuppressWarnings("unused")
|
29
|
private static final Logger logger = Logger.getLogger(BerlinModelTaxonRelationImportValidator.class);
|
30
|
|
31
|
@Override
|
32
|
public boolean validate(BerlinModelImportState state) {
|
33
|
boolean result = true;
|
34
|
result &= checkInActivatedStatus(state);
|
35
|
result &= checkSynonymRelationsWithAcceptedTaxa(state);
|
36
|
result &= checkConceptRelationsWithSynonymTaxa(state);
|
37
|
result &= checkRelPTaxonWithNotes(state);
|
38
|
result &= checkTaxaWithNoRelations(state);
|
39
|
return result;
|
40
|
}
|
41
|
|
42
|
|
43
|
private boolean checkInActivatedStatus(BerlinModelImportState state){
|
44
|
try {
|
45
|
boolean result = true;
|
46
|
BerlinModelImportConfigurator config = state.getConfig();
|
47
|
Source source = state.getConfig().getSource();
|
48
|
String strSQL =
|
49
|
" SELECT RelPTaxon.RelPTaxonId, RelPTaxon.RelQualifierFk, FromName.FullNameCache AS FromName, RelPTaxon.PTNameFk1 AS FromNameID, " +
|
50
|
" Status.Status AS FromStatus, ToName.FullNameCache AS ToName, RelPTaxon.PTNameFk2 AS ToNameId, ToStatus.Status AS ToStatus, FromTaxon.DoubtfulFlag AS doubtfulFrom, ToTaxon.DoubtfulFlag AS doubtfulTo" +
|
51
|
" FROM PTaxon AS FromTaxon " +
|
52
|
" INNER JOIN RelPTaxon ON FromTaxon.PTNameFk = RelPTaxon.PTNameFk1 AND FromTaxon.PTRefFk = RelPTaxon.PTRefFk1 " +
|
53
|
" INNER JOIN PTaxon AS ToTaxon ON RelPTaxon.PTNameFk2 = ToTaxon.PTNameFk AND RelPTaxon.PTRefFk2 = ToTaxon.PTRefFk " +
|
54
|
" INNER JOIN Name AS ToName ON ToTaxon.PTNameFk = ToName.NameId " +
|
55
|
" INNER JOIN Name AS FromName ON FromTaxon.PTNameFk = FromName.NameId " +
|
56
|
" INNER JOIN Status ON FromTaxon.StatusFk = Status.StatusId AND FromTaxon.StatusFk = Status.StatusId " +
|
57
|
" INNER JOIN Status AS ToStatus ON ToTaxon.StatusFk = ToStatus.StatusId AND ToTaxon.StatusFk = ToStatus.StatusId " +
|
58
|
" WHERE (RelPTaxon.RelQualifierFk = - 99) ";
|
59
|
|
60
|
if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
|
61
|
strSQL += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
|
62
|
" ( %s ) )" , config.getRelTaxaIdQuery()) ;
|
63
|
}
|
64
|
|
65
|
// System.out.println(strSQL);
|
66
|
ResultSet rs = source.getResultSet(strSQL);
|
67
|
boolean firstRow = true;
|
68
|
int i = 0;
|
69
|
while (rs.next()){
|
70
|
i++;
|
71
|
if (firstRow){
|
72
|
System.out.println("========================================================");
|
73
|
System.out.println("There are TaxonRelationships with status 'inactivated'(-99)!");
|
74
|
System.out.println("========================================================");
|
75
|
}
|
76
|
|
77
|
int relPTaxonId = rs.getInt("RelPTaxonId");
|
78
|
String fromName = rs.getString("FromName");
|
79
|
int fromNameID = rs.getInt("FromNameID");
|
80
|
String fromStatus = rs.getString("FromStatus");
|
81
|
|
82
|
String toName = rs.getString("ToName");
|
83
|
int toNameId = rs.getInt("ToNameId");
|
84
|
String toStatus = rs.getString("ToStatus");
|
85
|
String doubtfulFrom = String.valueOf(rs.getObject("doubtfulFrom"));
|
86
|
String doubtfulTo = String.valueOf(rs.getObject("doubtfulTo"));
|
87
|
|
88
|
|
89
|
System.out.println("RelPTaxonId:" + relPTaxonId +
|
90
|
"\n FromName: " + fromName + "\n FromNameID: " + fromNameID + "\n FromStatus: " + fromStatus + "\n FromDoubtful: " + doubtfulFrom +
|
91
|
"\n ToName: " + toName + "\n ToNameId: " + toNameId + "\n ToStatus: " + toStatus + "\n ToDoubtful: " + doubtfulTo );
|
92
|
result = firstRow = false;
|
93
|
}
|
94
|
if (i > 0){
|
95
|
System.out.println(" ");
|
96
|
}
|
97
|
|
98
|
return result;
|
99
|
} catch (SQLException e) {
|
100
|
e.printStackTrace();
|
101
|
return false;
|
102
|
}
|
103
|
}
|
104
|
|
105
|
/**
|
106
|
* @param state
|
107
|
* @return
|
108
|
*/
|
109
|
private boolean checkRelPTaxonWithNotes(BerlinModelImportState state) {
|
110
|
boolean success = true;
|
111
|
try {
|
112
|
BerlinModelImportConfigurator config = state.getConfig();
|
113
|
Source source = config.getSource();
|
114
|
String strQuery =
|
115
|
"SELECT count(*) AS n FROM RelPTaxon " +
|
116
|
" WHERE (Notes IS NOT NULL) AND (RTRIM(LTRIM(Notes)) <> '') ";
|
117
|
|
118
|
if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
|
119
|
strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
|
120
|
" ( %s ) ) " , config.getRelTaxaIdQuery()) ;
|
121
|
}
|
122
|
|
123
|
ResultSet rs = source.getResultSet(strQuery);
|
124
|
rs.next();
|
125
|
int n;
|
126
|
n = rs.getInt("n");
|
127
|
if (n > 0){
|
128
|
System.out.println("========================================================");
|
129
|
System.out.println("There are " + n + " RelPTaxa with a note. Notes for RelPTaxa are not imported!");
|
130
|
System.out.println("========================================================");
|
131
|
success = false;
|
132
|
|
133
|
}
|
134
|
} catch (SQLException e) {
|
135
|
e.printStackTrace();
|
136
|
}
|
137
|
return success;
|
138
|
}
|
139
|
|
140
|
/**
|
141
|
* @param state
|
142
|
* @return
|
143
|
*/
|
144
|
private boolean checkSynonymRelationsWithAcceptedTaxa(BerlinModelImportState state) {
|
145
|
boolean success = true;
|
146
|
try {
|
147
|
BerlinModelImportConfigurator config = state.getConfig();
|
148
|
|
149
|
Source source = config.getSource();
|
150
|
String strQuery =
|
151
|
"SELECT RelPTaxon.RelPTaxonId, RelPTQualifier, PTaxon.RIdentifier, Name.FullNameCache fromName, PTaxon.PTRefFk, Name.NameId as fromNameId, AcceptedName.FullNameCache acceptedName" +
|
152
|
" FROM RelPTaxon INNER JOIN PTaxon ON RelPTaxon.PTNameFk1 = PTaxon.PTNameFk AND RelPTaxon.PTRefFk1 = PTaxon.PTRefFk " +
|
153
|
" INNER JOIN RelPTQualifier ON RelPTaxon.RelQualifierFk = RelPTQualifier.RelPTQualifierId " +
|
154
|
" LEFT OUTER JOIN Name ON PTaxon.PTNameFk = Name.NameId " +
|
155
|
" LEFT OUTER JOIN Name AS AcceptedName ON RelPTaxon.PTNameFk2 = AcceptedName.NameId " +
|
156
|
" WHERE (PTaxon.StatusFk = 1) AND (RelPTaxon.RelQualifierFk IN (2, 4, 5, 6, 7)) ";
|
157
|
|
158
|
if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
|
159
|
strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
|
160
|
" ( %s ) )" , config.getRelTaxaIdQuery()) ;
|
161
|
}
|
162
|
|
163
|
ResultSet rs = source.getResultSet(strQuery);
|
164
|
boolean firstRow = true;
|
165
|
while (rs.next()){
|
166
|
if (firstRow){
|
167
|
System.out.println("========================================================");
|
168
|
System.out.println("There are accepted taxa having synonym role in a synonym relationship!");
|
169
|
System.out.println("========================================================");
|
170
|
}
|
171
|
|
172
|
int relPTaxonId = rs.getInt("RelPTaxonId");
|
173
|
String relType = rs.getString("RelPTQualifier");
|
174
|
int fromIdentifier = rs.getInt("RIdentifier");
|
175
|
String fromName = rs.getString("fromName");
|
176
|
int fromRefFk = rs.getInt("PTRefFk");
|
177
|
int fromNameId = rs.getInt("fromNameId");
|
178
|
String toName = rs.getString("acceptedName");
|
179
|
|
180
|
System.out.println("RelPTaxonId:" + relPTaxonId +
|
181
|
"\n TaxonRIdentifier: " + fromIdentifier + "\n name: " + fromName + "\n nameId: " + fromNameId + "\n RefFk: " + fromRefFk + "\n RelType: " + relType
|
182
|
+ "\n acceptedName: " + toName //+ "\n ToNameId: " + toNameId + "\n ToStatus: " + toStatus + "\n ToDoubtful: " + doubtfulTo )
|
183
|
);
|
184
|
success = (firstRow = false);
|
185
|
}
|
186
|
} catch (SQLException e) {
|
187
|
e.printStackTrace();
|
188
|
}
|
189
|
return success;
|
190
|
}
|
191
|
|
192
|
|
193
|
/**
|
194
|
* @param state
|
195
|
* @return
|
196
|
*/
|
197
|
private boolean checkConceptRelationsWithSynonymTaxa(BerlinModelImportState state) {
|
198
|
boolean success = true;
|
199
|
try {
|
200
|
BerlinModelImportConfigurator config = state.getConfig();
|
201
|
|
202
|
Source source = config.getSource();
|
203
|
String strQuery =
|
204
|
"SELECT RelPTaxon.RelPTaxonId, RelPTQualifier, PTaxon.RIdentifier,PTaxon.StatusFk as fromStatus, Name.FullNameCache fromName, PTaxon.PTRefFk, Name.NameId as fromNameId, AcceptedName.FullNameCache acceptedName" +
|
205
|
" FROM RelPTaxon INNER JOIN PTaxon ON RelPTaxon.PTNameFk1 = PTaxon.PTNameFk AND RelPTaxon.PTRefFk1 = PTaxon.PTRefFk " +
|
206
|
" INNER JOIN RelPTQualifier ON RelPTaxon.RelQualifierFk = RelPTQualifier.RelPTQualifierId " +
|
207
|
" LEFT OUTER JOIN Name ON PTaxon.PTNameFk = Name.NameId " +
|
208
|
" LEFT OUTER JOIN Name AS AcceptedName ON RelPTaxon.PTNameFk2 = AcceptedName.NameId " +
|
209
|
" WHERE (PTaxon.StatusFk IN (2,3,4)) AND (RelPTaxon.RelQualifierFk NOT IN (2, 4, 5, 6, 7, 101, 102, 103, 104, -99)) ";
|
210
|
|
211
|
if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
|
212
|
strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
|
213
|
" ( %s ) )" , config.getRelTaxaIdQuery()) ;
|
214
|
}
|
215
|
|
216
|
ResultSet rs = source.getResultSet(strQuery);
|
217
|
boolean firstRow = true;
|
218
|
while (rs.next()){
|
219
|
if (firstRow){
|
220
|
System.out.println("========================================================");
|
221
|
System.out.println("There are synonyms being part of an accepted taxon relationship!");
|
222
|
System.out.println("--------------------------------------------------------");
|
223
|
System.out.println(strQuery);
|
224
|
System.out.println("========================================================");
|
225
|
}
|
226
|
|
227
|
int relPTaxonId = rs.getInt("RelPTaxonId");
|
228
|
String relType = rs.getString("RelPTQualifier");
|
229
|
int fromIdentifier = rs.getInt("RIdentifier");
|
230
|
String fromName = rs.getString("fromName");
|
231
|
int fromRefFk = rs.getInt("PTRefFk");
|
232
|
int fromNameId = rs.getInt("fromNameId");
|
233
|
String toName = rs.getString("acceptedName");
|
234
|
|
235
|
System.out.println("RelPTaxonId:" + relPTaxonId +
|
236
|
"\n TaxonRIdentifier: " + fromIdentifier + "\n name: " + fromName + "\n nameId: " + fromNameId + "\n RefFk: " + fromRefFk + "\n RelType: " + relType
|
237
|
+ "\n toName: " + toName //+ "\n ToNameId: " + toNameId + "\n ToStatus: " + toStatus + "\n ToDoubtful: " + doubtfulTo )
|
238
|
);
|
239
|
success = (firstRow = false);
|
240
|
}
|
241
|
} catch (SQLException e) {
|
242
|
e.printStackTrace();
|
243
|
}
|
244
|
return success;
|
245
|
}
|
246
|
|
247
|
/**
|
248
|
* @param state
|
249
|
* @return
|
250
|
*/
|
251
|
private boolean checkTaxaWithNoRelations(BerlinModelImportState state) {
|
252
|
boolean success = true;
|
253
|
try {
|
254
|
BerlinModelImportConfigurator config = state.getConfig();
|
255
|
|
256
|
Source source = config.getSource();
|
257
|
String strSelect = " SELECT pt.PTRefFk AS secRefFk, r.RefCache AS secRef, n.FullNameCache, n.NameId, st.Status ";
|
258
|
String strCount = " SELECT count(*) as n ";
|
259
|
String strQueryBase =
|
260
|
" FROM PTaxon AS pt LEFT OUTER JOIN " +
|
261
|
" Status st ON pt.StatusFk = st.StatusId LEFT OUTER JOIN " +
|
262
|
" Reference r ON pt.PTRefFk = r.RefId LEFT OUTER JOIN " +
|
263
|
" Name n ON pt.PTNameFk = n.NameId LEFT OUTER JOIN " +
|
264
|
" RelPTaxon rel1 ON pt.PTNameFk = rel1.PTNameFk2 AND pt.PTRefFk = rel1.PTRefFk2 LEFT OUTER JOIN " +
|
265
|
" RelPTaxon AS rel2 ON pt.PTNameFk = rel2.PTNameFk1 AND pt.PTRefFk = rel2.PTRefFk1 " +
|
266
|
" WHERE (rel2.RelQualifierFk IS NULL) AND (rel1.RelQualifierFk IS NULL) AND pt.statusFK <> 6 ";
|
267
|
String strOrderBy = " ORDER BY r.RefCache, pt.PTRefFk, n.FullNameCache, pt.statusFK ";
|
268
|
if (state.getConfig().isEuroMed()){
|
269
|
strQueryBase += " AND pt.RIdentifier IN (SELECT RIdentifier FROM v_cdm_exp_taxaAll) AND (pt.IsExcludedMarker = 0 OR pt.IsExcludedMarker IS NULL) " ;
|
270
|
}
|
271
|
|
272
|
//project filter
|
273
|
// if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
|
274
|
// strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
|
275
|
// " ( %s ) )" , config.getRelTaxaIdQuery()) ;
|
276
|
// }
|
277
|
|
278
|
ResultSet rs = source.getResultSet(strCount + strQueryBase);
|
279
|
rs.next();
|
280
|
int n = rs.getInt("n");
|
281
|
if (n > 0){
|
282
|
System.out.println("=======================================================================");
|
283
|
System.out.println("There are "+n+" taxa without any taxon relationship and not being orphaned!");
|
284
|
System.out.println("=======================================================================");
|
285
|
}
|
286
|
|
287
|
rs = source.getResultSet(strSelect + strQueryBase + strOrderBy);
|
288
|
while (rs.next()){
|
289
|
|
290
|
int secRefFk = rs.getInt("secRefFk");
|
291
|
String secRef = rs.getString("secRef");
|
292
|
String nameCache = rs.getString("FullNameCache");
|
293
|
int nameId = rs.getInt("NameId");
|
294
|
String status = rs.getString("Status");
|
295
|
|
296
|
System.out.println("SecRef:" + secRefFk +
|
297
|
"\n secRef: " + secRef + "\n name: " + nameCache + "\n nameId: " + nameId
|
298
|
+ "\n status: " + status
|
299
|
);
|
300
|
}
|
301
|
success = (n == 0);
|
302
|
} catch (SQLException e) {
|
303
|
e.printStackTrace();
|
304
|
success = false;
|
305
|
}
|
306
|
return success;
|
307
|
}
|
308
|
|
309
|
|
310
|
|
311
|
}
|