Project

General

Profile

Download (22.5 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.sql.Timestamp;
15
import java.util.HashMap;
16
import java.util.HashSet;
17
import java.util.Map;
18
import java.util.Set;
19
import java.util.UUID;
20

    
21
import org.apache.commons.lang.StringUtils;
22
import org.apache.log4j.Logger;
23
import org.joda.time.DateTime;
24
import org.springframework.stereotype.Component;
25

    
26
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
27
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
28
import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraTypeImportValidator;
29
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase;
30
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
31
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
32
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelRefDetailImport;
33
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelReferenceImport;
34
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelTaxonNameImport;
35
import eu.etaxonomy.cdm.io.common.IImportConfigurator.EDITOR;
36
import eu.etaxonomy.cdm.io.common.IOValidator;
37
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
38
import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
39
import eu.etaxonomy.cdm.model.common.Annotation;
40
import eu.etaxonomy.cdm.model.common.AnnotationType;
41
import eu.etaxonomy.cdm.model.common.CdmBase;
42
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
43
import eu.etaxonomy.cdm.model.common.Language;
44
import eu.etaxonomy.cdm.model.common.User;
45
import eu.etaxonomy.cdm.model.name.Rank;
46
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
47
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
48
import eu.etaxonomy.cdm.model.name.TaxonName;
49
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
50
import eu.etaxonomy.cdm.model.occurrence.Collection;
51
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
52
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
53
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
54
import eu.etaxonomy.cdm.model.reference.Reference;
55
import eu.etaxonomy.cdm.model.term.DefinedTerm;
56

    
57
/**
58
 * @author a.mueller
59
 * @since 20.03.2008
60
 */
61
@Component
62
public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
63

    
64
    private static final long serialVersionUID = 32400936433601479L;
65
    private static final Logger logger = Logger.getLogger(AlgaTerraTypeImport.class);
66

    
67

    
68
	private static int modCount = 5000;
69
	private static final String pluralString = "types";
70
	private static final String dbTableName = "TypeDesignation";  //??
71

    
72
	@Override
73
    protected String getLocalityString(){
74
		return "TypeLocality";
75
	}
76

    
77
	public AlgaTerraTypeImport(){
78
		super(dbTableName, pluralString);
79
	}
80

    
81

    
82
	@Override
83
	protected String getIdQuery(BerlinModelImportState state) {
84
		String result = " SELECT TypeDesignationId "
85
				+ " FROM TypeDesignation "
86
				+ " ORDER BY NameFk ";
87
		return result;
88
	}
89

    
90
	@Override
91
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
92
			String strQuery =
93

    
94
			" SELECT ts.*, ts.TypeSpecimenId as unitId, td.*, gz.ID as GazetteerId,  gz.L1Code, gz.L2Code, gz.L3Code, gz.L4Code, gz.ISOCountry, gz.Country, gz.subL4, ts.WaterBody, " +
95
               " ts.RefFk as tsRefFk, ts.RefDetailFk as tsRefDetailFk, ts.MaterialCategoryFK as tsMaterialCategoryFK, td.RefFk as tdRefFk, td.RefDetailFk as tdRefDetailFk, " +
96
               " RefDet.Details as tdRefDetails, " +
97
               " td.created_When as tdCreated_When, tsd.created_When as tsdCreated_When, td.updated_when as tdUpdated_when, " +
98
               " td.created_who as tdCreated_who, tsd.created_who as tsdCreated_who, td.updated_who tdUpdated_who,  " +
99
               " mc.* " +
100
            " FROM TypeSpecimenDesignation tsd  "
101
            	+ " LEFT OUTER JOIN TypeSpecimen AS ts ON tsd.TypeSpecimenFk = ts.TypeSpecimenId "
102
            	+ " FULL OUTER JOIN TypeDesignation td ON  td.TypeDesignationId = tsd.TypeDesignationFk "
103
            	+ " LEFT OUTER JOIN TDWGGazetteer gz ON ts.TDWGGazetteerFk = gz.ID "
104
            	+ " LEFT OUTER JOIN RefDetail refDet ON td.RefDetailFk = refDet.RefDetailId AND td.RefFk = refDet.RefFk "
105
            	+ " LEFT OUTER JOIN MaterialCategory mc ON mc.MaterialCategoryId = ts.MaterialCategoryFK "
106
		+ 	" WHERE (td.TypeDesignationId IN (" + ID_LIST_TOKEN + ")  )"
107
          + " ORDER BY NameFk "
108
            ;
109
		return strQuery;
110
	}
