2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.io
.berlinModel
.in
;
12 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_HETEROTYPIC_SYNONYM_OF
;
13 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_HOMOTYPIC_SYNONYM_OF
;
14 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_INCLUDED_IN
;
15 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_MISAPPLIED_NAME_OF
;
16 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF
;
17 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF
;
18 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_PARTIAL_SYN_OF
;
19 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF
;
20 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF
;
21 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_PROPARTE_SYN_OF
;
22 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.TAX_REL_IS_SYNONYM_OF
;
24 import java
.sql
.ResultSet
;
25 import java
.sql
.SQLException
;
26 import java
.util
.HashMap
;
27 import java
.util
.HashSet
;
30 import java
.util
.UUID
;
32 import org
.apache
.commons
.lang
.StringUtils
;
33 import org
.apache
.log4j
.Logger
;
34 import org
.springframework
.stereotype
.Component
;
35 import org
.springframework
.transaction
.TransactionStatus
;
37 import eu
.etaxonomy
.cdm
.common
.ResultWrapper
;
38 import eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
;
39 import eu
.etaxonomy
.cdm
.io
.berlinModel
.in
.validation
.BerlinModelTaxonRelationImportValidator
;
40 import eu
.etaxonomy
.cdm
.io
.common
.IOValidator
;
41 import eu
.etaxonomy
.cdm
.io
.common
.ResultSetPartitioner
;
42 import eu
.etaxonomy
.cdm
.io
.common
.Source
;
43 import eu
.etaxonomy
.cdm
.model
.common
.AnnotatableEntity
;
44 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
45 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableSource
;
46 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
47 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
48 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
49 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymType
;
50 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
51 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
52 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
53 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
54 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
55 import eu
.etaxonomy
.cdm
.strategy
.exceptions
.UnknownCdmTypeException
;
62 public class BerlinModelTaxonRelationImport
extends BerlinModelImportBase
{
63 private static final Logger logger
= Logger
.getLogger(BerlinModelTaxonRelationImport
.class);
65 public static final String TREE_NAMESPACE
= "PTRefFk";
67 private static int modCount
= 30000;
68 private static final String pluralString
= "taxon relations";
69 private static final String dbTableName
= "RelPTaxon";
72 public BerlinModelTaxonRelationImport(){
73 super(dbTableName
, pluralString
);
77 * Creates a classification for each PTaxon reference which belongs to a taxon that is included at least in one
78 * <i>taxonomically included</i> relationship
81 * @throws SQLException
83 private void makeClassifications(BerlinModelImportState state
) throws SQLException
{
84 logger
.info("start make classification ...");
86 Set
<String
> idSet
= getTreeReferenceIdSet(state
);
89 String nameSpace
= BerlinModelReferenceImport
.REFERENCE_NAMESPACE
;
90 Class
<?
> cdmClass
= Reference
.class;
91 Map
<String
, Reference
> refMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
93 String treeName
= "Classification - No Name";
95 ResultSet rs
= state
.getConfig().getSource().getResultSet(getClassificationQuery(state
)) ;
99 //TODO handle case useSingleClassification = true && sourceSecId = null, which returns no record
103 if ((i
++ % modCount
) == 0 && i
!= 1 ){ logger
.info("RelPTaxa handled: " + (i
-1));}
105 Integer ptRefFkInt
= nullSafeInt(rs
,"PTRefFk");
106 String ptRefFk
= String
.valueOf(ptRefFkInt
);
107 Reference ref
= refMap
.get(ptRefFk
);
109 String refCache
= rs
.getString("RefCache");
110 if (StringUtils
.isNotBlank(refCache
)){
113 if (ref
!= null && StringUtils
.isNotBlank(ref
.getTitleCache())){
114 treeName
= ref
.getTitleCache();
116 Classification tree
= Classification
.NewInstance(treeName
);
117 tree
.setReference(ref
);
118 if (i
== 1 && state
.getConfig().getClassificationUuid() != null){
119 tree
.setUuid(state
.getConfig().getClassificationUuid());
121 IdentifiableSource identifiableSource
= IdentifiableSource
.NewDataImportInstance(ptRefFk
, TREE_NAMESPACE
);
122 tree
.addSource(identifiableSource
);
124 getClassificationService().save(tree
);
125 state
.putClassificationUuidInt(ptRefFkInt
, tree
);
126 } catch (Exception e
) {
127 logger
.error("Error in BerlinModleTaxonRelationImport.makeClassifications: " + e
.getMessage());
131 } catch (SQLException e
) {
132 logger
.error("Error in BerlinModleTaxonRelationImport.makeClassifications: " + e
.getMessage());
135 logger
.info("end make classification ...");
142 * @throws SQLException
144 private Set
<String
> getTreeReferenceIdSet(BerlinModelImportState state
) throws SQLException
{
145 Source source
= state
.getConfig().getSource();
146 Set
<String
> result
= new HashSet
<String
>();
147 ResultSet rs
= source
.getResultSet(getClassificationQuery(state
)) ;
149 Object id
= rs
.getObject("PTRefFk");
150 result
.add(String
.valueOf(id
));
158 private String
getClassificationQuery(BerlinModelImportState state
) {
159 boolean includeAllClassifications
= state
.getConfig().isIncludeAllNonMisappliedRelatedClassifications();
160 String strQuerySelect
= "SELECT PTaxon.PTRefFk, r.RefCache ";
161 String strQueryFrom
= " FROM RelPTaxon " +
162 " INNER JOIN PTaxon AS PTaxon ON RelPTaxon.PTNameFk2 = PTaxon.PTNameFk AND RelPTaxon.PTRefFk2 = PTaxon.PTRefFk " +
163 " INNER JOIN Reference r ON PTaxon.PTRefFk = r.RefId ";
164 String strQueryWhere
= " WHERE (RelPTaxon.RelQualifierFk = 1) ";
165 if (includeAllClassifications
){
166 strQueryWhere
= " WHERE (RelPTaxon.RelQualifierFk <> 3) ";
168 if (state
.getConfig().isUseSingleClassification()){
169 if (state
.getConfig().getSourceSecId()!= null){
170 strQueryWhere
+= " AND PTaxon.PTRefFk = " + state
.getConfig().getSourceSecId() + " ";
172 strQueryWhere
+= " AND (1=0) ";
177 String strQueryGroupBy
= " GROUP BY PTaxon.PTRefFk, r.RefCache ";
178 String strQuery
= strQuerySelect
+ " " + strQueryFrom
+ " " + strQueryWhere
+ " " + strQueryGroupBy
;
181 if (includeAllClassifications
){
183 strQuerySelect
= "SELECT PTaxon.PTRefFk, r.RefCache ";
184 strQueryFrom
= " FROM RelPTaxon rel " +
185 " INNER JOIN PTaxon AS PTaxon ON rel.PTNameFk1 = PTaxon.PTNameFk AND rel.PTRefFk1 = PTaxon.PTRefFk " +
186 " INNER JOIN Reference r ON PTaxon.PTRefFk = r.RefId ";
187 strQueryWhere
=" WHERE (rel.RelQualifierFk <> 3) ";
188 String strAllQuery
= strQuerySelect
+ " " + strQueryFrom
+ " " + strQueryWhere
+ " " + strQueryGroupBy
;
189 strQuery
= strQuery
+ " UNION " + strAllQuery
;
194 boolean includeFlatClassifications
= state
.getConfig().isIncludeFlatClassifications();
196 if (includeFlatClassifications
){
197 String strFlatQuery
=
198 " SELECT pt.PTRefFk AS secRefFk, r.RefCache AS secRef " +
199 " FROM PTaxon AS pt LEFT OUTER JOIN " +
200 " Reference r ON pt.PTRefFk = r.RefId LEFT OUTER JOIN " +
201 " RelPTaxon rel1 ON pt.PTNameFk = rel1.PTNameFk2 AND pt.PTRefFk = rel1.PTRefFk2 LEFT OUTER JOIN " +
202 " RelPTaxon AS rel2 ON pt.PTNameFk = rel2.PTNameFk1 AND pt.PTRefFk = rel2.PTRefFk1 " +
203 " WHERE (rel2.RelQualifierFk IS NULL) AND (rel1.RelQualifierFk IS NULL) " +
204 " GROUP BY pt.PTRefFk, r.RefCache "
207 strQuery
= strQuery
+ " UNION " + strFlatQuery
;
212 if (state
.getConfig().getClassificationQuery() != null){
213 strQuery
= state
.getConfig().getClassificationQuery();
219 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
221 " SELECT RelPTaxon.*, FromTaxon.RIdentifier as taxon1Id, ToTaxon.RIdentifier as taxon2Id, ToTaxon.PTRefFk as treeRefFk, FromTaxon.PTRefFk as fromRefFk, q.is_concept_relation " +
222 " FROM PTaxon as FromTaxon " +
223 " INNER JOIN RelPTaxon ON FromTaxon.PTNameFk = RelPTaxon.PTNameFk1 AND FromTaxon.PTRefFk = RelPTaxon.PTRefFk1 " +
224 " INNER JOIN PTaxon AS ToTaxon ON RelPTaxon.PTNameFk2 = ToTaxon.PTNameFk AND RelPTaxon.PTRefFk2 = ToTaxon.PTRefFk " +
225 " INNER JOIN RelPTQualifier q ON q.RelPTQualifierId = RelPTaxon.RelQualifierFk " +
226 " WHERE RelPTaxon.RelPTaxonId IN ("+ID_LIST_TOKEN
+") ORDER BY RelPTaxon.RelPTaxonId ";
231 public boolean doPartition(ResultSetPartitioner partitioner
, BerlinModelImportState state
) {
232 boolean success
= true ;
233 BerlinModelImportConfigurator config
= state
.getConfig();
234 Set
<TaxonBase
> taxaToSave
= new HashSet
<TaxonBase
>();
235 Map
<String
, TaxonBase
> taxonMap
= partitioner
.getObjectMap(BerlinModelTaxonImport
.NAMESPACE
);
236 Map
<Integer
, Classification
> classificationMap
= new HashMap
<Integer
, Classification
>();
237 Map
<String
, Reference
> refMap
= partitioner
.getObjectMap(BerlinModelReferenceImport
.REFERENCE_NAMESPACE
);
239 ResultSet rs
= partitioner
.getResultSet();
246 if ((i
++ % modCount
) == 0 && i
!= 1 ){ logger
.info("RelPTaxa handled: " + (i
-1));}
248 int relPTaxonId
= rs
.getInt("RelPTaxonId");
249 Integer taxon1Id
= nullSafeInt(rs
, "taxon1Id");
250 Integer taxon2Id
= nullSafeInt(rs
, "taxon2Id");
251 int relQualifierFk
= 0;
253 Integer relRefFk
= nullSafeInt(rs
,"relRefFk");
254 int treeRefFk
= rs
.getInt("treeRefFk");
255 int fromRefFk
= rs
.getInt("fromRefFk");
257 relQualifierFk
= rs
.getInt("relQualifierFk");
258 String notes
= rs
.getString("notes");
259 boolean isConceptRelationship
= rs
.getBoolean("is_concept_relation");
261 TaxonBase
<?
> taxon1
= taxonMap
.get(String
.valueOf(taxon1Id
));
262 TaxonBase
<?
> taxon2
= taxonMap
.get(String
.valueOf(taxon2Id
));
264 String refFk
= String
.valueOf(relRefFk
);
265 Reference citation
= refMap
.get(refFk
);
267 String microcitation
= null; //does not exist in RelPTaxon
269 if (taxon2
!= null && taxon1
!= null){
270 if (!(taxon2
instanceof Taxon
)){
271 logger
.error("ToTaxon (ID = " + taxon2
.getId()+ ", RIdentifier = " + taxon2Id
+ ") can't be casted to Taxon. RelPTaxon: " + relPTaxonId
);
275 AnnotatableEntity taxonRelationship
= null;
276 Taxon toTaxon
= (Taxon
)taxon2
;
277 if (isTaxonRelationship(relQualifierFk
)){
278 if (!(taxon1
instanceof Taxon
)){
279 logger
.error("TaxonBase (ID = " + taxon1
.getId()+ ", RIdentifier = " + taxon1Id
+ ") for TaxonRelation ("+relPTaxonId
+") can't be casted to Taxon");
283 Taxon fromTaxon
= (Taxon
)taxon1
;
284 if (relQualifierFk
== TAX_REL_IS_INCLUDED_IN
){
285 taxonRelationship
= makeTaxonomicallyIncluded(state
, classificationMap
, treeRefFk
, fromTaxon
, toTaxon
, citation
, microcitation
);
286 }else if (relQualifierFk
== TAX_REL_IS_MISAPPLIED_NAME_OF
){
287 taxonRelationship
= toTaxon
.addMisappliedName(fromTaxon
, citation
, microcitation
);
289 handleAllRelatedTaxa(state
, fromTaxon
, classificationMap
, fromRefFk
);
290 handleAllRelatedTaxa(state
, toTaxon
, classificationMap
, treeRefFk
);
291 logger
.warn("Unhandled taxon relationship: RelId:" + relPTaxonId
+ "; QualifierId: " + relQualifierFk
);
293 }else if (isSynonymRelationship(relQualifierFk
)){
294 if (!(taxon1
instanceof Synonym
)){
295 logger
.warn("Validated: Taxon (ID = " + taxon1
.getId()+ ", RIdentifier = " + taxon1Id
+ ") can't be casted to Synonym");
299 handleAllRelatedTaxa(state
, toTaxon
, classificationMap
, treeRefFk
);
300 Synonym synonym
= (Synonym
)taxon1
;
301 makeSynRel(relQualifierFk
, toTaxon
, synonym
, citation
, microcitation
);
302 if (isNotBlank(notes
)){
303 logger
.warn("Notes for synonym relationship or unknown taxon relationship not handled");
306 if (relQualifierFk
== TAX_REL_IS_SYNONYM_OF
||
307 relQualifierFk
== TAX_REL_IS_HOMOTYPIC_SYNONYM_OF
||
308 relQualifierFk
== TAX_REL_IS_HETEROTYPIC_SYNONYM_OF
){
309 //pro parte already set by taxon mapping
310 }else if (relQualifierFk
== TAX_REL_IS_PROPARTE_SYN_OF
||
311 relQualifierFk
== TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF
||
312 relQualifierFk
== TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF
){
313 synonym
.setProParte(true);
314 }else if(relQualifierFk
== TAX_REL_IS_PARTIAL_SYN_OF
||
315 relQualifierFk
== TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF
||
316 relQualifierFk
== TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF
){
317 synonym
.setPartial(true);
320 logger
.warn("Proparte/Partial not yet implemented for TaxonRelationShipType " + relQualifierFk
);
322 }else if (isConceptRelationship
){
323 ResultWrapper
<Boolean
> isInverse
= ResultWrapper
.NewInstance(false);
324 ResultWrapper
<Boolean
> isDoubtful
= ResultWrapper
.NewInstance(false);
326 TaxonRelationshipType relType
= BerlinModelTransformer
.taxonRelId2TaxonRelType(relQualifierFk
, isInverse
, isDoubtful
);
328 if (! (taxon1
instanceof Taxon
)){
330 logger
.error("TaxonBase (ID = " + taxon1
.getId()+ ", RIdentifier = " + taxon1Id
+ ") can't be casted to Taxon");
332 Taxon fromTaxon
= (Taxon
)taxon1
;
333 if (isInverse
.getValue() == true){
334 Taxon tmp
= fromTaxon
;
338 taxonRelationship
= fromTaxon
.addTaxonRelation(toTaxon
, relType
, citation
, microcitation
);
339 handleAllRelatedTaxa(state
, toTaxon
, classificationMap
, treeRefFk
);
340 handleAllRelatedTaxa(state
, fromTaxon
, classificationMap
, fromRefFk
);
341 if (isDoubtful
.getValue() == true){
342 ((TaxonRelationship
)taxonRelationship
).setDoubtful(true);
345 } catch (UnknownCdmTypeException e
) {
346 logger
.warn("TaxonRelationShipType " + relQualifierFk
+ " (conceptRelationship) not yet implemented");
350 logger
.warn("TaxonRelationShipType " + relQualifierFk
+ " not yet implemented: RelPTaxonId = " + relPTaxonId
);
354 if (taxonRelationship
!= null){
355 doNotes(taxonRelationship
, notes
);
356 }else if (isNotBlank(notes
)){
357 logger
.warn("Notes for synonym relationship or unknown taxon relationship not handled");
359 taxaToSave
.add(taxon2
);
364 if (taxon2
!= null && taxon1
== null){
365 logger
.warn("First taxon ("+taxon1Id
+") for RelPTaxon " + relPTaxonId
+ " does not exist in store. RelType: " + relQualifierFk
);
366 }else if (taxon2
== null && taxon1
!= null){
367 logger
.warn("Second taxon ("+taxon2Id
+") for RelPTaxon " + relPTaxonId
+ " does not exist in store. RelType: " + relQualifierFk
);
369 logger
.warn("Both taxa ("+taxon1Id
+","+taxon2Id
+") for RelPTaxon " + relPTaxonId
+ " do not exist in store. RelType: " + relQualifierFk
);
374 } catch (Exception e
) {
375 logger
.error("Exception occurred when trying to handle taxon relationship " + relPTaxonId
+ " relQualifierFK " + relQualifierFk
+ " (" + taxon1Id
+ ","+ taxon2Id
+ "): " + e
.getMessage());
379 }catch(SQLException e
){
380 throw new RuntimeException(e
);
382 logger
.info("Taxa to save: " + taxaToSave
.size());
383 partitioner
.startDoSave();
384 getTaxonService().saveOrUpdate(taxaToSave
);
385 classificationMap
= null;
392 private void handleAllRelatedTaxa(BerlinModelImportState state
, Taxon taxon
, Map
<Integer
, Classification
> classificationMap
, Integer secRefFk
) {
393 if (taxon
.getTaxonNodes().size() > 0){
396 Classification classification
= getClassificationTree(state
, classificationMap
, secRefFk
);
397 classification
.addChildTaxon(taxon
, null, null);
402 protected void doInvoke(BerlinModelImportState state
){
404 makeClassifications(state
);
405 super.doInvoke(state
);
406 makeFlatClassificationTaxa(state
);
408 } catch (SQLException e
) {
409 throw new RuntimeException(e
);
415 private void makeFlatClassificationTaxa(BerlinModelImportState state
) {
416 //Note: this part still does not use partitions
417 logger
.info("Flat classifications start");
418 TransactionStatus txStatus
= startTransaction();
419 if (! state
.getConfig().isIncludeFlatClassifications()){
422 String sql
= " SELECT pt.PTRefFk AS secRefFk, pt.RIdentifier " +
423 " FROM PTaxon AS pt " +
424 " LEFT OUTER JOIN RelPTaxon ON pt.PTNameFk = RelPTaxon.PTNameFk2 AND pt.PTRefFk = RelPTaxon.PTRefFk2 " +
425 " LEFT OUTER JOIN RelPTaxon AS RelPTaxon_1 ON pt.PTNameFk = RelPTaxon_1.PTNameFk1 AND pt.PTRefFk = RelPTaxon_1.PTRefFk1 " +
426 " WHERE (RelPTaxon_1.RelQualifierFk IS NULL) AND (dbo.RelPTaxon.RelQualifierFk IS NULL) " +
427 " ORDER BY pt.PTRefFk " ;
428 ResultSet rs
= state
.getConfig().getSource().getResultSet(sql
);
429 Map
<Object
, Map
<String
, ?
extends CdmBase
>> maps
= getRelatedObjectsForFlatPartition(rs
);
431 Map
<String
, TaxonBase
> taxonMap
= (Map
<String
, TaxonBase
>) maps
.get(BerlinModelTaxonImport
.NAMESPACE
);
432 Map
<Integer
, Classification
> classificationMap
= new HashMap
<Integer
, Classification
>();
434 rs
= state
.getConfig().getSource().getResultSet(sql
);
437 Integer treeRefFk
= rs
.getInt("secRefFk");
438 String taxonId
= rs
.getString("RIdentifier");
439 Classification classification
= getClassificationTree(state
, classificationMap
, treeRefFk
);
440 TaxonBase
<?
> taxon
= taxonMap
.get(taxonId
);
442 String message
= "TaxonBase for taxon id (%s) not found in taxonMap";
443 logger
.warn(String
.format(message
, taxonId
, taxonId
));
444 }else if (taxon
.isInstanceOf(Taxon
.class)){
445 classification
.addChildTaxon(CdmBase
.deproxy(taxon
, Taxon
.class), null, null);
447 String message
= "TaxonBase for taxon is not of class Taxon but %s (RIdentifier %s)";
448 logger
.warn(String
.format(message
, taxon
.getClass(), taxonId
));
451 } catch (SQLException e
) {
452 // TODO Auto-generated catch block
455 commitTransaction(txStatus
);
456 logger
.info("Flat classifications end");
461 protected String
getIdQuery(BerlinModelImportState state
) {
462 if (state
.getConfig().getRelTaxaIdQuery() != null){
463 return state
.getConfig().getRelTaxaIdQuery();
465 return super.getIdQuery(state
);
470 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition( ResultSet rs
, BerlinModelImportState state
) {
474 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
477 Set
<String
> taxonIdSet
= new HashSet
<String
>();
478 Set
<String
> referenceIdSet
= new HashSet
<String
>();
479 // Set<String> classificationIdSet = new HashSet<String>();
481 handleForeignKey(rs
, taxonIdSet
, "taxon1Id");
482 handleForeignKey(rs
, taxonIdSet
, "taxon2Id");
483 // handleForeignKey(rs, classificationIdSet, "treeRefFk");
484 handleForeignKey(rs
, referenceIdSet
, "RelRefFk");
488 nameSpace
= BerlinModelTaxonImport
.NAMESPACE
;
489 cdmClass
= TaxonBase
.class;
491 Map
<String
, TaxonBase
> taxonMap
= (Map
<String
, TaxonBase
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
492 result
.put(nameSpace
, taxonMap
);
495 // nameSpace = "Classification";
496 // cdmClass = Classification.class;
497 // idSet = classificationIdSet;
498 // Map<String, Classification> treeMap = (Map<String, Classification>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
499 // result.put(cdmClass, treeMap);
500 // Set<UUID> treeUuidSet = state
501 // getClassificationService().find(uuidSet);
504 nameSpace
= BerlinModelReferenceImport
.REFERENCE_NAMESPACE
;
505 cdmClass
= Reference
.class;
506 idSet
= referenceIdSet
;
507 Map
<String
, Reference
> referenceMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
508 result
.put(nameSpace
, referenceMap
);
510 } catch (SQLException e
) {
511 throw new RuntimeException(e
);
517 private Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForFlatPartition( ResultSet rs
) {
521 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
524 Set
<String
> taxonIdSet
= new HashSet
<String
>();
525 Set
<String
> referenceIdSet
= new HashSet
<String
>();
526 // Set<String> classificationIdSet = new HashSet<String>();
528 handleForeignKey(rs
, taxonIdSet
, "RIdentifier");
529 // handleForeignKey(rs, classificationIdSet, "treeRefFk");
533 nameSpace
= BerlinModelTaxonImport
.NAMESPACE
;
534 cdmClass
= TaxonBase
.class;
536 Map
<String
, TaxonBase
> taxonMap
= (Map
<String
, TaxonBase
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
537 result
.put(nameSpace
, taxonMap
);
540 // nameSpace = "Classification";
541 // cdmClass = Classification.class;
542 // idSet = classificationIdSet;
543 // Map<String, Classification> treeMap = (Map<String, Classification>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
544 // result.put(cdmClass, treeMap);
545 // Set<UUID> treeUuidSet = state
546 // getClassificationService().find(uuidSet);
549 } catch (SQLException e
) {
550 throw new RuntimeException(e
);
556 private void makeSynRel (int relQualifierFk
, Taxon toTaxon
, Synonym synonym
, Reference citation
, String microcitation
){
557 if (citation
!= null && !citation
.equals(synonym
.getSec())){
558 logger
.warn("A synonym relationship citation is given and differs from synonym secundum. This can not be handled in CDM");
560 if (isNotBlank(microcitation
) && !microcitation
.equals(synonym
.getSecMicroReference())){
561 logger
.warn("A synonym relationship microcitation is given and differs from synonym secundum micro reference. This can not be handled in CDM");
563 if (relQualifierFk
== TAX_REL_IS_HOMOTYPIC_SYNONYM_OF
||
564 relQualifierFk
== TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF
||
565 relQualifierFk
== TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF
){
566 toTaxon
.addHomotypicSynonym(synonym
);
567 }else if (relQualifierFk
== TAX_REL_IS_HETEROTYPIC_SYNONYM_OF
||
568 relQualifierFk
== TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF
||
569 relQualifierFk
== TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF
){
570 toTaxon
.addSynonym(synonym
, SynonymType
.HETEROTYPIC_SYNONYM_OF());
571 }else if (relQualifierFk
== TAX_REL_IS_SYNONYM_OF
||
572 relQualifierFk
== TAX_REL_IS_PROPARTE_SYN_OF
||
573 relQualifierFk
== TAX_REL_IS_PARTIAL_SYN_OF
){
574 toTaxon
.addSynonym(synonym
, SynonymType
.SYNONYM_OF());
576 logger
.warn("SynonymyRelationShipType could not be defined for relQualifierFk " + relQualifierFk
+ ". 'Unknown'-Type taken instead.");
577 toTaxon
.addSynonym(synonym
, SynonymType
.SYNONYM_OF());
583 private boolean isSynonymRelationship(int relQualifierFk
){
584 if (relQualifierFk
== TAX_REL_IS_SYNONYM_OF
||
585 relQualifierFk
== TAX_REL_IS_HOMOTYPIC_SYNONYM_OF
||
586 relQualifierFk
== TAX_REL_IS_HETEROTYPIC_SYNONYM_OF
||
587 relQualifierFk
== TAX_REL_IS_PROPARTE_SYN_OF
||
588 relQualifierFk
== TAX_REL_IS_PARTIAL_SYN_OF
||
589 relQualifierFk
== TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF
||
590 relQualifierFk
== TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF
||
591 relQualifierFk
== TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF
||
592 relQualifierFk
== TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF
600 private boolean isTaxonRelationship(int relQualifierFk
){
601 if (relQualifierFk
== TAX_REL_IS_INCLUDED_IN
||
602 relQualifierFk
== TAX_REL_IS_MISAPPLIED_NAME_OF
){
609 private TaxonNode
makeTaxonomicallyIncluded(BerlinModelImportState state
, Map
<Integer
, Classification
> classificationMap
, int treeRefFk
, Taxon child
, Taxon parent
, Reference citation
, String microCitation
){
610 Classification tree
= getClassificationTree(state
, classificationMap
, treeRefFk
);
611 return tree
.addParentChild(parent
, child
, citation
, microCitation
);
614 private Classification
getClassificationTree(BerlinModelImportState state
, Map
<Integer
, Classification
> classificationMap
, int treeRefFk
) {
615 if (state
.getConfig().isUseSingleClassification()){
616 if (state
.getConfig().getSourceSecId() != null){
617 treeRefFk
= (Integer
)state
.getConfig().getSourceSecId();
623 Classification tree
= classificationMap
.get(treeRefFk
);
625 UUID treeUuid
= state
.getTreeUuidByIntTreeKey(treeRefFk
);
626 if (treeUuid
== null){
627 throw new IllegalStateException("treeUUID does not exist in state for " + treeRefFk
);
629 tree
= getClassificationService().find(treeUuid
);
630 classificationMap
.put(treeRefFk
, tree
);
633 throw new IllegalStateException("Tree for ToTaxon reference " + treeRefFk
+ " does not exist.");
639 protected boolean doCheck(BerlinModelImportState state
){
640 IOValidator
<BerlinModelImportState
> validator
= new BerlinModelTaxonRelationImportValidator();
641 return validator
.validate(state
);
645 protected boolean isIgnore(BerlinModelImportState state
){
646 return ! state
.getConfig().isDoRelTaxa();