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
.NAME_REL_HAS_SAME_TYPE_AS
;
13 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_ALTERNATIVE_NAME_FOR
;
14 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_BASIONYM_FOR
;
15 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_CONSERVED_TYPE_OF
;
16 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_FEMALE_PARENT_OF
;
17 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_FIRST_PARENT_OF
;
18 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_LATER_HOMONYM_OF
;
19 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_LATER_VALIDATION_OF
;
20 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_LECTOTYPE_OF
;
21 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_MALE_PARENT_OF
;
22 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF
;
23 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_REJECTED_TYPE_OF
;
24 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_REPLACED_SYNONYM_FOR
;
25 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_SECOND_PARENT_OF
;
26 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF
;
27 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_TYPE_OF
;
28 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_VALIDATION_OF
;
29 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_TYPE_NOT_DESIGNATED
;
31 import java
.lang
.reflect
.Method
;
32 import java
.sql
.ResultSet
;
33 import java
.sql
.SQLException
;
34 import java
.util
.HashMap
;
35 import java
.util
.HashSet
;
39 import org
.apache
.log4j
.Logger
;
40 import org
.springframework
.stereotype
.Component
;
42 import eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
;
43 import eu
.etaxonomy
.cdm
.io
.berlinModel
.in
.validation
.BerlinModelTaxonNameRelationImportValidator
;
44 import eu
.etaxonomy
.cdm
.io
.common
.IOValidator
;
45 import eu
.etaxonomy
.cdm
.io
.common
.ResultSetPartitioner
;
46 import eu
.etaxonomy
.cdm
.model
.common
.AnnotatableEntity
;
47 import eu
.etaxonomy
.cdm
.model
.common
.Annotation
;
48 import eu
.etaxonomy
.cdm
.model
.common
.AnnotationType
;
49 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
50 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationshipType
;
51 import eu
.etaxonomy
.cdm
.model
.name
.IBotanicalName
;
52 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationshipType
;
53 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignationStatus
;
54 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
55 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
56 import eu
.etaxonomy
.cdm
.strategy
.exceptions
.UnknownCdmTypeException
;
63 public class BerlinModelTaxonNameRelationImport
extends BerlinModelImportBase
{
65 private static final long serialVersionUID
= 1197601822023101796L;
66 private static final Logger logger
= Logger
.getLogger(BerlinModelTaxonNameRelationImport
.class);
68 private static int modCount
= 5000;
69 private static final String pluralString
= "name relations";
70 private static final String dbTableName
= "RelName";
73 public BerlinModelTaxonNameRelationImport(){
74 super(dbTableName
, pluralString
);
79 protected String
getIdQuery(BerlinModelImportState state
) {
80 String nameIdTable
= state
.getConfig().getNameIdTable();
81 String result
= super.getIdQuery(state
);
82 if (isNotBlank(nameIdTable
)){
83 if (state
.getConfig().isEuroMed()){
84 result
+= " WHERE nameFk1 IN (SELECT NameId FROM %s) AND RelNameQualifierFk IN (2, 4, 5, 13, 14, 15, 17, 18, 37, 62) OR ";
85 result
+= " nameFk2 IN (SELECT NameId FROM %s) ";
86 //the first part is only to check if there are relations that we have maybe missed.
87 //2 is unclear, 17 should be in both, 62 links names to itself
88 result
= String
.format(result
, nameIdTable
, nameIdTable
);
90 result
+= " WHERE nameFk1 IN (SELECT NameId FROM %s) OR ";
91 result
+= " nameFk2 IN (SELECT NameId FROM %s) ";
92 result
= String
.format(result
, nameIdTable
, nameIdTable
);
103 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
105 " SELECT RelName.*, FromName.nameId as name1Id, ToName.nameId as name2Id, RefDetail.Details " +
106 " FROM Name as FromName INNER JOIN " +
107 " RelName ON FromName.NameId = RelName.NameFk1 INNER JOIN " +
108 " Name AS ToName ON RelName.NameFk2 = ToName.NameId LEFT OUTER JOIN "+
109 " RefDetail ON RelName.RefDetailFK = RefDetail.RefDetailId " +
110 " WHERE (RelNameId IN ("+ID_LIST_TOKEN
+"))";
115 public boolean doPartition(ResultSetPartitioner partitioner
, BerlinModelImportState state
) {
116 boolean success
= true ;
117 BerlinModelImportConfigurator config
= state
.getConfig();
118 Set
<TaxonName
> nameToSave
= new HashSet
<>();
119 Map
<String
, TaxonName
> nameMap
= partitioner
.getObjectMap(BerlinModelTaxonNameImport
.NAMESPACE
);
120 Map
<String
, Reference
> refMap
= partitioner
.getObjectMap(BerlinModelReferenceImport
.REFERENCE_NAMESPACE
);
122 ResultSet rs
= partitioner
.getResultSet();
126 //for each name relation
129 if ((i
++ % modCount
) == 0 && i
!= 1 ){ logger
.info("RelName handled: " + (i
-1));}
131 int relNameId
= rs
.getInt("RelNameId");
132 int name1Id
= rs
.getInt("name1Id");
133 int name2Id
= rs
.getInt("name2Id");
134 Object relRefFkObj
= rs
.getObject("refFk");
135 String details
= rs
.getString("details");
136 int relQualifierFk
= rs
.getInt("relNameQualifierFk");
137 String notes
= rs
.getString("notes");
139 TaxonName nameFrom
= nameMap
.get(String
.valueOf(name1Id
));
140 TaxonName nameTo
= nameMap
.get(String
.valueOf(name2Id
));
143 Reference citation
= null;
144 if (relRefFkObj
!= null){
145 String relRefFk
= String
.valueOf(relRefFkObj
);
147 citation
= refMap
.get(relRefFk
);
150 //TODO (preliminaryFlag = true testen
151 String microcitation
= details
;
154 if (nameFrom
!= null && nameTo
!= null){
155 success
= handleNameRelationship(success
, config
, name1Id
, name2Id
, relQualifierFk
,
156 notes
, nameFrom
, nameTo
, citation
, microcitation
, rule
, relNameId
);
158 if (! nameFrom
.isProtectedTitleCache()){
159 nameFrom
.setTitleCache(null);
160 nameFrom
.getTitleCache();
162 if (! nameTo
.isProtectedTitleCache()){
163 nameTo
.setTitleCache(null);
164 nameTo
.getTitleCache();
166 nameToSave
.add(nameFrom
);
173 if (nameFrom
== null){
174 if ( ! (config
.isUseEmAreaVocabulary() && relNameId
== 28159 )) {
175 logger
.warn("from TaxonName " + name1Id
+ " for RelName (" + relNameId
+ " , type: " + relQualifierFk
+ " , toName: " + name2Id
+ ") does not exist in store. ToName is: " + (nameTo
== null ?
"" : nameTo
.getTitleCache()));
179 logger
.warn("to TaxonName " + name2Id
+ " for RelName (" + relNameId
+ " , type: " + relQualifierFk
+ " , fromName: " + name1Id
+ ") does not exist in store. FromName is: " + (nameFrom
== null ?
"" : nameFrom
.getTitleCache()));
186 partitioner
.startDoSave();
187 getNameService().save(nameToSave
);
190 } catch (SQLException e
) {
191 logger
.error("SQLException:" + e
);
201 * @param relQualifierFk
206 * @param microcitation
211 private boolean handleNameRelationship(boolean success
,
212 BerlinModelImportConfigurator config
, int name1Id
, int name2Id
,
213 int relQualifierFk
, String notes
, TaxonName nameFrom
,
214 TaxonName nameTo
, Reference citation
,
215 String microcitation
, String rule
, int relNameId
) {
216 AnnotatableEntity nameRelationship
= null;
217 if (relQualifierFk
== NAME_REL_IS_BASIONYM_FOR
){
218 nameRelationship
= nameTo
.addBasionym(nameFrom
, citation
, microcitation
, rule
, null);
219 }else if (relQualifierFk
== NAME_REL_IS_LATER_HOMONYM_OF
){
220 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.LATER_HOMONYM(), citation
, microcitation
, rule
, null) ;
221 }else if (relQualifierFk
== NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF
){
222 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.LATER_HOMONYM(), citation
, microcitation
, rule
, null) ;
223 }else if (relQualifierFk
== NAME_REL_IS_REPLACED_SYNONYM_FOR
){
224 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.REPLACED_SYNONYM(), citation
, microcitation
, rule
, null) ;
225 }else if (relQualifierFk
== NAME_REL_HAS_SAME_TYPE_AS
){
226 nameTo
.getHomotypicalGroup().merge(nameFrom
.getHomotypicalGroup());
227 }else if (relQualifierFk
== NAME_REL_IS_VALIDATION_OF
){
228 nameRelationship
= nameTo
.addRelationshipToName(nameFrom
, NameRelationshipType
.VALIDATED_BY_NAME(), citation
, microcitation
, rule
, null) ;
229 }else if (relQualifierFk
== NAME_REL_IS_LATER_VALIDATION_OF
){
230 nameRelationship
= nameTo
.addRelationshipToName(nameFrom
, NameRelationshipType
.LATER_VALIDATED_BY_NAME(), citation
, microcitation
, rule
, null) ;
231 }else if (relQualifierFk
== NAME_REL_IS_TYPE_OF
|| relQualifierFk
== NAME_REL_IS_REJECTED_TYPE_OF
|| relQualifierFk
== NAME_REL_IS_CONSERVED_TYPE_OF
|| relQualifierFk
== NAME_REL_IS_LECTOTYPE_OF
|| relQualifierFk
== NAME_REL_TYPE_NOT_DESIGNATED
){
232 boolean isRejectedType
= (relQualifierFk
== NAME_REL_IS_REJECTED_TYPE_OF
);
233 boolean isConservedType
= (relQualifierFk
== NAME_REL_IS_CONSERVED_TYPE_OF
);
234 boolean isLectoType
= (relQualifierFk
== NAME_REL_IS_LECTOTYPE_OF
);
235 boolean isNotDesignated
= (relQualifierFk
== NAME_REL_TYPE_NOT_DESIGNATED
);
237 NameTypeDesignationStatus status
= null;
238 String originalNameString
= null;
239 //TODO addToAllNames true or false?
240 boolean addToAllNames
= false;
241 if (config
.getNameTypeDesignationStatusMethod() != null){
242 Method method
= config
.getNameTypeDesignationStatusMethod();
243 method
.setAccessible(true);
245 status
= (NameTypeDesignationStatus
)method
.invoke(null, notes
);
246 nameRelationship
= nameTo
.addNameTypeDesignation(nameFrom
, citation
, microcitation
, originalNameString
, status
, addToAllNames
);
247 } catch (Exception e
) {
248 throw new RuntimeException(e
);
252 status
= NameTypeDesignationStatus
.LECTOTYPE();
254 if (isNotDesignated
&& nameTo
== nameFrom
){
255 nameFrom
= null; //E+M case
258 nameRelationship
= nameTo
.addNameTypeDesignation(nameFrom
, citation
, microcitation
, originalNameString
, status
, isRejectedType
, isConservedType
, isNotDesignated
, addToAllNames
);
261 }else if (relQualifierFk
== NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF
){
262 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.ORTHOGRAPHIC_VARIANT(), citation
, microcitation
, rule
, null) ;
263 }else if (relQualifierFk
== NAME_REL_IS_ALTERNATIVE_NAME_FOR
){
264 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.ALTERNATIVE_NAME(), citation
, microcitation
, rule
, null) ;
265 }else if (relQualifierFk
== NAME_REL_IS_FIRST_PARENT_OF
|| relQualifierFk
== NAME_REL_IS_SECOND_PARENT_OF
|| relQualifierFk
== NAME_REL_IS_FEMALE_PARENT_OF
|| relQualifierFk
== NAME_REL_IS_MALE_PARENT_OF
){
266 //HybridRelationships
268 HybridRelationshipType hybridRelType
= BerlinModelTransformer
.relNameId2HybridRel(relQualifierFk
);
269 IBotanicalName parent
= nameFrom
;
270 IBotanicalName child
= nameTo
;
272 nameRelationship
= parent
.addHybridChild(child
, hybridRelType
, rule
);
274 } catch (UnknownCdmTypeException e
) {
280 Method method
= config
.getNamerelationshipTypeMethod();
283 method
.invoke(null, relQualifierFk
, nameTo
, nameFrom
);
284 } catch (Exception e
) {
285 logger
.error(e
.getMessage());
286 logger
.warn("NameRelationship could not be imported");
290 logger
.warn("NameRelationShipType " + relQualifierFk
+ " not yet implemented");
294 Annotation annotation
= doNotes(nameRelationship
, notes
);
295 if (config
.isEuroMed() && annotation
!= null){
296 if (relQualifierFk
== NAME_REL_IS_BASIONYM_FOR
){
297 annotation
.setAnnotationType(AnnotationType
.TECHNICAL());
298 }else if ((relQualifierFk
== NAME_REL_IS_LECTOTYPE_OF
) && !notes
.contains("designated")){
299 annotation
.setAnnotationType(AnnotationType
.TECHNICAL());
301 logger
.warn("Annotation type not defined for name relationship " + relNameId
);
303 }else if (annotation
!= null){
304 logger
.warn("Annotation type not defined for name relationship " + relNameId
);
310 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
, BerlinModelImportState state
) {
314 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<>();
317 Set
<String
> nameIdSet
= new HashSet
<>();
318 Set
<String
> referenceIdSet
= new HashSet
<>();
319 Set
<String
> refDetailIdSet
= new HashSet
<>();
321 handleForeignKey(rs
, nameIdSet
, "name1Id");
322 handleForeignKey(rs
, nameIdSet
, "name2Id");
323 handleForeignKey(rs
, referenceIdSet
, "RefFk");
324 handleForeignKey(rs
, refDetailIdSet
, "RefDetailFk");
328 nameSpace
= BerlinModelTaxonNameImport
.NAMESPACE
;
330 Map
<String
, TaxonName
> objectMap
= getCommonService().getSourcedObjectsByIdInSourceC(TaxonName
.class, idSet
, nameSpace
);
331 result
.put(nameSpace
, objectMap
);
334 nameSpace
= BerlinModelReferenceImport
.REFERENCE_NAMESPACE
;
335 idSet
= referenceIdSet
;
336 Map
<String
, Reference
> referenceMap
= getCommonService().getSourcedObjectsByIdInSourceC(Reference
.class, idSet
, nameSpace
);
337 result
.put(nameSpace
, referenceMap
);
340 nameSpace
= BerlinModelRefDetailImport
.REFDETAIL_NAMESPACE
;
341 idSet
= refDetailIdSet
;
342 Map
<String
, Reference
> refDetailMap
= getCommonService().getSourcedObjectsByIdInSourceC(Reference
.class, idSet
, nameSpace
);
343 result
.put(nameSpace
, refDetailMap
);
345 } catch (SQLException e
) {
346 throw new RuntimeException(e
);
352 protected boolean doCheck(BerlinModelImportState state
){
353 IOValidator
<BerlinModelImportState
> validator
= new BerlinModelTaxonNameRelationImportValidator();
354 return validator
.validate(state
);
358 protected boolean isIgnore(BerlinModelImportState state
){
359 return ! state
.getConfig().isDoRelNames();