111

    
112
	@Override
113
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState bmState) {
114
		boolean success = true;
115

    
116
		AlgaTerraImportState state = (AlgaTerraImportState)bmState;
117

    
118
		//TODO check that no duplicate vocabularies will be created, also remove redundant code here
119
//		and in Specimen importer
120
		try {
121
			makeVocabulariesAndFeatures(state);
122
		} catch (SQLException e1) {
123
			logger.warn("Exception occurred when trying to create Type specimen vocabularies: " + e1.getMessage());
124
			e1.printStackTrace();
125
		}
126

    
127

    
128

    
129
		Set<TaxonName> namesToSave = new HashSet<>();
130

    
131
		Map<String, TaxonName> taxonNameMap = partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
132
		Map<String, DerivedUnit> ecoFactMap = partitioner.getObjectMap(AlgaTerraEcoFactImport.ECO_FACT_FIELD_OBSERVATION_NAMESPACE);
133
		Map<String, DerivedUnit> typeSpecimenMap = partitioner.getObjectMap(TYPE_SPECIMEN_FIELD_OBSERVATION_NAMESPACE);
134
		Map<String, Reference> refMap = partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
135
		Map<String, Reference> refDetailMap = partitioner.getObjectMap(BerlinModelRefDetailImport.REFDETAIL_NAMESPACE);
136

    
137

    
138
		ResultSet rs = partitioner.getResultSet();
139

    
140
		try {
141

    
142
			int i = 0;
143

    
144
			//for each reference
145
            while (rs.next()){
146

    
147
        		if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("Type designations handled: " + (i-1));}
148

    
149
				int nameId = rs.getInt("nameFk");
150
				int typeSpecimenId = rs.getInt("TypeSpecimenId");
151
				int typeDesignationId = rs.getInt("TypeDesignationId");
152
				Integer typeStatusFk =  nullSafeInt(rs, "typeStatusFk");
153
				Integer ecoFactId = nullSafeInt(rs, "ecoFactFk");
154
				Integer tdRefFk = nullSafeInt(rs, "tdRefFk");
155
				Integer tdRefDetailFk = nullSafeInt(rs, "tdRefDetailFk");
156
				String tdRefDetails = rs.getString("tdRefDetails");
157
				Boolean restrictedFlag = nullSafeBoolean(rs, "RestrictedFlag");
158

    
159
				String typeSpecimenPhrase = rs.getString("TypeSpecimenPhrase");
160
				Integer tsMaterialCategoryFK = nullSafeInt(rs, "MaterialCategoryFK");
161

    
162
				boolean isIcon = typeSpecimenPhrase != null && typeSpecimenPhrase.toLowerCase().startsWith("\u005bicon");
163

    
164
				try {
165

    
166
					//source ref
167
					Reference sourceRef = state.getTransactionalSourceReference();
168

    
169
					//facade
170
					SpecimenOrObservationType type = SpecimenOrObservationType.PreservedSpecimen;
171
					if (isIcon){
172
						//TODO handle images correctly for these specimen
173
						type = SpecimenOrObservationType.StillImage;
174
					}else if (typeStatusFk != null && typeStatusFk.equals(39)){
175
						type =  SpecimenOrObservationType.LivingSpecimen;
176
					}else if (tsMaterialCategoryFK != null && tsMaterialCategoryFK.equals(4)){
177
						type = SpecimenOrObservationType.Fossil;
178
					}
179

    
180

    
181
					if (tsMaterialCategoryFK != null && typeStatusFk != null &&
182
							( typeStatusFk.equals(39) && !tsMaterialCategoryFK.equals(14) || ! typeStatusFk.equals(39) && tsMaterialCategoryFK.equals(14) )){
183
						logger.warn("Living Specimen type status should be 39 and materialCategoryFk 14 but one of them wasn't");
184
					}
185

    
186

    
187
					DerivedUnitFacade facade = getDerivedUnit(state, typeSpecimenId, typeSpecimenMap, type, ecoFactMap, ecoFactId, sourceRef);
188

    
189
					//field observation
190
					handleFieldObservationSpecimen(rs, facade, state, partitioner);
191

    
192
//					handleTypeSpecimenSpecificFieldObservation(rs,facade, state);
193

    
194
					//TODO divide like in EcoFact (if necessary)
195
					handleTypeSpecimenSpecificSpecimen(rs,facade, state, refMap, typeSpecimenId);
196

    
197
					handleFirstDerivedSpecimen(rs, facade, state, partitioner);
198

    
199

    
200
					//Designation
201
					TaxonName name = getTaxonName(state, taxonNameMap, nameId);
202
					SpecimenTypeDesignation designation = SpecimenTypeDesignation.NewInstance();
203
					SpecimenTypeDesignationStatus status = getSpecimenTypeDesignationStatusByKey(typeStatusFk);
204
					if (typeStatusFk != null && typeStatusFk.equals(39)){
205
						designation.addAnnotation(Annotation.NewInstance("Type status: Authentic strain", AnnotationType.EDITORIAL(), Language.DEFAULT()));
206
					}
207

    
208
					designation.setTypeSpecimen(facade.innerDerivedUnit());
209
					designation.setTypeStatus(status);
210
					if (tdRefFk != null){
211
						Reference typeDesigRef = getReferenceFromMaps(refDetailMap, refMap, String.valueOf(tdRefDetailFk), String.valueOf(tdRefFk));
212
						if (typeDesigRef == null){
213
							logger.warn("Type designation reference not found in maps: " + tdRefFk);
214
						}else{
215
							designation.setCitation(typeDesigRef);
216
						}
217
					}
218
					if (isNotBlank(tdRefDetails)){
219
						designation.setCitationMicroReference(tdRefDetails);
220
					}
221

    
222
					//ID: Type designations do not allow OriginalSources
223
					designation.addAnnotation(Annotation.NewInstance("Id in BerlinModel-TypeDesignation: " + String.valueOf(typeDesignationId), AnnotationType.TECHNICAL(), Language.UNDETERMINED()));
224

    
225
					if (restrictedFlag != null &&restrictedFlag.equals(true)){
226
						logger.warn("Restricted Flag is expected to be null or 0. TypeDesignationId" + typeDesignationId);
227
					}
228

    
229
					//Created, Updated
230
					this.doCreatedUpdated(state, designation, rs);
231

    
232
					if (name != null){
233
						name.addTypeDesignation(designation, true); //TODO check if true is correct
234
					}else{
235
						logger.warn("Name could not be found for type designation " + typeDesignationId);
236
					}
237
					namesToSave.add(name);
238

    
239

    
240
				} catch (Exception e) {
241
					logger.warn("Exception in TypeDesignation: TypeDesignationId " + typeDesignationId + ". " + e.getMessage());
242
					e.printStackTrace();
243
				}
244

    
245
            }
246

    
247
//            logger.warn("Specimen: " + countSpecimen + ", Descriptions: " + countDescriptions );
248

    
249
			logger.warn("Names to save: " + namesToSave.size());
250
			getNameService().save(namesToSave);
251

    
252
			return success;
253
		} catch (SQLException e) {
254
			logger.error("SQLException:" +  e);
255
			return false;
256
		}
