Project

General

Profile

Download (15 KB) Statistics
| Branch: | Revision:
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.algaterra;
11

    
12
import java.sql.ResultSet;
13
import java.sql.SQLException;
14
import java.util.HashMap;
15
import java.util.HashSet;
16
import java.util.Map;
17
import java.util.Set;
18

    
19
import org.apache.commons.lang.StringUtils;
20
import org.apache.log4j.Logger;
21
import org.springframework.stereotype.Component;
22

    
23
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
24
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade.DerivedUnitType;
25
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
26
import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraTypeImportValidator;
27
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
28
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
29
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelReferenceImport;
30
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelTaxonNameImport;
31
import eu.etaxonomy.cdm.io.common.IOValidator;
32
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
33
import eu.etaxonomy.cdm.model.common.CdmBase;
34
import eu.etaxonomy.cdm.model.name.BotanicalName;
35
import eu.etaxonomy.cdm.model.name.Rank;
36
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
37
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
38
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
39
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
40
import eu.etaxonomy.cdm.model.occurrence.FieldObservation;
41
import eu.etaxonomy.cdm.model.reference.Reference;
42

    
43

    
44
/**
45
 * @author a.mueller
46
 * @created 20.03.2008
47
 * @version 1.0
48
 */
49
@Component
50
public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
51
	private static final Logger logger = Logger.getLogger(AlgaTerraTypeImport.class);
52

    
53
	
54
	private static int modCount = 5000;
55
	private static final String pluralString = "types";
56
	private static final String dbTableName = "TypeDesignation";  //??  
57

    
58
	protected String getLocalityString(){
59
		return "TypeLocality";
60
	}
61
	
62
	public AlgaTerraTypeImport(){
63
		super();
64
	}
65
	
66
	
67
	/* (non-Javadoc)
68
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
69
	 */
70
	@Override
71
	protected String getIdQuery(BerlinModelImportState state) {
72
		String result = " SELECT TypeDesignationId "  
73
				+ " FROM TypeDesignation " 
74
				+ " ORDER BY NameFk ";
75
		return result;
76
	}
77

    
78
	/* (non-Javadoc)
79
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
80
	 */
81
	@Override
82
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
83
			String strQuery =    
84
					
85
			" SELECT ts.*, td.*, gz.ID as GazetteerId, gz.L2Code, gz.L3Code, gz.L4Code, gz.ISOCountry, gz.Country, ts.WaterBody " + 
86
               " " +
87
            " FROM TypeSpecimenDesignation tsd  " 
88
            	+ " LEFT OUTER JOIN TypeSpecimen AS ts ON tsd.TypeSpecimenFk = ts.TypeSpecimenId " 
89
            	+ " FULL OUTER JOIN TypeDesignation td ON  td.TypeDesignationId = tsd.TypeDesignationFk "
90
            	+ " LEFT OUTER JOIN TDWGGazetteer gz ON ts.TDWGGazetteerFk = gz.ID "
91
		+ 	" WHERE (td.TypeDesignationId IN (" + ID_LIST_TOKEN + ")  )"  
92
          + " ORDER BY NameFk "
93
            ;
94
		return strQuery;
95
	}
96

    
97
	/* (non-Javadoc)
98
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
99
	 */
100
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState bmState) {
101
		boolean success = true;
102
		
103
		AlgaTerraImportState state = (AlgaTerraImportState)bmState;
104
		
105
		//TODO check that no duplicate vocabularies will be created, also remove redundant code here
106
//		and in Specimen importer
107
		try {
108
			makeVocabulariesAndFeatures(state);
109
		} catch (SQLException e1) {
110
			logger.warn("Exception occurred when trying to create Type specimen vocabularies: " + e1.getMessage());
111
			e1.printStackTrace();
112
		}
113
		
114
		
115
		
116
		Set<TaxonNameBase> namesToSave = new HashSet<TaxonNameBase>();
117
		
118
		Map<String, TaxonNameBase> taxonNameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
119
		Map<String, DerivedUnit> ecoFactMap = (Map<String, DerivedUnit>) partitioner.getObjectMap(AlgaTerraSpecimenImport.ECO_FACT_NAMESPACE);
120
		Map<String, DerivedUnit> typeSpecimenMap = (Map<String, DerivedUnit>) partitioner.getObjectMap(TYPE_SPECIMEN_NAMESPACE);
121
		Map<String, Reference> biblioReference = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);
