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
.erms
;
12 import static eu
.etaxonomy
.cdm
.io
.erms
.ErmsTransformer
.SOURCE_USE_ADDITIONAL_SOURCE
;
13 import static eu
.etaxonomy
.cdm
.io
.erms
.ErmsTransformer
.SOURCE_USE_BASIS_OF_RECORD
;
14 import static eu
.etaxonomy
.cdm
.io
.erms
.ErmsTransformer
.SOURCE_USE_EMENDATION
;
15 import static eu
.etaxonomy
.cdm
.io
.erms
.ErmsTransformer
.SOURCE_USE_NEW_COMBINATION_REFERENCE
;
16 import static eu
.etaxonomy
.cdm
.io
.erms
.ErmsTransformer
.SOURCE_USE_ORIGINAL_DESCRIPTION
;
17 import static eu
.etaxonomy
.cdm
.io
.erms
.ErmsTransformer
.SOURCE_USE_REDESCRIPTION
;
18 import static eu
.etaxonomy
.cdm
.io
.erms
.ErmsTransformer
.SOURCE_USE_SOURCE_OF_SYNONYMY
;
19 import static eu
.etaxonomy
.cdm
.io
.erms
.ErmsTransformer
.SOURCE_USE_STATUS_SOURCE
;
21 import java
.sql
.ResultSet
;
22 import java
.sql
.SQLException
;
23 import java
.util
.HashMap
;
24 import java
.util
.HashSet
;
28 import org
.apache
.log4j
.Logger
;
29 import org
.springframework
.stereotype
.Component
;
31 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
32 import eu
.etaxonomy
.cdm
.io
.common
.IImportConfigurator
;
33 import eu
.etaxonomy
.cdm
.io
.common
.IOValidator
;
34 import eu
.etaxonomy
.cdm
.io
.common
.ResultSetPartitioner
;
35 import eu
.etaxonomy
.cdm
.io
.common
.mapping
.DbImportMapping
;
36 import eu
.etaxonomy
.cdm
.io
.erms
.validation
.ErmsSourceUsesImportValidator
;
37 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
38 import eu
.etaxonomy
.cdm
.model
.common
.DescriptionElementSource
;
39 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
40 import eu
.etaxonomy
.cdm
.model
.description
.CommonTaxonName
;
41 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
42 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
43 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
44 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
45 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
46 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceBase
;
47 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
48 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationship
;
49 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
50 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
58 public class ErmsSourceUsesImport
extends ErmsImportBase
<CommonTaxonName
> {
59 private static final Logger logger
= Logger
.getLogger(ErmsSourceUsesImport
.class);
61 private DbImportMapping mapping
; //not needed
64 private int modCount
= 10000;
65 private static final String pluralString
= "source uses";
66 private static final String dbTableName
= "tu_sources";
67 private static final Class cdmTargetClass
= null;
69 public ErmsSourceUsesImport(){
70 super(pluralString
, dbTableName
, cdmTargetClass
);
75 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getIdQuery()
78 protected String
getIdQuery() {
79 String strQuery
= " SELECT sourceuse_id, source_id, tu_id " + " " +
81 " ORDER BY sourceuse_id, source_id, tu_id ";
88 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getRecordQuery(eu.etaxonomy.cdm.io.erms.ErmsImportConfigurator)
91 protected String
getRecordQuery(ErmsImportConfigurator config
) {
92 String strRecordQuery
=
94 " FROM tu_sources INNER JOIN sourceuses ON tu_sources.sourceuse_id = sourceuses.sourceuse_id" +
95 " WHERE ( tu_sources.sourceuse_id IN (" + ID_LIST_TOKEN
+ ") AND " +
96 " tu_sources.source_id IN (" + ID_LIST_TOKEN
+ ") AND " +
97 " tu_sources.tu_id IN (" + ID_LIST_TOKEN
+ ") )";
98 return strRecordQuery
;
102 public boolean doPartition(ResultSetPartitioner partitioner
, ErmsImportState state
) {
103 boolean success
= true ;
104 ErmsImportConfigurator config
= state
.getConfig();
105 Set objectsToSave
= new HashSet
<IdentifiableEntity
>();
107 // DbImportMapping<?, ?> mapping = getMapping();
108 // mapping.initialize(state, cdmTargetClass);
110 ResultSet rs
= partitioner
.getResultSet();
113 //success &= mapping.invoke(rs,referencesToSave);
115 //read and normalize values
116 int sourceUseId
= rs
.getInt("sourceuse_id");
117 int sourceId
= rs
.getInt("source_id");
118 String strSourceId
= String
.valueOf(sourceId
);
119 int taxonId
= rs
.getInt("tu_id");
120 String strTaxonId
= String
.valueOf(taxonId
);
121 String strPageNr
= rs
.getString("pagenr");
122 if (CdmUtils
.isEmpty(strPageNr
)){
125 ReferenceBase ref
= (ReferenceBase
)state
.getRelatedObject(ErmsReferenceImport
.REFERENCE_NAMESPACE
, strSourceId
);
128 IdentifiableEntity objectToSave
= null;
129 //invoke methods for each sourceUse type
130 if (sourceUseId
== SOURCE_USE_ORIGINAL_DESCRIPTION
){
131 objectToSave
= makeOriginalDescription(partitioner
, state
, ref
, strTaxonId
, strPageNr
);
132 }else if (sourceUseId
== SOURCE_USE_BASIS_OF_RECORD
){
133 objectToSave
= makeBasisOfRecord(partitioner
, state
, ref
, strTaxonId
, strPageNr
);
134 }else if (sourceUseId
== SOURCE_USE_ADDITIONAL_SOURCE
){
135 objectToSave
= makeAdditionalSource(partitioner
, state
, ref
, strTaxonId
, strPageNr
);
136 }else if (sourceUseId
== SOURCE_USE_SOURCE_OF_SYNONYMY
){
137 objectToSave
= makeSourceOfSynonymy(partitioner
, state
, ref
, strTaxonId
, strPageNr
);
138 }else if (sourceUseId
== SOURCE_USE_REDESCRIPTION
){
139 objectToSave
= makeRedescription(partitioner
, state
, ref
, strTaxonId
, strPageNr
);
140 }else if (sourceUseId
== SOURCE_USE_NEW_COMBINATION_REFERENCE
){
141 objectToSave
= makeCombinationReference(partitioner
, state
, ref
, strTaxonId
, strPageNr
);
142 }else if (sourceUseId
== SOURCE_USE_STATUS_SOURCE
){
143 objectToSave
= makeStatusSource(partitioner
, state
, ref
, strTaxonId
, strPageNr
);
144 }else if (sourceUseId
== SOURCE_USE_EMENDATION
){
145 objectToSave
= makeEmendation(partitioner
, state
, ref
, strTaxonId
, strPageNr
);
147 if(objectToSave
!= null){
148 objectsToSave
.add(objectToSave
);
150 } catch (Exception e
) {
155 } catch (SQLException e
) {
156 logger
.error("SQLException:" + e
);
160 partitioner
.startDoSave();
161 getCommonService().save(objectsToSave
);
174 private TaxonNameBase
makeOriginalDescription(ResultSetPartitioner partitioner
, ErmsImportState state
, ReferenceBase ref
, String strTaxonId
, String strPageNr
) {
175 TaxonNameBase taxonName
= (TaxonNameBase
)state
.getRelatedObject(ErmsTaxonImport
.NAME_NAMESPACE
, strTaxonId
);
176 taxonName
.setNomenclaturalReference(ref
);
177 taxonName
.setNomenclaturalMicroReference(strPageNr
);
188 private boolean isFirstBasisOfRecord
= true;
189 private IdentifiableEntity
makeBasisOfRecord(ResultSetPartitioner partitioner
, ErmsImportState state
, ReferenceBase ref
, String strTaxonId
, String strPageNr
) {
190 if (isFirstBasisOfRecord
){
191 logger
.warn("Basis of record not yet implemented");
192 isFirstBasisOfRecord
= false;
204 private IdentifiableEntity
makeAdditionalSource(ResultSetPartitioner partitioner
, ErmsImportState state
, ReferenceBase ref
, String strTaxonId
, String strPageNr
) {
205 Feature citationFeature
= Feature
.CITATION();
206 DescriptionElementBase element
= TextData
.NewInstance(citationFeature
);
207 DescriptionElementSource source
= element
.addSource(null, null, ref
, strPageNr
);
209 logger
.warn("Source is null");
212 TaxonBase taxonBase
= (TaxonBase
)state
.getRelatedObject(ErmsTaxonImport
.TAXON_NAMESPACE
, strTaxonId
);
215 //if taxon base is a synonym, add the description to the accepted taxon
216 if (taxonBase
.isInstanceOf(Synonym
.class)){
217 Synonym synonym
= CdmBase
.deproxy(taxonBase
, Synonym
.class);
218 Set
<Taxon
> taxa
= synonym
.getAcceptedTaxa();
219 if (taxa
.size() < 1){
220 String warning
= "Synonym "+ strTaxonId
+ " has no accepted taxon";
221 logger
.warn(warning
);
223 //throw new IllegalStateException(warning);
224 }else if (taxa
.size() > 1){
225 String warning
= "Synonym "+ strTaxonId
+ " has more than 1 accepted taxon";
226 logger
.warn(warning
);
228 //throw new IllegalStateException(warning);
230 taxon
= taxa
.iterator().next();
231 //add synonym name as name used in source
232 source
.setNameUsedInSource(synonym
.getName());
234 taxon
= (Taxon
)taxonBase
;
237 //get or create description and add the element
238 TaxonDescription description
;
239 if (taxon
.getDescriptions().size() > 0){
240 description
= taxon
.getDescriptions().iterator().next();
242 description
= TaxonDescription
.NewInstance(taxon
);
244 description
.addElement(element
);
255 private IdentifiableEntity
makeSourceOfSynonymy(ResultSetPartitioner partitioner
, ErmsImportState state
, ReferenceBase ref
, String strTaxonId
, String strPageNr
) {
256 TaxonBase taxonBase
= (TaxonBase
)state
.getRelatedObject(ErmsTaxonImport
.TAXON_NAMESPACE
, strTaxonId
);
257 if (taxonBase
== null){
258 String warning
= "taxonBase (id = " + strTaxonId
+ ") could not be found ";
259 logger
.warn(warning
);
261 }else if (! taxonBase
.isInstanceOf(Synonym
.class)){
262 String warning
= "TaxonBase is not of class Synonym but " + taxonBase
.getClass().getSimpleName();
263 logger
.warn(warning
);
266 Synonym synonym
=CdmBase
.deproxy(taxonBase
, Synonym
.class);
267 Set
<SynonymRelationship
> synRels
= synonym
.getSynonymRelations();
268 if (synRels
.size() != 1){
269 logger
.warn("Synonym has not 1 but " + synRels
.size() + " relations!");
271 SynonymRelationship synRel
= synRels
.iterator().next();
272 synRel
.setCitation(ref
);
273 synRel
.setCitationMicroReference(strPageNr
);
285 private boolean isFirstRediscription
= true;
286 private IdentifiableEntity
makeRedescription(ResultSetPartitioner partitioner
, ErmsImportState state
, ReferenceBase ref
, String strTaxonId
, String strPageNr
) {
287 if (isFirstRediscription
){
288 logger
.warn("Rediscription not yet implemented");
289 isFirstRediscription
= false;
301 private IdentifiableEntity
makeCombinationReference(ResultSetPartitioner partitioner
, ErmsImportState state
, ReferenceBase ref
, String strTaxonId
, String strPageNr
) {
302 // Kopie von Orig. Comb.
303 //TODO ist das wirklich der richtige Name, oder muss ein verknüpfter Name verwendet werden
304 TaxonNameBase taxonName
= (TaxonNameBase
)state
.getRelatedObject(ErmsTaxonImport
.NAME_NAMESPACE
, strTaxonId
);
305 taxonName
.setNomenclaturalReference(ref
);
306 taxonName
.setNomenclaturalMicroReference(strPageNr
);
318 private boolean isFirstStatusSource
= true;
319 private IdentifiableEntity
makeStatusSource(ResultSetPartitioner partitioner
, ErmsImportState state
, ReferenceBase ref
, String strTaxonId
, String strPageNr
) {
320 if (isFirstStatusSource
){
321 logger
.warn("StatusSource not yet implemented");
322 isFirstStatusSource
= false;
334 private boolean isFirstEmendation
= true;
335 private IdentifiableEntity
makeEmendation(ResultSetPartitioner partitioner
, ErmsImportState state
, ReferenceBase ref
, String strTaxonId
, String strPageNr
) {
336 if (isFirstEmendation
){
337 logger
.warn("Emmendation not yet implemented");
338 isFirstEmendation
= false;
346 * @see eu.etaxonomy.cdm.io.common.mapping.IMappingImport#createObject(java.sql.ResultSet, eu.etaxonomy.cdm.io.common.ImportStateBase)
348 public CommonTaxonName
createObject(ResultSet rs
, ErmsImportState state
)
349 throws SQLException
{
350 return null; //not needed
354 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
356 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
) {
360 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
363 Set
<String
> taxonIdSet
= new HashSet
<String
>();
364 Set
<String
> nameIdSet
= new HashSet
<String
>();
365 Set
<String
> referenceIdSet
= new HashSet
<String
>();
367 handleForeignKey(rs
, taxonIdSet
, "tu_id");
368 handleForeignKey(rs
, nameIdSet
, "tu_id");
369 handleForeignKey(rs
, referenceIdSet
, "source_id");
373 nameSpace
= ErmsTaxonImport
.NAME_NAMESPACE
;
374 cdmClass
= TaxonNameBase
.class;
376 Map
<String
, TaxonNameBase
> nameMap
= (Map
<String
, TaxonNameBase
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
377 result
.put(nameSpace
, nameMap
);
380 nameSpace
= ErmsTaxonImport
.TAXON_NAMESPACE
;
381 cdmClass
= TaxonBase
.class;
383 Map
<String
, TaxonBase
> taxonMap
= (Map
<String
, TaxonBase
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
384 result
.put(nameSpace
, taxonMap
);
387 nameSpace
= ErmsReferenceImport
.REFERENCE_NAMESPACE
;
388 cdmClass
= ReferenceBase
.class;
389 idSet
= referenceIdSet
;
390 Map
<String
, ReferenceBase
> referenceMap
= (Map
<String
, ReferenceBase
>)getCommonService().getSourcedObjectsByIdInSource(ReferenceBase
.class, idSet
, nameSpace
);
391 result
.put(nameSpace
, referenceMap
);
394 } catch (SQLException e
) {
395 throw new RuntimeException(e
);
402 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
405 protected boolean doCheck(ErmsImportState state
){
406 IOValidator
<ErmsImportState
> validator
= new ErmsSourceUsesImportValidator();
407 return validator
.validate(state
);
411 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
413 protected boolean isIgnore(ErmsImportState state
){
414 boolean result
= state
.getConfig().getDoReferences() != IImportConfigurator
.DO_REFERENCES
.ALL
;
415 result
&= state
.getConfig().isDoTaxa();
416 return state
.getConfig().getDoReferences() != IImportConfigurator
.DO_REFERENCES
.ALL
;
421 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getMapping()
424 protected DbImportMapping
<?
, ?
> getMapping() {
425 logger
.warn("getMapping not yet implemented for EmrsSourceUsesImport");
426 return null; // not needed because Mapping is not implemented in this class yet