257
	}
258

    
259
	/**
260
	 * same as {@link BerlinModelImportBase#doCreatedUpdatedNotes}, but handles multiple similar fields
261
	 * @throws SQLException
262
	 */
263
	private void doCreatedUpdated(BerlinModelImportState state, AnnotatableEntity annotatableEntity, ResultSet rs) throws SQLException{
264
		BerlinModelImportConfigurator config = state.getConfig();
265
		Object createdWhen = rs.getObject("tsdCreated_When");
266
		Object tdCreatedWhen = rs.getObject("tdCreated_When");
267
		if (tdCreatedWhen != null){
268
			createdWhen = tdCreatedWhen;
269
		}
270

    
271
		String createdWho = rs.getString("tsdCreated_Who");
272
		String tdCreatedWho = rs.getString("tdCreated_Who");
273
		if (tdCreatedWho != null){
274
			createdWho = tdCreatedWho;
275
		}
276

    
277
		Object updatedWhen = rs.getObject("tdUpdated_When");
278
		String updatedWho = rs.getString("tdUpdated_who");
279

    
280
		//Created When, Who, Updated When Who
281
		if (config.getEditor() == null || config.getEditor().equals(EDITOR.NO_EDITORS)){
282
			//do nothing
283
		}else if (config.getEditor().equals(EDITOR.EDITOR_AS_ANNOTATION)){
284
			String createdAnnotationString = "Berlin Model record was created By: " + String.valueOf(createdWho) + " (" + String.valueOf(createdWhen) + ") ";
285
			if (updatedWhen != null && updatedWho != null){
286
				createdAnnotationString += " and updated By: " + String.valueOf(updatedWho) + " (" + String.valueOf(updatedWhen) + ")";
287
			}
288
			Annotation annotation = Annotation.NewInstance(createdAnnotationString, Language.DEFAULT());
289
			annotation.setCommentator(config.getCommentator());
290
			annotation.setAnnotationType(AnnotationType.TECHNICAL());
291
			annotatableEntity.addAnnotation(annotation);
292
		}else if (config.getEditor().equals(EDITOR.EDITOR_AS_EDITOR)){
293
			User creator = getUser(state, createdWho);
294
			User updator = getUser(state, updatedWho);
295
			DateTime created = getDateTime(createdWhen);
296
			DateTime updated = getDateTime(updatedWhen);
297
			annotatableEntity.setCreatedBy(creator);
298
			annotatableEntity.setUpdatedBy(updator);
299
			annotatableEntity.setCreated(created);
300
			annotatableEntity.setUpdated(updated);
301
		}else {
302
			logger.warn("Editor type not yet implemented: " + config.getEditor());
303
		}
304
	}