122
		
123
		
124
		ResultSet rs = partitioner.getResultSet();
125

    
126
		try {
127
			
128
			int i = 0;
129

    
130
			//for each reference
131
            while (rs.next()){
132
                
133
        		if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("Type designations handled: " + (i-1));}
134
				
135
				int nameId = rs.getInt("nameFk");
136
				int typeSpecimenId = rs.getInt("TypeSpecimenId");
137
				int typeDesignationId = rs.getInt("TypeDesignationId");
138
				Integer typeStatusFk =  nullSafeInt(rs, "typeStatusFk");
139
				Integer ecoFactId = nullSafeInt(rs, "ecoFactFk");
140
//				String recordBasis = rs.getString("RecordBasis");
141
				
142
				try {
143
					
144
					//source ref
145
					Reference<?> sourceRef = state.getTransactionalSourceReference();
146
				
147
					//facade
148
					//FIXME - depends on material category
149
//					DerivedUnitType type = makeDerivedUnitType(recordBasis);
150
					DerivedUnitType type = DerivedUnitType.Specimen;
151
					DerivedUnitFacade facade = getDerivedUnit(state, typeSpecimenId, typeSpecimenMap, type, ecoFactMap, ecoFactId);
152
					
153
					//field observation
154
					handleSingleSpecimen(rs, facade, state);
155
					
156
					handleTypeSpecimenSpecificSpecimen(rs,facade, state);
157
					
158
					state.setCurrentFieldObservationNotNew(false);
159
					
160
					//Designation
161
					TaxonNameBase<?,?> name = getTaxonName(state, taxonNameMap, nameId);
162
					SpecimenTypeDesignation designation = SpecimenTypeDesignation.NewInstance();
163
					SpecimenTypeDesignationStatus status = getSpecimenTypeDesignationStatusByKey(typeStatusFk);
164
					designation.setTypeSpecimen(facade.innerDerivedUnit());
165
					designation.setTypeStatus(status);
166
					if (name != null){
167
						name.addTypeDesignation(designation, true); //TODO check if true is correct
168
					}else{
169
						logger.warn("Name could not be found for type designation " + typeDesignationId);
170
					}
171
					namesToSave.add(name); 
172
					
173

    
174
				} catch (Exception e) {
175
					logger.warn("Exception in TypeDesignation: TypeDesignationId " + typeDesignationId + ". " + e.getMessage());
176
					e.printStackTrace();
177
				} 
178
                
179
            }
180
           
181
//            logger.warn("Specimen: " + countSpecimen + ", Descriptions: " + countDescriptions );
182

    
183
			logger.warn("Names to save: " + namesToSave.size());
184
			getNameService().save(namesToSave);	
185
			
186
			return success;
187
		} catch (SQLException e) {
188
			logger.error("SQLException:" +  e);
189
			return false;
190
		}
191
	}
192

    
193
	/**
194
	 * @param state 
195
	 * @param taxonNameMap
196
	 * @param nameId
197
	 * @return
198
	 */
199
	private TaxonNameBase getTaxonName(AlgaTerraImportState state, Map<String, TaxonNameBase> taxonNameMap, int nameId) {
200
		TaxonNameBase result;
201
		if (state.getConfig().isDoTaxonNames()){
202
			result = taxonNameMap.get(String.valueOf(nameId));
203
		}else{
204
			//for testing
205
			result = BotanicalName.NewInstance(Rank.SPECIES());
206
		}
207
		return result;
208
	}
209

    
210
	private void handleTypeSpecimenSpecificSpecimen(ResultSet rs, DerivedUnitFacade facade, AlgaTerraImportState state) throws SQLException {
211
		//TODO
212
		
213
		
214
		//collection
215
		String barcode = rs.getString("Barcode");
216
		if (StringUtils.isNotBlank(barcode)){
217
			facade.setBarcode(barcode);
218
		}
219
		
220
	}
221

    
222
	/**
223
	 * @param state
224
	 * @param ecoFactId
225
	 * @param derivedUnitMap
226
	 * @param type 
227
	 * @param ecoFactId2 
228
	 * @param ecoFactMap 
229
	 * @return
230
	 */
