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
.T_STATUS_ACCEPTED
;
13 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.T_STATUS_PARTIAL_SYN
;
14 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.T_STATUS_PRO_PARTE_SYN
;
15 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.T_STATUS_SYNONYM
;
16 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.T_STATUS_UNRESOLVED
;
18 import java
.lang
.reflect
.Method
;
19 import java
.sql
.ResultSet
;
20 import java
.sql
.SQLException
;
21 import java
.util
.HashMap
;
22 import java
.util
.HashSet
;
25 import java
.util
.UUID
;
27 import org
.apache
.commons
.lang
.StringUtils
;
28 import org
.apache
.log4j
.Logger
;
29 import org
.springframework
.stereotype
.Component
;
31 import eu
.etaxonomy
.cdm
.database
.update
.DatabaseTypeNotSupportedException
;
32 import eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
;
33 import eu
.etaxonomy
.cdm
.io
.berlinModel
.in
.validation
.BerlinModelTaxonImportValidator
;
34 import eu
.etaxonomy
.cdm
.io
.common
.IOValidator
;
35 import eu
.etaxonomy
.cdm
.io
.common
.ResultSetPartitioner
;
36 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
37 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
38 import eu
.etaxonomy
.cdm
.model
.common
.Extension
;
39 import eu
.etaxonomy
.cdm
.model
.common
.ExtensionType
;
40 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
41 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
42 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
43 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
44 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
53 public class BerlinModelTaxonImport
extends BerlinModelImportBase
{
54 private static final Logger logger
= Logger
.getLogger(BerlinModelTaxonImport
.class);
56 public static final String NAMESPACE
= "Taxon";
58 private static final String pluralString
= "Taxa";
59 private static final String dbTableName
= "PTaxon";
62 * How should the publish flag in table PTaxon be interpreted
63 * NO_MARKER: No marker is set
66 public enum PublishMarkerChooser
{
72 boolean doMark(boolean value
){
74 return this == ALL
|| this == ONLY_TRUE
;
76 return this == ALL
|| this == ONLY_FALSE
;
81 public BerlinModelTaxonImport(){
82 super(dbTableName
, pluralString
);
86 protected String
getIdQuery(BerlinModelImportState state
) {
87 String sqlSelect
= " SELECT RIdentifier";
88 String taxonTable
= state
.getConfig().getTaxonTable();
89 String sqlFrom
= String
.format(" FROM %s ", taxonTable
);
92 String sql
= sqlSelect
+ " " + sqlFrom
+ " " + sqlWhere
;
97 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
98 String sqlSelect
= " SELECT pt.* ";
99 String sqlFrom
= " FROM PTaxon pt ";
100 if (isEuroMed(config
) ){
101 sqlFrom
= " FROM PTaxon AS pt " +
102 " INNER JOIN v_cdm_exp_taxaAll AS em ON pt.RIdentifier = em.RIdentifier " +
103 " LEFT OUTER JOIN Reference r ON pt.LastScrutinyFk = r.RefId ";
104 sqlSelect
+= " , em.MA, r.RefCache as LastScrutiny ";
108 String sqlWhere
= " WHERE ( pt.RIdentifier IN (" + ID_LIST_TOKEN
+ ") )";
110 String strRecordQuery
=sqlSelect
+ " " + sqlFrom
+ " " + sqlWhere
;
112 // " FROM PTaxon " + state.getConfig().getTaxonTable();
113 // " WHERE ( RIdentifier IN (" + ID_LIST_TOKEN + ") )";
114 return strRecordQuery
;
117 private boolean isEuroMed(BerlinModelImportConfigurator config
) {
118 return config
.getTaxonTable().trim().equals("v_cdm_exp_taxaAll");
122 protected boolean doCheck(BerlinModelImportState state
){
123 IOValidator
<BerlinModelImportState
> validator
= new BerlinModelTaxonImportValidator();
124 return validator
.validate(state
);
128 public boolean doPartition(ResultSetPartitioner partitioner
, BerlinModelImportState state
) {
129 boolean success
= true ;
131 BerlinModelImportConfigurator config
= state
.getConfig();
132 Set
<TaxonBase
> taxaToSave
= new HashSet
<TaxonBase
>();
133 Map
<String
, TaxonNameBase
> taxonNameMap
= partitioner
.getObjectMap(BerlinModelTaxonNameImport
.NAMESPACE
);
134 Map
<String
, Reference
> refMap
= partitioner
.getObjectMap(BerlinModelReferenceImport
.REFERENCE_NAMESPACE
);
136 ResultSet rs
= partitioner
.getResultSet();
138 boolean publishFlagExists
= state
.getConfig().getSource().checkColumnExists("PTaxon", "PublishFlag");
139 boolean isEuroMed
= isEuroMed(state
.getConfig());
142 // if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("PTaxa handled: " + (i-1));}
144 //create TaxonName element
145 int taxonId
= rs
.getInt("RIdentifier");
146 int statusFk
= rs
.getInt("statusFk");
148 int nameFk
= rs
.getInt("PTNameFk");
149 int refFkInt
= rs
.getInt("PTRefFk");
150 String doubtful
= rs
.getString("DoubtfulFlag");
152 if (resultSetHasColumn(rs
,"UUID")){
153 uuid
= rs
.getString("UUID");
156 TaxonNameBase
<?
,?
> taxonName
= null;
157 taxonName
= taxonNameMap
.get(String
.valueOf(nameFk
));
159 Reference
<?
> reference
= null;
160 String refFk
= String
.valueOf(refFkInt
);
161 reference
= refMap
.get(refFk
);
163 if(! config
.isIgnoreNull()){
164 if (taxonName
== null ){
165 logger
.warn("TaxonName belonging to taxon (RIdentifier = " + taxonId
+ ") could not be found in store. Taxon will not be imported");
167 continue; //next taxon
168 }else if (reference
== null ){
169 logger
.warn("Reference belonging to taxon could not be found in store. Taxon will not be imported");
171 continue; //next taxon
174 TaxonBase
<?
> taxonBase
;
178 logger
.debug(statusFk
);
179 if (statusFk
== T_STATUS_ACCEPTED
|| statusFk
== T_STATUS_UNRESOLVED
){
180 taxon
= Taxon
.NewInstance(taxonName
, reference
);
182 if (statusFk
== T_STATUS_UNRESOLVED
){
183 taxon
.setTaxonStatusUnknown(true);
185 }else if (statusFk
== T_STATUS_SYNONYM
|| statusFk
== T_STATUS_PRO_PARTE_SYN
|| statusFk
== T_STATUS_PARTIAL_SYN
){
186 synonym
= Synonym
.NewInstance(taxonName
, reference
);
188 if (statusFk
== T_STATUS_PRO_PARTE_SYN
){
189 config
.addProParteSynonym(synonym
);
191 if (statusFk
== T_STATUS_PARTIAL_SYN
){
192 config
.addPartialSynonym(synonym
);
195 logger
.warn("TaxonStatus " + statusFk
+ " not yet implemented. Taxon (RIdentifier = " + taxonId
+ ") left out.");
200 taxonBase
.setUuid(UUID
.fromString(uuid
));
204 if (doubtful
.equals("a")){
205 taxonBase
.setDoubtful(false);
206 }else if(doubtful
.equals("d")){
207 taxonBase
.setDoubtful(true);
208 }else if(doubtful
.equals("i")){
209 taxonBase
.setDoubtful(false);
210 logger
.warn("Doubtful = i (inactivated) does not exist in CDM. Doubtful set to false. RIdentifier: " + taxonId
);
214 String detail
= rs
.getString("Detail");
215 if (StringUtils
.isNotBlank(detail
)){
216 ExtensionType detailExtensionType
= getExtensionType(state
, BerlinModelTransformer
.DETAIL_EXT_UUID
, "micro reference","micro reference","micro ref.");
217 Extension
.NewInstance(taxonBase
, detail
, detailExtensionType
);
220 String idInSource
= rs
.getString("IdInSource");
221 if (StringUtils
.isNotBlank(idInSource
)){
222 ExtensionType detailExtensionType
= getExtensionType(state
, BerlinModelTransformer
.ID_IN_SOURCE_EXT_UUID
, "Berlin Model IdInSource","Berlin Model IdInSource","BM source id");
223 Extension
.NewInstance(taxonBase
, idInSource
, detailExtensionType
);
226 String namePhrase
= rs
.getString("NamePhrase");
227 if (StringUtils
.isNotBlank(namePhrase
)){
228 taxonBase
.setAppendedPhrase(namePhrase
);
231 Boolean useNameCacheFlag
= rs
.getBoolean("UseNameCacheFlag");
232 if (useNameCacheFlag
){
233 taxonBase
.setUseNameCache(true);
236 if (publishFlagExists
){
237 Boolean publishFlag
= rs
.getBoolean("PublishFlag");
238 Boolean misapplied
= false;
240 misapplied
= rs
.getBoolean("MA");
244 taxonBase
.setPublish(publishFlag
);
249 if (resultSetHasColumn(rs
,"LastScrutiny")){
250 String lastScrutiny
= rs
.getString("LastScrutiny");
251 ExtensionType extensionTypeSpeciesExpert
= getExtensionType(state
, BerlinModelTransformer
.uuidSpeciesExpertName
, "Species Expert", "Species Expert", "Species Expert");
252 taxonBase
.addExtension(lastScrutiny
, extensionTypeSpeciesExpert
);
253 ExtensionType extensionTypeExpert
= getExtensionType(state
, BerlinModelTransformer
.uuidExpertName
, "Expert", "Expert for a taxonomic group", "Expert");
254 taxonBase
.addExtension(lastScrutiny
, extensionTypeExpert
);
258 doIdCreatedUpdatedNotes(state
, taxonBase
, rs
, taxonId
, NAMESPACE
);
261 if (config
.getMakeUrlForTaxon() != null){
262 Method urlMethod
= config
.getMakeUrlForTaxon();
263 urlMethod
.invoke(null, taxonBase
, rs
);
266 partitioner
.startDoSave();
267 taxaToSave
.add(taxonBase
);
268 } catch (Exception e
) {
269 logger
.warn("An exception (" +e
.getMessage()+") occurred when creating taxon with id " + taxonId
+ ". Taxon could not be saved.");
273 } catch (DatabaseTypeNotSupportedException e
) {
274 logger
.error("MethodNotSupportedException:" + e
);
276 } catch (Exception e
) {
277 logger
.error("SQLException:" + e
);
282 // logger.info( i + " names handled");
283 getTaxonService().save(taxaToSave
);
288 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
, BerlinModelImportState state
) {
292 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
295 Set
<String
> nameIdSet
= new HashSet
<String
>();
296 Set
<String
> referenceIdSet
= new HashSet
<String
>();
298 handleForeignKey(rs
, nameIdSet
, "PTNameFk");
299 handleForeignKey(rs
, referenceIdSet
, "PTRefFk");
303 nameSpace
= BerlinModelTaxonNameImport
.NAMESPACE
;
304 cdmClass
= TaxonNameBase
.class;
306 Map
<String
, Person
> nameMap
= (Map
<String
, Person
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
307 result
.put(nameSpace
, nameMap
);
310 nameSpace
= BerlinModelReferenceImport
.REFERENCE_NAMESPACE
;
311 cdmClass
= Reference
.class;
312 idSet
= referenceIdSet
;
313 Map
<String
, Reference
> referenceMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
314 result
.put(nameSpace
, referenceMap
);
316 } catch (SQLException e
) {
317 throw new RuntimeException(e
);
323 protected String
getTableName() {
328 public String
getPluralString() {
333 protected boolean isIgnore(BerlinModelImportState state
){
334 return ! state
.getConfig().isDoTaxa();