305

    
306

    
307
	private DateTime getDateTime(Object timeString){
308
		if (timeString == null){
309
			return null;
310
		}
311
		DateTime dateTime = null;
312
		if (timeString instanceof Timestamp){
313
			Timestamp timestamp = (Timestamp)timeString;
314
			dateTime = new DateTime(timestamp);
315
		}else{
316
			logger.warn("time ("+timeString+") is not a timestamp. Datetime set to current date. ");
317
			dateTime = new DateTime();
318
		}
319
		return dateTime;
320
	}
321

    
322

    
323
	@Override
324
    protected String getDerivedUnitNameSpace(){
325
		return TYPE_SPECIMEN_DERIVED_UNIT_NAMESPACE;
326
	}
327

    
328
	@Override
329
    protected String getFieldObservationNameSpace(){
330
		return TYPE_SPECIMEN_FIELD_OBSERVATION_NAMESPACE;
331
	}
332

    
333
	/**
334
	 * @param state
335
	 * @param taxonNameMap
336
	 * @param nameId
337
	 * @return
338
	 */
339
	private TaxonName getTaxonName(AlgaTerraImportState state, Map<String, TaxonName> taxonNameMap, int nameId) {
340
		TaxonName result;
341
		if (state.getConfig().isDoTaxonNames()){
342
			result = taxonNameMap.get(String.valueOf(nameId));
343
		}else{
344
			//for testing
345
			result = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
346
		}
347
		return result;
348
	}
349

    
350
	private void handleTypeSpecimenSpecificSpecimen(ResultSet rs, DerivedUnitFacade facade, AlgaTerraImportState state, Map<String, Reference> refMap, int typeSpecimenId) throws SQLException {
351

    
352

    
353
		//TODO
354

    
355

    
356

    
357
		DerivedUnit derivedUnit = facade.innerDerivedUnit();
358

    
359
		Integer tsMaterialCategoryFK = nullSafeInt(rs, "tsMaterialCategoryFK");
360
		String matCat = rs.getString("MaterialCategory");
361
		if (tsMaterialCategoryFK != null){
362
			if (tsMaterialCategoryFK.equals(16)){
363
				tsMaterialCategoryFK = 9;
364
			}
365
			UUID uuid = materialCategoryMapping.get(tsMaterialCategoryFK);
366
			if (uuid == null){
367
				logger.warn("Uuid was null. This should not happen.");
368
			}
369
			DefinedTerm kindOfUnit = getKindOfUnit(state, uuid, matCat, null, null, null);  //all terms should exist already
370
			facade.setFieldUnitKindOfUnit(kindOfUnit);
371
		}else{
372
			logger.warn("Material Category was null. This is not expected");
373
		}
374

    
375

    
376
		//collection
377
		String barcode = rs.getString("Barcode");
378
		if (StringUtils.isNotBlank(barcode)){
379
			facade.setBarcode(barcode);
380
		}
381

    
382
		//RefFk + RefDetailFk
383
		Integer  refFk = nullSafeInt(rs, "tsRefFk");
384
		if (refFk != null){
385

    
386
			Reference ref = refMap.get(String.valueOf(refFk));
387
			if (ref == null){
388
				logger.warn("TypeSpecimen reference (" + refFk + ")not found in biblioRef. TypeSpecimenId: " + typeSpecimenId);
389
			}else{
390
				IdentifiableSource source = IdentifiableSource.NewPrimarySourceInstance(ref, null);
391
				derivedUnit.addSource(source);
392
			}
393
		}
394

    
395
		Integer refDetailFk = nullSafeInt(rs, "tsRefDetailFk");
396
		if (refDetailFk != null){
397
			logger.warn("TypeSpecimen.RefDetailFk should always be NULL but wasn't: " + typeSpecimenId);
398
		}
399

    
400
	}
