1
|
// $Id$
|
2
|
/**
|
3
|
* Copyright (C) 2007 EDIT
|
4
|
* European Distributed Institute of Taxonomy
|
5
|
* http://www.e-taxonomy.eu
|
6
|
*
|
7
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
8
|
* See LICENSE.TXT at the top of this package for the full license terms.
|
9
|
*/
|
10
|
|
11
|
package eu.etaxonomy.cdm.io.berlinModel.in.validation;
|
12
|
|
13
|
import java.sql.ResultSet;
|
14
|
import java.sql.SQLException;
|
15
|
|
16
|
import org.apache.commons.lang.StringUtils;
|
17
|
import org.apache.log4j.Logger;
|
18
|
|
19
|
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
|
20
|
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
|
21
|
import eu.etaxonomy.cdm.io.common.IOValidator;
|
22
|
import eu.etaxonomy.cdm.io.common.Source;
|
23
|
|
24
|
/**
|
25
|
* @author a.mueller
|
26
|
* @created 17.02.2010
|
27
|
*/
|
28
|
public class BerlinModelTaxonRelationImportValidator implements IOValidator<BerlinModelImportState> {
|
29
|
@SuppressWarnings("unused")
|
30
|
private static final Logger logger = Logger.getLogger(BerlinModelTaxonRelationImportValidator.class);
|
31
|
|
32
|
@Override
|
33
|
public boolean validate(BerlinModelImportState state) {
|
34
|
boolean result = true;
|
35
|
result &= checkInActivatedStatus(state);
|
36
|
result &= checkSynonymRelationsWithAcceptedTaxa(state);
|
37
|
result &= checkConceptRelationsWithSynonymTaxa(state);
|
38
|
result &= checkRelPTaxonWithNotes(state);
|
39
|
result &= checkTaxaWithNoRelations(state);
|
40
|
return result;
|
41
|
}
|
42
|
|
43
|
|
44
|
private boolean checkInActivatedStatus(BerlinModelImportState state){
|
45
|
try {
|
46
|
boolean result = true;
|
47
|
BerlinModelImportConfigurator config = state.getConfig();
|
48
|
Source source = state.getConfig().getSource();
|
49
|
String strSQL =
|
50
|
" SELECT RelPTaxon.RelPTaxonId, RelPTaxon.RelQualifierFk, FromName.FullNameCache AS FromName, RelPTaxon.PTNameFk1 AS FromNameID, " +
|
51
|
" Status.Status AS FromStatus, ToName.FullNameCache AS ToName, RelPTaxon.PTNameFk2 AS ToNameId, ToStatus.Status AS ToStatus, FromTaxon.DoubtfulFlag AS doubtfulFrom, ToTaxon.DoubtfulFlag AS doubtfulTo" +
|
52
|
" FROM PTaxon AS FromTaxon " +
|
53
|
" INNER JOIN RelPTaxon ON FromTaxon.PTNameFk = RelPTaxon.PTNameFk1 AND FromTaxon.PTRefFk = RelPTaxon.PTRefFk1 " +
|
54
|
" INNER JOIN PTaxon AS ToTaxon ON RelPTaxon.PTNameFk2 = ToTaxon.PTNameFk AND RelPTaxon.PTRefFk2 = ToTaxon.PTRefFk " +
|
55
|
" INNER JOIN Name AS ToName ON ToTaxon.PTNameFk = ToName.NameId " +
|
56
|
" INNER JOIN Name AS FromName ON FromTaxon.PTNameFk = FromName.NameId " +
|
57
|
" INNER JOIN Status ON FromTaxon.StatusFk = Status.StatusId AND FromTaxon.StatusFk = Status.StatusId " +
|
58
|
" INNER JOIN Status AS ToStatus ON ToTaxon.StatusFk = ToStatus.StatusId AND ToTaxon.StatusFk = ToStatus.StatusId " +
|
59
|
" WHERE (RelPTaxon.RelQualifierFk = - 99) ";
|
60
|
|
61
|
if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
|
62
|
strSQL += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
|
63
|
" ( %s ) )" , config.getRelTaxaIdQuery()) ;
|
64
|
}
|
65
|
|
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)) ";
|
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 a accepted taxon relationship!");
|
222
|
System.out.println("========================================================");
|
223
|
}
|
224
|
|
225
|
int relPTaxonId = rs.getInt("RelPTaxonId");
|
226
|
String relType = rs.getString("RelPTQualifier");
|
227
|
int fromIdentifier = rs.getInt("RIdentifier");
|
228
|
String fromName = rs.getString("fromName");
|
229
|
int fromRefFk = rs.getInt("PTRefFk");
|
230
|
int fromNameId = rs.getInt("fromNameId");
|
231
|
String toName = rs.getString("acceptedName");
|
232
|
|
233
|
System.out.println("RelPTaxonId:" + relPTaxonId +
|
234
|
"\n TaxonRIdentifier: " + fromIdentifier + "\n name: " + fromName + "\n nameId: " + fromNameId + "\n RefFk: " + fromRefFk + "\n RelType: " + relType
|
235
|
+ "\n toName: " + toName //+ "\n ToNameId: " + toNameId + "\n ToStatus: " + toStatus + "\n ToDoubtful: " + doubtfulTo )
|
236
|
);
|
237
|
success = (firstRow = false);
|
238
|
}
|
239
|
} catch (SQLException e) {
|
240
|
e.printStackTrace();
|
241
|
}
|
242
|
return success;
|
243
|
}
|
244
|
|
245
|
/**
|
246
|
* @param state
|
247
|
* @return
|
248
|
*/
|
249
|
private boolean checkTaxaWithNoRelations(BerlinModelImportState state) {
|
250
|
boolean success = true;
|
251
|
try {
|
252
|
BerlinModelImportConfigurator config = state.getConfig();
|
253
|
|
254
|
Source source = config.getSource();
|
255
|
String strQuery =
|
256
|
" SELECT pt.PTRefFk AS secRefFk, dbo.Reference.RefCache AS secRef, dbo.Name.FullNameCache, Name.NameId, Status.Status " +
|
257
|
" FROM PTaxon AS pt LEFT OUTER JOIN " +
|
258
|
" Status ON pt.StatusFk = Status.StatusId LEFT OUTER JOIN " +
|
259
|
" Reference ON pt.PTRefFk = dbo.Reference.RefId LEFT OUTER JOIN " +
|
260
|
" Name ON pt.PTNameFk = dbo.Name.NameId LEFT OUTER JOIN " +
|
261
|
" RelPTaxon ON pt.PTNameFk = dbo.RelPTaxon.PTNameFk2 AND pt.PTRefFk = dbo.RelPTaxon.PTRefFk2 LEFT OUTER JOIN " +
|
262
|
" RelPTaxon AS RelPTaxon_1 ON pt.PTNameFk = RelPTaxon_1.PTNameFk1 AND pt.PTRefFk = RelPTaxon_1.PTRefFk1 " +
|
263
|
" WHERE (RelPTaxon_1.RelQualifierFk IS NULL) AND (dbo.RelPTaxon.RelQualifierFk IS NULL) " +
|
264
|
" ORDER BY Reference.RefCache, pt.PTRefFk, Name.FullNameCache, statusFK";
|
265
|
|
266
|
//project filter
|
267
|
// if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
|
268
|
// strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
|
269
|
// " ( %s ) )" , config.getRelTaxaIdQuery()) ;
|
270
|
// }
|
271
|
|
272
|
ResultSet rs = source.getResultSet(strQuery);
|
273
|
boolean firstRow = true;
|
274
|
while (rs.next()){
|
275
|
if (firstRow){
|
276
|
System.out.println("========================================================");
|
277
|
System.out.println("There are taxa without any taxon relationship!");
|
278
|
System.out.println("========================================================");
|
279
|
}
|
280
|
|
281
|
int secRefFk = rs.getInt("secRefFk");
|
282
|
String secRef = rs.getString("secRef");
|
283
|
String nameCache = rs.getString("FullNameCache");
|
284
|
int nameId = rs.getInt("NameId");
|
285
|
String status = rs.getString("Status");
|
286
|
|
287
|
System.out.println("SecRef:" + secRefFk +
|
288
|
"\n secRef: " + secRef + "\n name: " + nameCache + "\n nameId: " + nameId
|
289
|
+ "\n status: " + status
|
290
|
);
|
291
|
success = (firstRow = false);
|
292
|
}
|
293
|
} catch (SQLException e) {
|
294
|
e.printStackTrace();
|
295
|
}
|
296
|
return success;
|
297
|
}
|
298
|
|
299
|
|
300
|
|
301
|
}
|