231
	private DerivedUnitFacade getDerivedUnit(AlgaTerraImportState state, int typeSpecimenId, Map<String, DerivedUnit> typeSpecimenMap, DerivedUnitType type, Map<String, DerivedUnit> ecoFactMap, Integer ecoFactId2) {
232
		//TODO implement ecoFact map - if not all null anymore
233
		String typeKey = String.valueOf(typeSpecimenId);
234
		DerivedUnit derivedUnit = typeSpecimenMap.get(typeKey);
235
		DerivedUnitFacade facade;
236
		if (derivedUnit == null){
237
			facade = DerivedUnitFacade.NewInstance(type);
238
			typeSpecimenMap.put(typeKey, derivedUnit);
239
		}else{
240
			try {
241
				facade = DerivedUnitFacade.NewInstance(derivedUnit);
242
			} catch (DerivedUnitFacadeNotSupportedException e) {
243
				logger.error(e.getMessage());
244
				facade = DerivedUnitFacade.NewInstance(type);
245
			}
246
		}
247
		
248
		return facade;
249
	}
250
	private DerivedUnitType makeDerivedUnitType(String recordBasis) {
251
		DerivedUnitType result = null;
252
		if (StringUtils.isBlank(recordBasis)){
253
			result = DerivedUnitType.DerivedUnit;
254
		} else if (recordBasis.equalsIgnoreCase("FossileSpecimen")){
255
			result = DerivedUnitType.Fossil;
256
		}else if (recordBasis.equalsIgnoreCase("HumanObservation")){
257
			result = DerivedUnitType.Observation;
258
		}else if (recordBasis.equalsIgnoreCase("Literature")){
259
			logger.warn("Literature record basis not yet supported");
260
			result = DerivedUnitType.DerivedUnit;
261
		}else if (recordBasis.equalsIgnoreCase("LivingSpecimen")){
262
			result = DerivedUnitType.LivingBeing;
263
		}else if (recordBasis.equalsIgnoreCase("MachineObservation")){
264
			logger.warn("MachineObservation record basis not yet supported");
265
			result = DerivedUnitType.Observation;
266
		}else if (recordBasis.equalsIgnoreCase("PreservedSpecimen")){
267
			result = DerivedUnitType.Specimen;
268
		}
269
		return result;
270
	}
271

    
272
	
273
	private SpecimenTypeDesignationStatus getSpecimenTypeDesignationStatusByKey(Integer typeStatusFk) {
274
		if (typeStatusFk == null){ return null;
275
		}else if (typeStatusFk == 1) { return SpecimenTypeDesignationStatus.HOLOTYPE();
276
		}else if (typeStatusFk == 2) { return SpecimenTypeDesignationStatus.LECTOTYPE();
277
		}else if (typeStatusFk == 3) { return SpecimenTypeDesignationStatus.NEOTYPE();
278
		}else if (typeStatusFk == 4) { return SpecimenTypeDesignationStatus.EPITYPE();
279
		}else if (typeStatusFk == 5) { return SpecimenTypeDesignationStatus.ISOLECTOTYPE();
280
		}else if (typeStatusFk == 6) { return SpecimenTypeDesignationStatus.ISONEOTYPE();
281
		}else if (typeStatusFk == 7) { return SpecimenTypeDesignationStatus.ISOTYPE();
282
		}else if (typeStatusFk == 8) { return SpecimenTypeDesignationStatus.PARANEOTYPE();
283
		}else if (typeStatusFk == 9) { return SpecimenTypeDesignationStatus.PARATYPE();
284
		}else if (typeStatusFk == 10) { return SpecimenTypeDesignationStatus.SECOND_STEP_LECTOTYPE();
285
		}else if (typeStatusFk == 11) { return SpecimenTypeDesignationStatus.SECOND_STEP_NEOTYPE();
286
		}else if (typeStatusFk == 12) { return SpecimenTypeDesignationStatus.SYNTYPE();
287
		}else if (typeStatusFk == 13) { return SpecimenTypeDesignationStatus.PARALECTOTYPE();
288
		}else if (typeStatusFk == 14) { return SpecimenTypeDesignationStatus.ISOEPITYPE();
289
		}else if (typeStatusFk == 21) { return SpecimenTypeDesignationStatus.ICONOTYPE();
290
		}else if (typeStatusFk == 22) { return SpecimenTypeDesignationStatus.PHOTOTYPE();
291
		}else if (typeStatusFk == 30) { return SpecimenTypeDesignationStatus.TYPE();
292
		}else if (typeStatusFk == 38) { return SpecimenTypeDesignationStatus.ISOEPITYPE();
293
//		}else if (typeStatusFk == 39) { return SpecimenTypeDesignationStatus.;
294
		}else if (typeStatusFk == 40) { return SpecimenTypeDesignationStatus.ORIGINAL_MATERIAL();
295
		}else{
296
			logger.warn("typeStatusFk undefined for " +  typeStatusFk);
297
			return SpecimenTypeDesignationStatus.TYPE();
298
		}
299
		
300
	}