401

    
402
	/**
403
	 * @param state
404
	 * @param ecoFactId
405
	 * @param derivedUnitMap
406
	 * @param type
407
	 * @param ecoFactId2
408
	 * @param ecoFactMap
409
	 * @param sourceRef
410
	 * @return
411
	 */
412
	private DerivedUnitFacade getDerivedUnit(AlgaTerraImportState state, int typeSpecimenId, Map<String, DerivedUnit> typeSpecimenMap, SpecimenOrObservationType type, Map<String, DerivedUnit> ecoFactMap, Integer ecoFactId2, Reference sourceRef) {
413
		//TODO implement ecoFact map - if not all null anymore
414
		String typeKey = String.valueOf(typeSpecimenId);
415
		DerivedUnit derivedUnit = typeSpecimenMap.get(typeKey);
416
		DerivedUnitFacade facade;
417
		if (derivedUnit == null){
418
			facade = DerivedUnitFacade.NewInstance(type);
419
			typeSpecimenMap.put(typeKey, derivedUnit);
420
		}else{
421
			try {
422
				facade = DerivedUnitFacade.NewInstance(derivedUnit);
423
				facade.addSource(IdentifiableSource.NewDataImportInstance(typeKey, "TypeSpecimen", sourceRef));
424
			} catch (DerivedUnitFacadeNotSupportedException e) {
425
				logger.error(e.getMessage());
426
				facade = DerivedUnitFacade.NewInstance(type);
427
			}
428
		}
429

    
430
		return facade;
431
	}
432

    
433

    
434
	private SpecimenTypeDesignationStatus getSpecimenTypeDesignationStatusByKey(Integer typeStatusFk) {
435
		if (typeStatusFk == null){ return SpecimenTypeDesignationStatus.TYPE();
436
		}else if (typeStatusFk == 1) { return SpecimenTypeDesignationStatus.HOLOTYPE();
437
		}else if (typeStatusFk == 2) { return SpecimenTypeDesignationStatus.LECTOTYPE();
438
		}else if (typeStatusFk == 3) { return SpecimenTypeDesignationStatus.NEOTYPE();
439
		}else if (typeStatusFk == 4) { return SpecimenTypeDesignationStatus.EPITYPE();
440
		}else if (typeStatusFk == 5) { return SpecimenTypeDesignationStatus.ISOLECTOTYPE();
441
		}else if (typeStatusFk == 6) { return SpecimenTypeDesignationStatus.ISONEOTYPE();
442
		}else if (typeStatusFk == 7) { return SpecimenTypeDesignationStatus.ISOTYPE();
443
		}else if (typeStatusFk == 8) { return SpecimenTypeDesignationStatus.PARANEOTYPE();
444
		}else if (typeStatusFk == 9) { return SpecimenTypeDesignationStatus.PARATYPE();
445
		}else if (typeStatusFk == 10) { return SpecimenTypeDesignationStatus.SECOND_STEP_LECTOTYPE();
446
		}else if (typeStatusFk == 11) { return SpecimenTypeDesignationStatus.SECOND_STEP_NEOTYPE();
447
		}else if (typeStatusFk == 12) { return SpecimenTypeDesignationStatus.SYNTYPE();
448
		}else if (typeStatusFk == 13) { return SpecimenTypeDesignationStatus.PARALECTOTYPE();
449
		}else if (typeStatusFk == 14) { return SpecimenTypeDesignationStatus.ISOEPITYPE();
450
		}else if (typeStatusFk == 21) { return SpecimenTypeDesignationStatus.ICONOTYPE();
451
		}else if (typeStatusFk == 22) { return SpecimenTypeDesignationStatus.PHOTOTYPE();
452
		}else if (typeStatusFk == 30) { return SpecimenTypeDesignationStatus.TYPE();
453
		}else if (typeStatusFk == 38) { return SpecimenTypeDesignationStatus.ISOEPITYPE();
454
		}else if (typeStatusFk == 39) { return SpecimenTypeDesignationStatus.ORIGINAL_MATERIAL();  //but add annotation
455
		}else if (typeStatusFk == 40) { return SpecimenTypeDesignationStatus.ORIGINAL_MATERIAL();
456
		}else{
457
			logger.warn("typeStatusFk undefined for " +  typeStatusFk);
458
			return SpecimenTypeDesignationStatus.TYPE();
459
		}
460

    
461
	}
