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_TYPE_OF
;
27 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_VALIDATION_OF
;
28 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_TYPE_NOT_DESIGNATED
;
29 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF
;
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
.commons
.lang
.StringUtils
;
40 import org
.apache
.log4j
.Logger
;
41 import org
.springframework
.stereotype
.Component
;
43 import eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
;
44 import eu
.etaxonomy
.cdm
.io
.berlinModel
.in
.validation
.BerlinModelTaxonNameRelationImportValidator
;
45 import eu
.etaxonomy
.cdm
.io
.common
.IOValidator
;
46 import eu
.etaxonomy
.cdm
.io
.common
.ResultSetPartitioner
;
47 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
48 import eu
.etaxonomy
.cdm
.model
.common
.AnnotatableEntity
;
49 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
50 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
51 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationshipType
;
52 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationshipType
;
53 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignationStatus
;
54 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
55 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
56 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
57 import eu
.etaxonomy
.cdm
.strategy
.exceptions
.UnknownCdmTypeException
;
65 public class BerlinModelTaxonNameRelationImport
extends BerlinModelImportBase
{
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(){
80 protected String
getIdQuery(BerlinModelImportState state
) {
81 if (StringUtils
.isNotBlank(state
.getConfig().getNameIdTable())){
82 String result
= super.getIdQuery(state
);
83 result
+= " WHERE nameFk1 IN (SELECT NameId FROM %s) OR ";
84 result
+= " nameFk2 IN (SELECT NameId FROM %s)";
85 result
= String
.format(result
, state
.getConfig().getNameIdTable(),state
.getConfig().getNameIdTable() );
88 return super.getIdQuery(state
);
94 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
97 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
99 " SELECT RelName.*, FromName.nameId as name1Id, ToName.nameId as name2Id, RefDetail.Details " +
100 " FROM Name as FromName INNER JOIN " +
101 " RelName ON FromName.NameId = RelName.NameFk1 INNER JOIN " +
102 " Name AS ToName ON RelName.NameFk2 = ToName.NameId LEFT OUTER JOIN "+
103 " RefDetail ON RelName.RefDetailFK = RefDetail.RefDetailId " +
104 " WHERE (RelNameId IN ("+ID_LIST_TOKEN
+"))";
109 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
111 public boolean doPartition(ResultSetPartitioner partitioner
, BerlinModelImportState state
) {
112 boolean success
= true ;
113 BerlinModelImportConfigurator config
= state
.getConfig();
114 Set
<TaxonNameBase
> nameToSave
= new HashSet
<TaxonNameBase
>();
115 Map
<String
, TaxonNameBase
> nameMap
= (Map
<String
, TaxonNameBase
>) partitioner
.getObjectMap(BerlinModelTaxonNameImport
.NAMESPACE
);
116 Map
<String
, Reference
> biblioRefMap
= partitioner
.getObjectMap(BerlinModelReferenceImport
.BIBLIO_REFERENCE_NAMESPACE
);
117 Map
<String
, Reference
> nomRefMap
= partitioner
.getObjectMap(BerlinModelReferenceImport
.NOM_REFERENCE_NAMESPACE
);
120 ResultSet rs
= partitioner
.getResultSet();
124 //for each name relation
127 if ((i
++ % modCount
) == 0 && i
!= 1 ){ logger
.info("RelName handled: " + (i
-1));}
129 int relNameId
= rs
.getInt("RelNameId");
130 int name1Id
= rs
.getInt("name1Id");
131 int name2Id
= rs
.getInt("name2Id");
132 Object relRefFkObj
= rs
.getObject("refFk");
133 String details
= rs
.getString("details");
134 int relQualifierFk
= rs
.getInt("relNameQualifierFk");
135 String notes
= rs
.getString("notes");
137 TaxonNameBase
<?
,?
> nameFrom
= nameMap
.get(String
.valueOf(name1Id
));
138 TaxonNameBase
<?
,?
> nameTo
= nameMap
.get(String
.valueOf(name2Id
));
141 Reference
<?
> citation
= null;
142 if (relRefFkObj
!= null){
143 String relRefFk
= String
.valueOf(relRefFkObj
);
145 citation
= getReferenceOnlyFromMaps(biblioRefMap
, nomRefMap
,
149 //TODO (preliminaryFlag = true testen
150 String microcitation
= details
;
153 if (nameFrom
!= null && nameTo
!= null){
154 success
= handleNameRelationship(success
, config
, name1Id
, name2Id
, relQualifierFk
,
155 notes
, nameFrom
, nameTo
, citation
, microcitation
, rule
);
157 if (! nameFrom
.isProtectedTitleCache()){
158 nameFrom
.setTitleCache(null);
159 nameFrom
.getTitleCache();
161 if (! nameTo
.isProtectedTitleCache()){
162 nameTo
.setTitleCache(null);
163 nameTo
.getTitleCache();
165 nameToSave
.add(nameFrom
);
172 if (nameFrom
== null){
173 logger
.warn("from TaxonName " + name1Id
+ " for RelName (" + relNameId
+ " , type: " + relQualifierFk
+ ") does not exist in store. ToName is: " + (nameTo
== null ?
"" : nameTo
.getTitleCache()));
176 logger
.warn("to TaxonName " + name2Id
+ " for RelName (" + relNameId
+ " , type: " + relQualifierFk
+ ") does not exist in store. FromName is: " + (nameFrom
== null ?
"" : nameFrom
.getTitleCache()));
183 partitioner
.startDoSave();
184 getNameService().save(nameToSave
);
187 } catch (SQLException e
) {
188 logger
.error("SQLException:" + e
);
198 * @param relQualifierFk
203 * @param microcitation
207 private boolean handleNameRelationship(boolean success
,
208 BerlinModelImportConfigurator config
, int name1Id
, int name2Id
,
209 int relQualifierFk
, String notes
, TaxonNameBase nameFrom
,
210 TaxonNameBase nameTo
, Reference
<?
> citation
,
211 String microcitation
, String rule
) {
212 AnnotatableEntity nameRelationship
= null;
213 if (relQualifierFk
== NAME_REL_IS_BASIONYM_FOR
){
214 nameRelationship
= nameTo
.addBasionym(nameFrom
, citation
, microcitation
, rule
);
215 }else if (relQualifierFk
== NAME_REL_IS_LATER_HOMONYM_OF
){
216 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.LATER_HOMONYM(), citation
, microcitation
, rule
) ;
217 }else if (relQualifierFk
== NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF
){
218 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.LATER_HOMONYM(), citation
, microcitation
, rule
) ;
219 }else if (relQualifierFk
== NAME_REL_IS_REPLACED_SYNONYM_FOR
){
220 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.REPLACED_SYNONYM(), citation
, microcitation
, rule
) ;
221 }else if (relQualifierFk
== NAME_REL_HAS_SAME_TYPE_AS
){
222 nameTo
.getHomotypicalGroup().merge(nameFrom
.getHomotypicalGroup());
223 }else if (relQualifierFk
== NAME_REL_IS_VALIDATION_OF
){
224 nameRelationship
= nameTo
.addRelationshipToName(nameFrom
, NameRelationshipType
.VALIDATED_BY_NAME(), citation
, microcitation
, rule
) ;
225 }else if (relQualifierFk
== NAME_REL_IS_LATER_VALIDATION_OF
){
226 nameRelationship
= nameTo
.addRelationshipToName(nameFrom
, NameRelationshipType
.LATER_VALIDATED_BY_NAME(), citation
, microcitation
, rule
) ;
227 }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
){
228 boolean isRejectedType
= (relQualifierFk
== NAME_REL_IS_REJECTED_TYPE_OF
);
229 boolean isConservedType
= (relQualifierFk
== NAME_REL_IS_CONSERVED_TYPE_OF
);
230 boolean isLectoType
= (relQualifierFk
== NAME_REL_IS_LECTOTYPE_OF
);
231 boolean isNotDesignated
= (relQualifierFk
== NAME_REL_TYPE_NOT_DESIGNATED
);
233 NameTypeDesignationStatus status
= null;
234 String originalNameString
= null;
235 //TODO addToAllNames true or false?
236 boolean addToAllNames
= false;
237 if (config
.getNameTypeDesignationStatusMethod() != null){
238 Method method
= config
.getNameTypeDesignationStatusMethod();
239 method
.setAccessible(true);
241 status
= (NameTypeDesignationStatus
)method
.invoke(null, notes
);
242 nameRelationship
= nameTo
.addNameTypeDesignation(nameFrom
, citation
, microcitation
, originalNameString
, status
, addToAllNames
);
243 } catch (Exception e
) {
244 throw new RuntimeException(e
);
248 status
= NameTypeDesignationStatus
.LECTOTYPE();
250 nameRelationship
= nameTo
.addNameTypeDesignation(nameFrom
, citation
, microcitation
, originalNameString
, status
, isRejectedType
, isConservedType
, /*isLectoType,*/ isNotDesignated
, addToAllNames
);
253 }else if (relQualifierFk
== NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF
){
254 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.ORTHOGRAPHIC_VARIANT(), citation
, microcitation
, rule
) ;
255 }else if (relQualifierFk
== NAME_REL_IS_ALTERNATIVE_NAME_FOR
){
256 nameRelationship
= nameFrom
.addRelationshipToName(nameTo
, NameRelationshipType
.ALTERNATIVE_NAME(), citation
, microcitation
, rule
) ;
257 }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
){
258 //HybridRelationships
259 if (! (nameTo
instanceof NonViralName
) || ! (nameFrom
instanceof NonViralName
)){
260 logger
.warn("HybridrelationshipNames ("+name1Id
+"," + name2Id
+") must be of type NonViralNameName but are not");
264 HybridRelationshipType hybridRelType
= BerlinModelTransformer
.relNameId2HybridRel(relQualifierFk
);
265 BotanicalName parent
= (BotanicalName
)nameFrom
;
266 BotanicalName child
= (BotanicalName
)nameTo
;
268 nameRelationship
= parent
.addHybridChild(child
, hybridRelType
, rule
);
270 } catch (UnknownCdmTypeException e
) {
276 Method method
= config
.getNamerelationshipTypeMethod();
279 method
.invoke(null, relQualifierFk
, nameTo
, nameFrom
);
280 } catch (Exception e
) {
281 logger
.error(e
.getMessage());
282 logger
.warn("NameRelationship could not be imported");
286 logger
.warn("NameRelationShipType " + relQualifierFk
+ " not yet implemented");
290 doNotes(nameRelationship
, notes
);
295 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
297 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
) {
301 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
304 Set
<String
> nameIdSet
= new HashSet
<String
>();
305 Set
<String
> referenceIdSet
= new HashSet
<String
>();
306 Set
<String
> refDetailIdSet
= new HashSet
<String
>();
308 handleForeignKey(rs
, nameIdSet
, "name1Id");
309 handleForeignKey(rs
, nameIdSet
, "name2Id");
310 handleForeignKey(rs
, referenceIdSet
, "RefFk");
311 handleForeignKey(rs
, refDetailIdSet
, "RefDetailFk");
315 nameSpace
= BerlinModelTaxonNameImport
.NAMESPACE
;
316 cdmClass
= TaxonNameBase
.class;
318 Map
<String
, Person
> objectMap
= (Map
<String
, Person
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
319 result
.put(nameSpace
, objectMap
);
322 nameSpace
= BerlinModelReferenceImport
.NOM_REFERENCE_NAMESPACE
;
323 cdmClass
= Reference
.class;
324 idSet
= referenceIdSet
;
325 Map
<String
, Reference
> nomReferenceMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
326 result
.put(nameSpace
, nomReferenceMap
);
328 //biblio reference map
329 nameSpace
= BerlinModelReferenceImport
.BIBLIO_REFERENCE_NAMESPACE
;
330 cdmClass
= Reference
.class;
331 idSet
= referenceIdSet
;
332 Map
<String
, Reference
> biblioReferenceMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
333 result
.put(nameSpace
, biblioReferenceMap
);
336 nameSpace
= BerlinModelRefDetailImport
.NOM_REFDETAIL_NAMESPACE
;
337 cdmClass
= Reference
.class;
338 idSet
= refDetailIdSet
;
339 Map
<String
, Reference
> nomRefDetailMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
340 result
.put(nameSpace
, nomRefDetailMap
);
342 //biblio refDetail map
343 nameSpace
= BerlinModelRefDetailImport
.BIBLIO_REFDETAIL_NAMESPACE
;
344 cdmClass
= Reference
.class;
345 idSet
= refDetailIdSet
;
346 Map
<String
, Reference
> biblioRefDetailMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
347 result
.put(nameSpace
, biblioRefDetailMap
);
349 } catch (SQLException e
) {
350 throw new RuntimeException(e
);
356 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
359 protected boolean doCheck(BerlinModelImportState state
){
360 IOValidator
<BerlinModelImportState
> validator
= new BerlinModelTaxonNameRelationImportValidator();
361 return validator
.validate(state
);
365 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
368 protected String
getTableName() {
374 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
377 public String
getPluralString() {
382 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
384 protected boolean isIgnore(BerlinModelImportState state
){
385 return ! state
.getConfig().isDoRelNames();