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
.redlist
.gefaesspflanzen
;
12 import java
.sql
.ResultSet
;
13 import java
.sql
.SQLException
;
14 import java
.util
.HashMap
;
15 import java
.util
.HashSet
;
19 import org
.apache
.log4j
.Logger
;
20 import org
.springframework
.stereotype
.Component
;
22 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
23 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
24 import eu
.etaxonomy
.cdm
.io
.common
.DbImportBase
;
25 import eu
.etaxonomy
.cdm
.io
.common
.IPartitionedIO
;
26 import eu
.etaxonomy
.cdm
.io
.common
.ImportHelper
;
27 import eu
.etaxonomy
.cdm
.io
.common
.ResultSetPartitioner
;
28 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.UndefinedTransformerMethodException
;
29 import eu
.etaxonomy
.cdm
.model
.agent
.AgentBase
;
30 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
31 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
32 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
33 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatus
;
34 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatusType
;
35 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
36 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
37 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
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 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
42 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
43 import eu
.etaxonomy
.cdm
.strategy
.parser
.NonViralNameParserImpl
;
53 @SuppressWarnings("serial")
54 public class RedListGefaesspflanzenImportNames
extends DbImportBase
<RedListGefaesspflanzenImportState
, RedListGefaesspflanzenImportConfigurator
> {
56 private static final Logger logger
= Logger
.getLogger(RedListGefaesspflanzenImportNames
.class);
58 private static final String tableName
= "Rote Liste Gefäßpflanzen";
60 private static final String pluralString
= "names";
62 public RedListGefaesspflanzenImportNames() {
63 super(tableName
, pluralString
);
67 protected String
getIdQuery(RedListGefaesspflanzenImportState state
) {
68 return "SELECT NAMNR "
69 + "FROM V_TAXATLAS_D20_EXPORT t "
74 protected String
getRecordQuery(RedListGefaesspflanzenImportConfigurator config
) {
75 String result
= " SELECT * "
76 + " FROM V_TAXATLAS_D20_EXPORT t "
77 + " WHERE t.NAMNR IN (@IDSET)";
78 result
= result
.replace("@IDSET", IPartitionedIO
.ID_LIST_TOKEN
);
83 protected void doInvoke(RedListGefaesspflanzenImportState state
) {
84 super.doInvoke(state
);
89 public boolean doPartition(ResultSetPartitioner partitioner
, RedListGefaesspflanzenImportState state
) {
90 ResultSet rs
= partitioner
.getResultSet();
91 Set
<TaxonNameBase
> namesToSave
= new HashSet
<TaxonNameBase
>();
92 Set
<TaxonBase
> taxaToSave
= new HashSet
<TaxonBase
>();
95 makeSingleNameAndTaxon(state
, rs
, namesToSave
, taxaToSave
);
98 } catch (SQLException e
) {
102 getNameService().saveOrUpdate(namesToSave
);
103 getTaxonService().saveOrUpdate(taxaToSave
);
107 private void makeSingleNameAndTaxon(RedListGefaesspflanzenImportState state
, ResultSet rs
, Set
<TaxonNameBase
> namesToSave
, Set
<TaxonBase
> taxaToSave
)
108 throws SQLException
{
110 long id
= rs
.getLong(RedListUtil
.NAMNR
);
111 String taxNameString
= rs
.getString(RedListUtil
.TAXNAME
);
112 String gueltString
= rs
.getString(RedListUtil
.GUELT
);
113 String rangString
= rs
.getString(RedListUtil
.RANG
);
114 String ep1String
= rs
.getString(RedListUtil
.EPI1
);
115 String ep2String
= rs
.getString(RedListUtil
.EPI2
);
116 String ep3String
= rs
.getString(RedListUtil
.EPI3
);
117 String nomZusatzString
= rs
.getString(RedListUtil
.NOM_ZUSATZ
);
118 String taxZusatzString
= rs
.getString(RedListUtil
.TAX_ZUSATZ
);
119 String zusatzString
= rs
.getString(RedListUtil
.ZUSATZ
);
120 String nonString
= rs
.getString(RedListUtil
.NON
);
121 String sensuString
= rs
.getString(RedListUtil
.SENSU
);
122 String authorKombString
= rs
.getString(RedListUtil
.AUTOR_KOMB
);
123 String authorBasiString
= rs
.getString(RedListUtil
.AUTOR_BASI
);
124 String hybString
= rs
.getString(RedListUtil
.HYB
);
125 String clTaxonString
= rs
.getString(RedListUtil
.CL_TAXON
);
126 String relationE
= rs
.getString(RedListUtil
.E
);
127 String relationW
= rs
.getString(RedListUtil
.W
);
128 String relationK
= rs
.getString(RedListUtil
.K
);
129 String relationAW
= rs
.getString(RedListUtil
.AW
);
130 String relationAO
= rs
.getString(RedListUtil
.AO
);
131 String relationR
= rs
.getString(RedListUtil
.R
);
132 String relationO
= rs
.getString(RedListUtil
.O
);
133 String relationS
= rs
.getString(RedListUtil
.S
);
136 NonViralName name
= importName(state
, id
, taxNameString
, rangString
, ep1String
, ep2String
, ep3String
,
137 nomZusatzString
, hybString
, namesToSave
);
141 importAuthors(state
, rs
, id
, nomZusatzString
, taxZusatzString
, zusatzString
, authorKombString
,
142 authorBasiString
, name
);
145 TaxonBase taxonBase
= importTaxon(id
, taxNameString
, gueltString
, authorBasiString
, hybString
, name
);
147 RedListUtil
.logMessage(id
, "Taxon for name "+name
+" could not be created.", logger
);
150 taxonBase
.setSec(state
.getConfig().getSourceReference());
152 //---CONCEPT RELATIONSHIPS---
153 /*check if taxon/synonym also exists in other classification
154 * 1. create new taxon with the same name (in that classification)
155 * 2. create concept relationship between both
158 if(CdmUtils
.isNotBlank(clTaxonString
) && !clTaxonString
.trim().equals("-")){
159 cloneTaxon(taxonBase
, name
, TaxonRelationshipType
.CONGRUENT_TO(), taxaToSave
, id
, RedListUtil
.TAXON_CHECKLISTE_NAMESPACE
, false, true, state
);
161 //E, W, K, AW, AO, R, O, S
162 addConceptRelation(relationE
, RedListUtil
.CLASSIFICATION_NAMESPACE_E
, taxonBase
, name
, taxaToSave
, id
, state
);
163 addConceptRelation(relationW
, RedListUtil
.CLASSIFICATION_NAMESPACE_W
, taxonBase
, name
, taxaToSave
, id
, state
);
164 addConceptRelation(relationK
, RedListUtil
.CLASSIFICATION_NAMESPACE_K
, taxonBase
, name
, taxaToSave
, id
, state
);
165 addConceptRelation(relationAW
, RedListUtil
.CLASSIFICATION_NAMESPACE_AW
, taxonBase
, name
, taxaToSave
, id
, state
);
166 addConceptRelation(relationAO
, RedListUtil
.CLASSIFICATION_NAMESPACE_AO
, taxonBase
, name
, taxaToSave
, id
, state
);
167 addConceptRelation(relationR
, RedListUtil
.CLASSIFICATION_NAMESPACE_R
, taxonBase
, name
, taxaToSave
, id
, state
);
168 addConceptRelation(relationO
, RedListUtil
.CLASSIFICATION_NAMESPACE_O
, taxonBase
, name
, taxaToSave
, id
, state
);
169 addConceptRelation(relationS
, RedListUtil
.CLASSIFICATION_NAMESPACE_S
, taxonBase
, name
, taxaToSave
, id
, state
);
171 //NOTE: the source has to be added after cloning or otherwise the clone would also get the source
172 ImportHelper
.setOriginalSource(taxonBase
, state
.getTransactionalSourceReference(), id
, RedListUtil
.TAXON_GESAMTLISTE_NAMESPACE
);
173 taxaToSave
.add(taxonBase
);
176 private void addConceptRelation(String relationString
, String classificationNamespace
, TaxonBase taxonBase
, TaxonNameBase name
, Set
<TaxonBase
> taxaToSave
, long id
, RedListGefaesspflanzenImportState state
){
177 if(CdmUtils
.isNotBlank(relationString
) && !relationString
.equals(".")){
178 String substring
= relationString
.substring(relationString
.length()-1, relationString
.length());
179 TaxonRelationshipType taxonRelationshipTypeByKey
= new RedListGefaesspflanzenTransformer().getTaxonRelationshipTypeByKey(substring
);
180 if(taxonRelationshipTypeByKey
==null){
181 RedListUtil
.logMessage(id
, "Could not interpret relationship "+relationString
+" for taxon "+taxonBase
.generateTitle(), logger
);
183 //there is no type "included in" so we have to reverse the direction
184 if(substring
.equals("<")){
185 cloneTaxon(taxonBase
, name
, taxonRelationshipTypeByKey
, taxaToSave
, id
, classificationNamespace
, true, false, state
);
188 cloneTaxon(taxonBase
, name
, taxonRelationshipTypeByKey
, taxaToSave
, id
, classificationNamespace
, false, false, state
);
194 * <b>NOTE:</b> the {@link TaxonRelationshipType} passed as parameter is
195 * directed <b>from the clone</b> to the taxon.<br>
196 * This can be changed with parameter <i>reverseRelation</i>
198 private void cloneTaxon(TaxonBase taxonBase
, TaxonNameBase name
, TaxonRelationshipType relationFromCloneToTaxon
, Set
<TaxonBase
> taxaToSave
, long id
, String sourceNameSpace
, boolean reverseRelation
, boolean doubtful
, RedListGefaesspflanzenImportState state
){
199 TaxonBase clone
= (TaxonBase
) taxonBase
.clone();
201 if(taxonBase
.isInstanceOf(Taxon
.class)){
202 TaxonRelationship taxonRelation
;
204 taxonRelation
= ((Taxon
) taxonBase
).addTaxonRelation((Taxon
) clone
, relationFromCloneToTaxon
, null, null);
207 taxonRelation
= ((Taxon
) clone
).addTaxonRelation((Taxon
) taxonBase
, relationFromCloneToTaxon
, null, null);
209 taxonRelation
.setDoubtful(doubtful
);
211 ImportHelper
.setOriginalSource(clone
, state
.getTransactionalSourceReference(), id
, sourceNameSpace
);
212 taxaToSave
.add(clone
);
215 private TaxonBase
importTaxon(long id
, String taxNameString
, String gueltString
, String authorBasiString
,
216 String hybString
, NonViralName name
) {
217 TaxonBase taxonBase
= null;
218 if(authorBasiString
.trim().contains(RedListUtil
.AUCT
)){
219 taxonBase
= Taxon
.NewInstance(name
, null);
220 taxonBase
.setAppendedPhrase(RedListUtil
.AUCT
);
222 else if(gueltString
.equals(RedListUtil
.GUELT_ACCEPTED_TAXON
)){
223 taxonBase
= Taxon
.NewInstance(name
, null);
225 else if(gueltString
.equals(RedListUtil
.GUELT_SYNONYM
) || gueltString
.equals(RedListUtil
.GUELT_BASIONYM
)){
226 taxonBase
= Synonym
.NewInstance(name
, null);
232 //check taxon name consistency
233 checkTaxonNameConsistency(id
, taxNameString
, hybString
, taxonBase
);
237 private void importAuthors(RedListGefaesspflanzenImportState state
, ResultSet rs
, long id
, String nomZusatzString
,
238 String taxZusatzString
, String zusatzString
, String authorKombString
, String authorBasiString
,
239 NonViralName name
) throws SQLException
{
241 if(authorKombString
.contains(RedListUtil
.EX
)){
242 //TODO: what happens with multiple ex authors??
243 String
[] kombSplit
= authorKombString
.split(RedListUtil
.EX
);
244 if(kombSplit
.length
!=2){
245 RedListUtil
.logMessage(id
, "Multiple ex combination authors found", logger
);
247 for (int i
= 0; i
< kombSplit
.length
; i
++) {
249 //first author is ex author
250 TeamOrPersonBase authorKomb
= (TeamOrPersonBase
) state
.getRelatedObject(RedListUtil
.AUTHOR_NAMESPACE
, kombSplit
[i
]);
251 name
.setExCombinationAuthorship(authorKomb
);
254 TeamOrPersonBase authorKomb
= (TeamOrPersonBase
) state
.getRelatedObject(RedListUtil
.AUTHOR_NAMESPACE
, kombSplit
[i
]);
255 name
.setCombinationAuthorship(authorKomb
);
259 else if(authorKombString
.trim().contains(RedListUtil
.AUCT
)){
260 RedListUtil
.logMessage(id
, "AUCT information in "+RedListUtil
.AUTOR_KOMB
+" column", logger
);
262 else if(CdmUtils
.isNotBlank(authorKombString
)){
263 TeamOrPersonBase authorKomb
= (TeamOrPersonBase
) state
.getRelatedObject(RedListUtil
.AUTHOR_NAMESPACE
, authorKombString
);
264 name
.setCombinationAuthorship(authorKomb
);
267 if(authorBasiString
.contains(RedListUtil
.EX
)){
268 String
[] basiSplit
= authorBasiString
.split(RedListUtil
.EX
);
269 for (int i
= 0; i
< basiSplit
.length
; i
++) {
270 if(basiSplit
.length
!=2){
271 RedListUtil
.logMessage(id
, "Multiple ex basionymn authors found", logger
);
274 TeamOrPersonBase authorBasi
= (TeamOrPersonBase
) state
.getRelatedObject(RedListUtil
.AUTHOR_NAMESPACE
, basiSplit
[i
]);
275 if(CdmUtils
.isBlank(authorKombString
)){
276 name
.setExCombinationAuthorship(authorBasi
);
279 name
.setExBasionymAuthorship(authorBasi
);
283 TeamOrPersonBase authorBasi
= (TeamOrPersonBase
) state
.getRelatedObject(RedListUtil
.AUTHOR_NAMESPACE
, basiSplit
[i
]);
284 if(CdmUtils
.isBlank(authorKombString
)){
285 name
.setCombinationAuthorship(authorBasi
);
288 name
.setBasionymAuthorship(authorBasi
);
293 else if(CdmUtils
.isNotBlank(authorBasiString
)){
294 //this seems to be a convention in the source database: When there is only a single author then only the "AUTOR_BASI" column is used
295 TeamOrPersonBase authorBasi
= (TeamOrPersonBase
) state
.getRelatedObject(RedListUtil
.AUTHOR_NAMESPACE
, authorBasiString
);
296 if(CdmUtils
.isBlank(authorKombString
)){
297 name
.setCombinationAuthorship(authorBasi
);
300 name
.setBasionymAuthorship(authorBasi
);
304 //check authorship consistency
305 String authorString
= rs
.getString(RedListUtil
.AUTOR
);
306 String authorshipCache
= name
.getAuthorshipCache();
307 checkAuthorShipConsistency(id
, nomZusatzString
, taxZusatzString
, zusatzString
, authorString
, authorshipCache
);
310 private NonViralName
importName(RedListGefaesspflanzenImportState state
, long id
, String taxNameString
,
311 String rangString
, String ep1String
, String ep2String
, String ep3String
, String nomZusatzString
,
312 String hybString
, Set
<TaxonNameBase
> namesToSave
) {
313 if(CdmUtils
.isBlank(taxNameString
) && CdmUtils
.isBlank(ep1String
)){
314 RedListUtil
.logMessage(id
, "No name found!", logger
);
317 Rank rank
= makeRank(id
, state
, rangString
);
318 NonViralName name
= BotanicalName
.NewInstance(rank
);
320 //ep1 should always be present
321 if(CdmUtils
.isBlank(ep1String
)){
322 RedListUtil
.logMessage(id
, RedListUtil
.EPI1
+" is empty!", logger
);
324 name
.setGenusOrUninomial(ep1String
);
325 if(CdmUtils
.isNotBlank(ep2String
)){
326 name
.setSpecificEpithet(ep2String
);
328 if(CdmUtils
.isNotBlank(ep3String
)){
329 name
.setInfraSpecificEpithet(ep3String
);
331 //nomenclatural status
332 if(CdmUtils
.isNotBlank(nomZusatzString
)){
333 NomenclaturalStatusType status
= makeNomenclaturalStatus(id
, state
, nomZusatzString
);
335 name
.addStatus(NomenclaturalStatus
.NewInstance(status
));
339 if(CdmUtils
.isNotBlank(hybString
)){
340 if(hybString
.equals(RedListUtil
.HYB_X
)){
341 name
.setBinomHybrid(true);
343 else if(hybString
.equals(RedListUtil
.HYB_XF
)){
344 name
.setHybridFormula(true);
345 if(ep1String
.contains(RedListUtil
.HYB_SIGN
)){
346 RedListUtil
.logMessage(id
, "EPI1 has hybrid signs but with flag: "+RedListUtil
.HYB_XF
, logger
);
348 else if(ep2String
.contains(RedListUtil
.HYB_SIGN
)){
349 String
[] split
= ep2String
.split(RedListUtil
.HYB_SIGN
);
351 RedListUtil
.logMessage(id
, "Multiple hybrid signs found in "+ep2String
, logger
);
353 String hybridFormula1
= ep1String
+" "+split
[0].trim();
354 String hybridFormula2
= ep1String
+" "+split
[1].trim();
355 if(CdmUtils
.isNotBlank(ep3String
)){
356 hybridFormula1
+= " "+ep3String
;
357 hybridFormula2
+= " "+ep3String
;
359 String fullFormula
= hybridFormula1
+" "+RedListUtil
.HYB_SIGN
+" "+hybridFormula2
;
360 name
= NonViralNameParserImpl
.NewInstance().parseFullName(fullFormula
);
362 else if(ep3String
.contains(RedListUtil
.HYB_SIGN
)){
363 String
[] split
= ep3String
.split(RedListUtil
.HYB_SIGN
);
365 RedListUtil
.logMessage(id
, "Multiple hybrid signs found in "+ep3String
, logger
);
367 String hybridFormula1
= ep1String
+" "+ep2String
+" "+split
[0];
368 String hybridFormula2
= ep1String
+" "+ep2String
+" "+split
[1];
369 String fullFormula
= hybridFormula1
+" "+RedListUtil
.HYB_SIGN
+" "+hybridFormula2
;
370 name
= NonViralNameParserImpl
.NewInstance().parseFullName(fullFormula
);
375 ImportHelper
.setOriginalSource(name
, state
.getTransactionalSourceReference(), id
, RedListUtil
.NAME_NAMESPACE
);
377 namesToSave
.add(name
);
381 private void checkAuthorShipConsistency(long id
, String nomZusatzString
, String taxZusatzString
,
382 String zusatzString
, String authorString
, String authorshipCache
) {
383 if(CdmUtils
.isNotBlank(zusatzString
)){
384 authorString
= authorString
.replace(", "+zusatzString
, "");
386 if(CdmUtils
.isNotBlank(nomZusatzString
)){
387 authorString
= authorString
.replace(", "+nomZusatzString
, "");
389 if(CdmUtils
.isNotBlank(taxZusatzString
)){
390 authorString
= authorString
.replace(", "+taxZusatzString
, "");
392 if(authorString
.equals(RedListUtil
.AUCT
)){
395 if(!authorString
.equals(authorshipCache
)){
396 RedListUtil
.logMessage(id
, "Authorship inconsistent! name.authorhshipCache <-> Column "+RedListUtil
.AUTOR
+": "+authorshipCache
+" <-> "+authorString
, logger
);
400 private void checkTaxonNameConsistency(long id
, String taxNameString
, String hybString
, TaxonBase taxonBase
) {
401 if(hybString
.equals(RedListUtil
.HYB_XF
)){
402 if(HibernateProxyHelper
.deproxy(taxonBase
.getName(),NonViralName
.class).getHybridChildRelations().isEmpty()){
403 RedListUtil
.logMessage(id
, "Hybrid name but no hybrid child relations", logger
);
410 String nameCache
= HibernateProxyHelper
.deproxy(taxonBase
.getName(), NonViralName
.class).getNameCache().trim();
412 if(taxNameString
.endsWith("agg.")){
413 taxNameString
= taxNameString
.replace("agg.", "aggr.");
415 if(hybString
.equals(RedListUtil
.HYB_X
)){
416 taxNameString
= taxNameString
.replace(RedListUtil
.HYB_SIGN
+" ", RedListUtil
.HYB_SIGN
);//hybrid sign has no space after it in titleCache for binomial hybrids
418 if(taxNameString
.endsWith("- Gruppe")){
419 taxNameString
.replaceAll("- Gruppe", "species group");
421 if(taxNameString
.endsWith("- group")){
422 taxNameString
.replaceAll("- group", "species group");
424 if(!taxNameString
.trim().equals(nameCache
)){
425 RedListUtil
.logMessage(id
, "Taxon name inconsistent! taxon.titleCache <-> Column "+RedListUtil
.TAXNAME
+": "+nameCache
+" <-> "+taxNameString
, logger
);
429 private Rank
makeRank(long id
, RedListGefaesspflanzenImportState state
, String rankStr
) {
432 rank
= state
.getTransformer().getRankByKey(rankStr
);
433 } catch (UndefinedTransformerMethodException e
) {
437 RedListUtil
.logMessage(id
, rankStr
+" could not be associated to a known rank.", logger
);
442 private NomenclaturalStatusType
makeNomenclaturalStatus(long id
, RedListGefaesspflanzenImportState state
, String nomZusatzString
) {
443 NomenclaturalStatusType status
= null;
445 status
= state
.getTransformer().getNomenclaturalStatusByKey(nomZusatzString
);
446 } catch (UndefinedTransformerMethodException e
) {
450 RedListUtil
.logMessage(id
, nomZusatzString
+" could not be associated to a known nomenclatural status.", logger
);
458 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
,
459 RedListGefaesspflanzenImportState state
) {
460 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<>();
461 Map
<String
, AgentBase
<?
>> authorMap
= new HashMap
<String
, AgentBase
<?
>>();
465 String authorKombString
= rs
.getString(RedListUtil
.AUTOR_KOMB
);
467 if(authorKombString
.contains(RedListUtil
.EX
)){
468 String
[] kombSplit
= authorKombString
.split(RedListUtil
.EX
);
469 for (int i
= 0; i
< kombSplit
.length
; i
++) {
470 if(!authorMap
.containsKey(kombSplit
[i
])){
471 authorMap
.put(kombSplit
[i
], getAgentService().load(state
.getAuthorMap().get(kombSplit
[i
])));
475 else if(CdmUtils
.isNotBlank(authorKombString
) && !authorMap
.containsKey(authorKombString
)){
476 authorMap
.put(authorKombString
, getAgentService().load(state
.getAuthorMap().get(authorKombString
)));
479 String authorBasiString
= rs
.getString(RedListUtil
.AUTOR_BASI
);
481 if(authorBasiString
.contains(RedListUtil
.EX
)){
482 String
[] basiSplit
= authorBasiString
.split(RedListUtil
.EX
);
483 for (int i
= 0; i
< basiSplit
.length
; i
++) {
484 if(!authorMap
.containsKey(basiSplit
[i
])){
485 authorMap
.put(basiSplit
[i
], getAgentService().load(state
.getAuthorMap().get(basiSplit
[i
])));
489 else if(CdmUtils
.isNotBlank(authorBasiString
) && !authorMap
.containsKey(authorBasiString
)){
490 authorMap
.put(authorBasiString
, getAgentService().load(state
.getAuthorMap().get(authorBasiString
)));
493 } catch (SQLException e
) {
496 result
.put(RedListUtil
.AUTHOR_NAMESPACE
, authorMap
);
502 protected boolean doCheck(RedListGefaesspflanzenImportState state
) {
507 protected boolean isIgnore(RedListGefaesspflanzenImportState state
) {