462

    
463

    
464
	@Override
465
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
466
		String nameSpace;
467
		Class<?> cdmClass;
468
		Set<String> idSet;
469
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
470

    
471
		try{
472
			Set<String> nameIdSet = new HashSet<String>();
473
			Set<String> ecoFieldObservationIdSet = new HashSet<String>();
474
			Set<String> typeSpecimenIdSet = new HashSet<String>();
475
//			Set<String> termsIdSet = new HashSet<String>();
476
			Set<String> collectionIdSet = new HashSet<String>();
477
			Set<String> referenceIdSet = new HashSet<String>();
478
			Set<String> refDetailIdSet = new HashSet<String>();
479

    
480
			while (rs.next()){
481
				handleForeignKey(rs, nameIdSet, "nameFk");
482
				handleForeignKey(rs, ecoFieldObservationIdSet, "ecoFactFk");
483
				handleForeignKey(rs, typeSpecimenIdSet, "TypeSpecimenId");
484
				handleForeignKey(rs, collectionIdSet, "CollectionFk");
485
				handleForeignKey(rs, referenceIdSet, "tsRefFk");
486
				handleForeignKey(rs, referenceIdSet, "tdRefFk");
487
				handleForeignKey(rs, refDetailIdSet, "tdRefDetailFk");
488
			}
489

    
490
			//name map
491
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
492
			cdmClass = TaxonName.class;
493
			idSet = nameIdSet;
494
			Map<String, TaxonName> objectMap = (Map<String, TaxonName>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
495
			result.put(nameSpace, objectMap);
496

    
497
			//eco fact field observation map
498
			nameSpace = AlgaTerraTypeImport.ECO_FACT_FIELD_OBSERVATION_NAMESPACE;
499
			cdmClass = FieldUnit.class;
500
			idSet = ecoFieldObservationIdSet;
501
			Map<String, FieldUnit> fieldObservationMap = (Map<String, FieldUnit>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
502
			result.put(nameSpace, fieldObservationMap);
503

    
504
			//type specimen map
505
			nameSpace = AlgaTerraTypeImport.TYPE_SPECIMEN_FIELD_OBSERVATION_NAMESPACE;
506
			cdmClass = FieldUnit.class;
507
			idSet = typeSpecimenIdSet;
508
			Map<String, FieldUnit> typeSpecimenMap = (Map<String, FieldUnit>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
509
			result.put(nameSpace, typeSpecimenMap);
510

    
511

    
512
			//collections
513
			nameSpace = AlgaTerraCollectionImport.NAMESPACE_COLLECTION;
514
			cdmClass = Collection.class;
515
			idSet = collectionIdSet;
516
			Map<String, Collection> collectionMap = (Map<String, Collection>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
517
			result.put(nameSpace, collectionMap);
518

    
519
			//sub-collections
520
			nameSpace = AlgaTerraCollectionImport.NAMESPACE_SUBCOLLECTION;
521
			cdmClass = Collection.class;
522
			idSet = collectionIdSet;
523
			Map<String, Collection> subCollectionMap = (Map<String, Collection>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
524
			result.put(nameSpace, subCollectionMap);
525

    
526
			//reference map
527
			nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;
528
			cdmClass = Reference.class;
529
			idSet = referenceIdSet;
530
			Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
531
			result.put(nameSpace, referenceMap);
532

    
533
			//refDetail map
534
			nameSpace = BerlinModelRefDetailImport.REFDETAIL_NAMESPACE;
535
			cdmClass = Reference.class;
536
			idSet = refDetailIdSet;
537
			Map<String, Reference> refDetailMap= (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
538
			result.put(nameSpace, refDetailMap);
539

    
540

    
541

    
542
		} catch (SQLException e) {
543
			throw new RuntimeException(e);
544
		}
545
		return result;
546
	}
547

    
548
	/* (non-Javadoc)
549
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
550
	 */
551
	@Override
552
	protected boolean doCheck(BerlinModelImportState state){
553
		IOValidator<BerlinModelImportState> validator = new AlgaTerraTypeImportValidator();
554
		return validator.validate(state);
555
	}
556

    
557

    
558
	/* (non-Javadoc)
559
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
560
	 */
561
	@Override
562
    protected boolean isIgnore(BerlinModelImportState state){
563
		return ! state.getConfig().isDoTypes();
564
	}
565

    
566
}
(14-14/15)