301

    
302
	
303
	/* (non-Javadoc)
304
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
305
	 */
306
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
307
		String nameSpace;
308
		Class cdmClass;
309
		Set<String> idSet;
310
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
311
		
312
		try{
313
			Set<String> nameIdSet = new HashSet<String>();
314
			Set<String> ecoFieldObservationIdSet = new HashSet<String>();
315
			Set<String> typeSpecimenIdSet = new HashSet<String>();
316
			Set<String> termsIdSet = new HashSet<String>();
317
			
318
			while (rs.next()){
319
				handleForeignKey(rs, nameIdSet, "nameFk");
320
				handleForeignKey(rs, ecoFieldObservationIdSet, "ecoFactFk");
321
				handleForeignKey(rs, typeSpecimenIdSet, "TypeSpecimenId");
322
			}
323
			
324
			//name map
325
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
326
			cdmClass = TaxonNameBase.class;
327
			idSet = nameIdSet;
328
			Map<String, TaxonNameBase> objectMap = (Map<String, TaxonNameBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
329
			result.put(nameSpace, objectMap);
330

    
331
			//eco fact field observation map
332
			nameSpace = AlgaTerraTypeImport.ECO_FACT_NAMESPACE;
333
			cdmClass = FieldObservation.class;
334
			idSet = ecoFieldObservationIdSet;
335
			Map<String, FieldObservation> fieldObservationMap = (Map<String, FieldObservation>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
336
			result.put(nameSpace, fieldObservationMap);
337

    
338
			//type specimen map
339
			nameSpace = AlgaTerraTypeImport.TYPE_SPECIMEN_NAMESPACE;
340
			cdmClass = FieldObservation.class;
341
			idSet = typeSpecimenIdSet;
342
			Map<String, FieldObservation> typeSpecimenMap = (Map<String, FieldObservation>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
343
			result.put(nameSpace, typeSpecimenMap);
344

    
345
			
346
			//
347
//			//terms
348
//			nameSpace = AlgaTerraTypeImport.TERMS_NAMESPACE;
349
//			cdmClass = FieldObservation.class;
350
//			idSet = taxonIdSet;
351
//			Map<String, DefinedTermBase> termMap = (Map<String, DefinedTermBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
352
//			result.put(nameSpace, termMap);
353

    
354
		
355
			
356
			
357
		} catch (SQLException e) {
358
			throw new RuntimeException(e);
359
		}
360
		return result;
361
	}
362

    
363

    
364
	
365

    
366
	/* (non-Javadoc)
367
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
368
	 */
369
	@Override
370
	protected boolean doCheck(BerlinModelImportState state){
371
		IOValidator<BerlinModelImportState> validator = new AlgaTerraTypeImportValidator();
372
		return validator.validate(state);
373
	}
374
	
375
	/* (non-Javadoc)
376
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
377
	 */
378
	@Override
379
	protected String getTableName() {
380
		return dbTableName;
381
	}
382
	
383
	/* (non-Javadoc)
384
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
385
	 */
386
	@Override
387
	public String getPluralString() {
388
		return pluralString;
389
	}
390

    
391
	/* (non-Javadoc)
392
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
393
	 */
394
	protected boolean isIgnore(BerlinModelImportState state){
395
		return ! state.getConfig().isDoTypes();
396
	}
397
	
398
}
(5-5/5)