1
2
3
4
5
6
7
8
9
10 package eu.etaxonomy.cdm.io.erms;
11
12 import java.sql.ResultSet;
13 import java.sql.SQLException;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.Map;
17 import java.util.Set;
18 import java.util.UUID;
19
20 import org.apache.log4j.Logger;
21 import org.springframework.stereotype.Component;
22
23 import eu.etaxonomy.cdm.common.CdmUtils;
24 import eu.etaxonomy.cdm.io.common.IOValidator;
25 import eu.etaxonomy.cdm.io.common.mapping.DbIgnoreMapper;
26 import eu.etaxonomy.cdm.io.common.mapping.DbImportExtensionMapper;
27 import eu.etaxonomy.cdm.io.common.mapping.DbImportMapping;
28 import eu.etaxonomy.cdm.io.common.mapping.DbImportObjectCreationMapper;
29 import eu.etaxonomy.cdm.io.common.mapping.DbImportStringMapper;
30 import eu.etaxonomy.cdm.io.common.mapping.DbNotYetImplementedMapper;
31 import eu.etaxonomy.cdm.io.common.mapping.IMappingImport;
32 import eu.etaxonomy.cdm.io.erms.validation.ErmsTaxonImportValidator;
33 import eu.etaxonomy.cdm.model.common.CdmBase;
34 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
35 import eu.etaxonomy.cdm.model.name.NonViralName;
36 import eu.etaxonomy.cdm.model.name.Rank;
37 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
38 import eu.etaxonomy.cdm.model.taxon.Synonym;
39 import eu.etaxonomy.cdm.model.taxon.Taxon;
40 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
41
42
43
44
45
46
47
48 @Component
49 public class ErmsTaxonImport extends ErmsImportBase<TaxonBase> implements IMappingImport<TaxonBase, ErmsImportState>{
50 private static final Logger logger = Logger.getLogger(ErmsTaxonImport.class);
51
52 public static final UUID TNS_EXT_UUID = UUID.fromString("41cb0450-ac84-4d73-905e-9c7773c23b05");
53
54 private DbImportMapping mapping;
55
56
57 private boolean isSecondPath = false;
58
59 private int modCount = 10000;
60 private static final String pluralString = "taxa";
61 private static final String dbTableName = "tu";
62 private static final Class cdmTargetClass = TaxonBase.class;
63
64 public ErmsTaxonImport(){
65 super(pluralString, dbTableName, cdmTargetClass);
66 }
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 protected DbImportMapping getMapping() {
84 if (mapping == null){
85 mapping = new DbImportMapping();
86
87 mapping.addMapper(DbImportObjectCreationMapper.NewInstance(this, "id", TAXON_NAMESPACE));
88 UUID tsnUuid = ErmsTransformer.uuidTsn;
89 mapping.addMapper(DbImportExtensionMapper.NewInstance("tsn", tsnUuid, "TSN", "TSN", "TSN"));
90
91
92 UUID displayNameUuid = ErmsTransformer.uuidDisplayName;
93 mapping.addMapper(DbImportExtensionMapper.NewInstance("tu_displayname", displayNameUuid, "display name", "display name", "display name"));
94 UUID fuzzyNameUuid = ErmsTransformer.uuidFuzzyName;
95 mapping.addMapper(DbImportExtensionMapper.NewInstance("tu_fuzzyname", fuzzyNameUuid, "fuzzy name", "fuzzy name", "fuzzy name"));
96 mapping.addMapper(DbImportStringMapper.NewInstance("tu_authority", "(NonViralName)name.authorshipCache"));
97
98 UUID fossilStatusUuid = ErmsTransformer.uuidFossilStatus;
99 mapping.addMapper(DbImportExtensionMapper.NewInstance("fossil_name", fossilStatusUuid, "fossil status", "fossil status", "fos. stat."));
100
101
102 UUID credibilityUuid = ErmsTransformer.uuidCredibility;
103 mapping.addMapper(DbImportExtensionMapper.NewInstance("tu_credibility", credibilityUuid, "credibility", "credibility", "credibility"));
104
105 UUID completenessUuid = ErmsTransformer.uuidCompleteness;
106 mapping.addMapper(DbImportExtensionMapper.NewInstance("tu_completeness", completenessUuid, "completeness", "completeness", "completeness"));
107
108 UUID unacceptUuid = ErmsTransformer.uuidUnacceptReason;
109 mapping.addMapper(DbImportExtensionMapper.NewInstance("tu_unacceptreason", unacceptUuid, "unaccept reason", "unaccept reason", "reason"));
110
111 UUID qualityUuid = ErmsTransformer.uuidQualityStatus;
112 mapping.addMapper(DbImportExtensionMapper.NewInstance("qualitystatus_name", qualityUuid, "quality status", "quality status", "quality status"));
113
114
115
116
117
118
119 mapping.addMapper(DbIgnoreMapper.NewInstance("tu_marine", "marine flag not implemented in PESI"));
120 mapping.addMapper(DbIgnoreMapper.NewInstance("tu_brackish", "brackish flag not implemented in PESI"));
121 mapping.addMapper(DbIgnoreMapper.NewInstance("tu_fresh", "freshwater flag not implemented in PESI"));
122 mapping.addMapper(DbIgnoreMapper.NewInstance("tu_terrestrial", "terrestrial flag not implemented in PESI"));
123 mapping.addMapper(DbIgnoreMapper.NewInstance("tu_fossil", "tu_fossil implemented as foreign key"));
124 mapping.addMapper(DbIgnoreMapper.NewInstance("cache_citation", "citation cache not needed in PESI"));
125 mapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_sp", "included in rank/object creation"));
126
127
128
129 mapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_hidden", "Needs DbImportMarkerMapper implemented"));
130
131
132
133
134
135
136
137
138
139 }
140 return mapping;
141 }
142
143
144
145
146 @Override
147 protected String getRecordQuery(ErmsImportConfigurator config) {
148 String strSelect = " SELECT tu.*, parent1.tu_name AS parent1name, parent2.tu_name AS parent2name, parent3.tu_name AS parent3name, "
149 + " parent1.tu_rank AS parent1rank, parent2.tu_rank AS parent2rank, parent3.tu_rank AS parent3rank, " +
150 " status.status_id as status_id, fossil.fossil_name, qualitystatus.qualitystatus_name";
151 String strFrom = " FROM tu LEFT OUTER JOIN tu AS parent1 ON parent1.id = tu.tu_parent " +
152 " LEFT OUTER JOIN tu AS parent2 ON parent2.id = parent1.tu_parent " +
153 " LEFT OUTER JOIN tu AS parent3 ON parent2.tu_parent = parent3.id " +
154 " LEFT OUTER JOIN status ON tu.tu_status = status.status_id " +
155 " LEFT OUTER JOIN fossil ON tu.tu_fossil = fossil.fossil_id " +
156 " LEFT OUTER JOIN qualitystatus ON tu.tu_qualitystatus = qualitystatus.id ";
157 String strWhere = " WHERE ( tu.id IN (" + ID_LIST_TOKEN + ") )";
158 String strRecordQuery = strSelect + strFrom + strWhere;
159 return strRecordQuery;
160 }
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185 @Override
186 protected boolean doInvoke(ErmsImportState state) {
187
188 boolean success = super.doInvoke(state);
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212 return success;
213
214 }
215
216
217
218
219
220
221 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
222 String nameSpace;
223 Class cdmClass;
224 Set<String> idSet;
225 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
226
227 try{
228 Set<String> nameIdSet = new HashSet<String>();
229 Set<String> referenceIdSet = new HashSet<String>();
230 while (rs.next()){
231
232
233 }
234
235
236
237
238
239
240
241 } catch (SQLException e) {
242 throw new RuntimeException(e);
243 }
244 return result;
245 }
246
247
248
249
250
251 public TaxonBase createObject(ResultSet rs, ErmsImportState state) throws SQLException {
252 int statusId = rs.getInt("status_id");
253 String tuName = rs.getString("tu_name");
254 String displayName = rs.getString("tu_displayname");
255
256 String parent1Name = rs.getString("parent1name");
257 Integer parent1Rank = rs.getInt("parent1rank");
258
259 String parent2Name = rs.getString("parent2name");
260 Integer parent2Rank = rs.getInt("parent2rank");
261
262 String parent3Name = rs.getString("parent3name");
263 Integer parent3Rank = rs.getInt("parent3rank");
264
265
266 NonViralName taxonName = getTaxonName(rs, state);
267
268 if (taxonName.isGenus() || taxonName.isSupraGeneric()){
269 taxonName.setGenusOrUninomial(tuName);
270 }else if (taxonName.isInfraGeneric()){
271 taxonName.setInfraGenericEpithet(tuName);
272 taxonName.setGenusOrUninomial(parent1Name);
273 }else if (taxonName.isSpecies()){
274 taxonName.setSpecificEpithet(tuName);
275 getGenusAndInfraGenus(parent1Name, parent2Name, parent1Rank, taxonName);
276 }else if (taxonName.isInfraSpecific()){
277 if (parent1Rank < 220){
278 handleException(parent1Rank, taxonName, displayName);
279 }
280 taxonName.setInfraSpecificEpithet(tuName);
281 taxonName.setSpecificEpithet(parent1Name);
282 getGenusAndInfraGenus(parent2Name, parent3Name, parent2Rank, taxonName);
283 }else if (taxonName.getRank()== null){
284 logger.warn("rank super domain still needs to be implemented. Used domain instead.");
285 if ("Biota".equalsIgnoreCase(tuName)){
286 Rank rank = Rank.DOMAIN();
287 taxonName.setRank(rank);
288 taxonName.setGenusOrUninomial(tuName);
289 }else{
290 String warning = "TaxonName has no rank. Use namecache.";
291 logger.warn(warning);
292 taxonName.setNameCache(tuName);
293 }
294
295 }
296
297 if (containsBrackets(displayName)){
298 taxonName.setNameCache(displayName);
299 logger.warn("Set name cache: " + displayName);
300 }
301
302
303 ReferenceBase citation = state.getConfig().getSourceReference();
304 addOriginalSource(rs, taxonName, "id", NAME_NAMESPACE, citation);
305
306
307
308 ErmsImportConfigurator config = state.getConfig();
309 ReferenceBase sec = config.getSourceReference();
310 if (statusId == 1){
311 return Taxon.NewInstance(taxonName, sec);
312 }else{
313 return Synonym.NewInstance(taxonName, sec);
314 }
315 }
316
317
318
319
320
321
322
323
324 private void handleException(Integer parent1Rank, NonViralName taxonName, String displayName) {
325 logger.warn("Parent of infra specific taxon is higher than species. Used nameCache: " + displayName) ;
326 taxonName.setNameCache(displayName);
327 }
328
329
330
331
332
333
334
335 private boolean containsBrackets(String displayName) {
336 int index = displayName.indexOf("[");
337 return (index > -1);
338 }
339
340
341
342
343
344
345
346
347
348 private void getGenusAndInfraGenus(String parentName, String grandParentName, Integer parent1Rank, NonViralName taxonName) {
349 if (parent1Rank <220 && parent1Rank > 180){
350
351 taxonName.setInfraGenericEpithet(parentName);
352 taxonName.setGenusOrUninomial(grandParentName);
353 }else{
354 taxonName.setGenusOrUninomial(parentName);
355 }
356 }
357
358
359
360
361
362
363 private NonViralName getTaxonName(ResultSet rs, ErmsImportState state) throws SQLException {
364 NonViralName result;
365 Integer kingdomId = parseKingdomId(rs);
366 Integer intRank = rs.getInt("tu_rank");
367
368 NomenclaturalCode nc = ErmsTransformer.kingdomId2NomCode(kingdomId);
369 Rank rank = null;
370 if (kingdomId != null){
371 rank = state.getRank(intRank, kingdomId);
372 }else{
373 logger.warn("KingdomId is null");
374 }
375 if (rank == null){
376 logger.warn("Rank is null. KingdomId: " + kingdomId + ", rankId: " + intRank);
377 }
378 if (nc != null){
379 result = (NonViralName)nc.getNewTaxonNameInstance(rank);
380 }else{
381 result = NonViralName.NewInstance(rank);
382 }
383
384 return result;
385 }
386
387
388
389
390
391
392
393
394
395 private int parseKingdomId(ResultSet rs) throws SQLException {
396 Integer result = null;
397 String treeString = rs.getString("tu_sp");
398 if (treeString != null){
399 if (CdmUtils.isNotEmpty(treeString) && treeString.length() > 1){
400 String strKingdom = treeString.substring(1,2);
401
402 if (! treeString.substring(0, 1).equals("#") && ! treeString.substring(2, 3).equals("#") ){
403 logger.warn("Tree string " + treeString + " has no recognized format");
404 }else{
405 try {
406 result = Integer.valueOf(strKingdom);
407 } catch (NumberFormatException e) {
408 logger.warn("Kingdom string " + strKingdom + "could not be recognized as a valid number");
409 }
410 }
411 }
412 }else{
413 Integer tu_id = rs.getInt("id");
414 result = tu_id;
415 }
416 return result;
417 }
418
419
420
421
422
423 @Override
424 protected boolean doCheck(ErmsImportState state){
425 IOValidator<ErmsImportState> validator = new ErmsTaxonImportValidator();
426 return validator.validate(state);
427 }
428
429
430
431
432
433 protected boolean isIgnore(ErmsImportState state){
434 return ! state.getConfig().isDoTaxa();
435 }
436
437
438
439 }