562068a7c3d0ef0d9158f9a192a869ad8d2857ab
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / erms / ErmsSourceUsesImport.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9
10 package eu.etaxonomy.cdm.io.erms;
11
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;
20
21 import java.sql.ResultSet;
22 import java.sql.SQLException;
23 import java.util.HashMap;
24 import java.util.HashSet;
25 import java.util.Map;
26 import java.util.Set;
27
28 import org.apache.log4j.Logger;
29 import org.springframework.stereotype.Component;
30
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;
51
52 /**
53 * @author a.mueller
54 * @created 20.02.2010
55 * @version 1.0
56 */
57 @Component
58 public class ErmsSourceUsesImport extends ErmsImportBase<CommonTaxonName> {
59 private static final Logger logger = Logger.getLogger(ErmsSourceUsesImport.class);
60
61 private DbImportMapping mapping; //not needed
62
63
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;
68
69 public ErmsSourceUsesImport(){
70 super(pluralString, dbTableName, cdmTargetClass);
71 }
72
73
74 /* (non-Javadoc)
75 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getIdQuery()
76 */
77 @Override
78 protected String getIdQuery() {
79 String strQuery = " SELECT sourceuse_id, source_id, tu_id " + " " +
80 " FROM tu_sources " +
81 " ORDER BY sourceuse_id, source_id, tu_id ";
82 return strQuery;
83 }
84
85
86
87 /* (non-Javadoc)
88 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getRecordQuery(eu.etaxonomy.cdm.io.erms.ErmsImportConfigurator)
89 */
90 @Override
91 protected String getRecordQuery(ErmsImportConfigurator config) {
92 String strRecordQuery =
93 " SELECT * " +
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;
99 }
100
101
102 public boolean doPartition(ResultSetPartitioner partitioner, ErmsImportState state) {
103 boolean success = true ;
104 ErmsImportConfigurator config = state.getConfig();
105 Set objectsToSave = new HashSet<IdentifiableEntity>();
106
107 // DbImportMapping<?, ?> mapping = getMapping();
108 // mapping.initialize(state, cdmTargetClass);
109
110 ResultSet rs = partitioner.getResultSet();
111 try{
112 while (rs.next()){
113 //success &= mapping.invoke(rs,referencesToSave);
114
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)){
123 strPageNr = null;
124 }
125 ReferenceBase ref = (ReferenceBase)state.getRelatedObject(ErmsReferenceImport.REFERENCE_NAMESPACE, strSourceId);
126
127 try {
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);
146 }
147 if(objectToSave != null){
148 objectsToSave.add(objectToSave);
149 }
150 } catch (Exception e) {
151 e.printStackTrace();
152 success = false;
153 }
154 }
155 } catch (SQLException e) {
156 logger.error("SQLException:" + e);
157 return false;
158 }
159
160 partitioner.startDoSave();
161 getCommonService().save(objectsToSave);
162 return success;
163 }
164
165
166 /**
167 * @param strTaxonId
168 * @param ref
169 * @param state
170 * @param partitioner
171 * @param strPageNr
172 *
173 */
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);
178 return taxonName;
179 }
180
181 /**
182 * @param partitioner
183 * @param state
184 * @param ref
185 * @param strTaxonId
186 * @param strPageNr
187 */
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;
193 }
194 return null;
195 }
196
197 /**
198 * @param partitioner
199 * @param state
200 * @param ref
201 * @param strTaxonId
202 * @param strPageNr
203 */
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);
208 if (source == null){
209 logger.warn("Source is null");
210 return null;
211 }
212 TaxonBase taxonBase = (TaxonBase)state.getRelatedObject(ErmsTaxonImport.TAXON_NAMESPACE, strTaxonId);
213 Taxon taxon;
214
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);
222 return null;
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);
227 return null;
228 //throw new IllegalStateException(warning);
229 }
230 taxon = taxa.iterator().next();
231 //add synonym name as name used in source
232 source.setNameUsedInSource(synonym.getName());
233 }else{
234 taxon = (Taxon)taxonBase;
235 }
236
237 //get or create description and add the element
238 TaxonDescription description;
239 if (taxon.getDescriptions().size() > 0){
240 description = taxon.getDescriptions().iterator().next();
241 }else{
242 description = TaxonDescription.NewInstance(taxon);
243 }
244 description.addElement(element);
245 return taxon;
246 }
247
248 /**
249 * @param partitioner
250 * @param state
251 * @param ref
252 * @param strTaxonId
253 * @param strPageNr
254 */
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);
260 return null;
261 }else if (! taxonBase.isInstanceOf(Synonym.class)){
262 String warning = "TaxonBase is not of class Synonym but " + taxonBase.getClass().getSimpleName();
263 logger.warn(warning);
264 return null;
265 }
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!");
270 }else{
271 SynonymRelationship synRel = synRels.iterator().next();
272 synRel.setCitation(ref);
273 synRel.setCitationMicroReference(strPageNr);
274 }
275 return taxonBase;
276 }
277
278 /**
279 * @param partitioner
280 * @param state
281 * @param ref
282 * @param strTaxonId
283 * @param strPageNr
284 */
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;
290 }
291 return null;
292 }
293
294 /**
295 * @param partitioner
296 * @param state
297 * @param ref
298 * @param strTaxonId
299 * @param strPageNr
300 */
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);
307 return taxonName;
308 }
309
310
311 /**
312 * @param partitioner
313 * @param state
314 * @param ref
315 * @param strTaxonId
316 * @param strPageNr
317 */
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;
323 }
324 return null;
325 }
326
327 /**
328 * @param partitioner
329 * @param state
330 * @param ref
331 * @param strTaxonId
332 * @param strPageNr
333 */
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;
339 }
340 return null;
341 }
342
343
344
345 /* (non-Javadoc)
346 * @see eu.etaxonomy.cdm.io.common.mapping.IMappingImport#createObject(java.sql.ResultSet, eu.etaxonomy.cdm.io.common.ImportStateBase)
347 */
348 public CommonTaxonName createObject(ResultSet rs, ErmsImportState state)
349 throws SQLException {
350 return null; //not needed
351 }
352
353 /* (non-Javadoc)
354 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
355 */
356 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
357 String nameSpace;
358 Class cdmClass;
359 Set<String> idSet;
360 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
361
362 try{
363 Set<String> taxonIdSet = new HashSet<String>();
364 Set<String> nameIdSet = new HashSet<String>();
365 Set<String> referenceIdSet = new HashSet<String>();
366 while (rs.next()){
367 handleForeignKey(rs, taxonIdSet, "tu_id");
368 handleForeignKey(rs, nameIdSet, "tu_id");
369 handleForeignKey(rs, referenceIdSet, "source_id");
370 }
371
372 //name map
373 nameSpace = ErmsTaxonImport.NAME_NAMESPACE;
374 cdmClass = TaxonNameBase.class;
375 idSet = nameIdSet;
376 Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
377 result.put(nameSpace, nameMap);
378
379 //taxon map
380 nameSpace = ErmsTaxonImport.TAXON_NAMESPACE;
381 cdmClass = TaxonBase.class;
382 idSet = taxonIdSet;
383 Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
384 result.put(nameSpace, taxonMap);
385
386 //reference map
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);
392
393
394 } catch (SQLException e) {
395 throw new RuntimeException(e);
396 }
397 return result;
398
399 }
400
401 /* (non-Javadoc)
402 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
403 */
404 @Override
405 protected boolean doCheck(ErmsImportState state){
406 IOValidator<ErmsImportState> validator = new ErmsSourceUsesImportValidator();
407 return validator.validate(state);
408 }
409
410 /* (non-Javadoc)
411 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
412 */
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;
417 }
418
419
420 /* (non-Javadoc)
421 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getMapping()
422 */
423 @Override
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
427 }
428
429 }