Project

General

Profile

« Previous | Next » 

Revision f2be28b3

Added by Andreas Müller over 11 years ago

latest globis

View differences:

app-import/src/main/java/eu/etaxonomy/cdm/io/globis/GlobisSpecTaxImport.java
13 13
import java.sql.SQLException;
14 14
import java.util.HashMap;
15 15
import java.util.HashSet;
16
import java.util.List;
16 17
import java.util.Map;
17 18
import java.util.Set;
18 19
import java.util.regex.Matcher;
19 20
import java.util.regex.Pattern;
20 21

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

  
25 25
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
26 26
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade.DerivedUnitType;
27 27
import eu.etaxonomy.cdm.common.CdmUtils;
28
import eu.etaxonomy.cdm.io.common.IImportConfigurator;
29 28
import eu.etaxonomy.cdm.io.common.IOValidator;
30 29
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
31 30
import eu.etaxonomy.cdm.io.common.mapping.IMappingImport;
32
import eu.etaxonomy.cdm.io.globis.validation.GlobisReferenceImportValidator;
33 31
import eu.etaxonomy.cdm.io.globis.validation.GlobisSpecTaxaImportValidator;
34 32
import eu.etaxonomy.cdm.model.common.CdmBase;
35
import eu.etaxonomy.cdm.model.common.Extension;
36 33
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
37 34
import eu.etaxonomy.cdm.model.common.Marker;
38 35
import eu.etaxonomy.cdm.model.common.MarkerType;
......
41 38
import eu.etaxonomy.cdm.model.name.Rank;
42 39
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
43 40
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
44
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationTest;
45 41
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
46 42
import eu.etaxonomy.cdm.model.name.ZoologicalName;
47 43
import eu.etaxonomy.cdm.model.occurrence.Collection;
48 44
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
49
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
50
import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
51 45
import eu.etaxonomy.cdm.model.occurrence.FieldObservation;
52 46
import eu.etaxonomy.cdm.model.occurrence.Specimen;
53 47
import eu.etaxonomy.cdm.model.reference.Reference;
54
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
55
import eu.etaxonomy.cdm.model.reference.ReferenceType;
56 48
import eu.etaxonomy.cdm.model.taxon.Synonym;
57 49
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
58 50
import eu.etaxonomy.cdm.model.taxon.Taxon;
......
150 142
					
151 143
					ZoologicalName name = null;
152 144
					if (isBlank(specSystaxRank) ){
153
						name = makeName(state, rs);
145
						name = makeName(state, rs, specTaxId);
154 146
					}else if (specSystaxRank.equals("synonym")){
155
						Synonym synonym = getSynonym(state, rs);
147
						Synonym synonym = getSynonym(state, rs, specTaxId);
156 148
						if (acceptedTaxon == null){
157 149
							if (acceptedTaxonId == null){
158 150
								logger.warn("Synonym has no accepted taxon defined. SpecTaxId: "+ specTaxId);
......
168 160
						thisTaxon = acceptedTaxon;
169 161
					}else{
170 162
						logger.warn(String.format("Unhandled specSystaxRank %s in specTaxId %d", specSystaxRank, specTaxId));
171
						name = makeName(state, rs);
163
						name = makeName(state, rs, specTaxId);
172 164
					}
173 165
					
174 166
					if (thisTaxon != null){
175 167
						name = CdmBase.deproxy(thisTaxon.getName(), ZoologicalName.class);
176
					}
177
					if (name == null){
178
						name = makeName(state, rs);
168
					}else{
169
						if (name == null){
170
							name = makeName(state, rs, specTaxId);
171
						}
172
						thisTaxon = Taxon.NewInstance(name, sourceRef);
173
						objectsToSave.add(thisTaxon);
179 174
					}
180 175
					
181 176
					handleNomRef(state, referenceMap, rs, name);
......
214 209
	
215 210

  
216 211
	private void handleTypeInformation(GlobisImportState state, ResultSet rs, ZoologicalName name, Integer specTaxId) throws SQLException {
217
		
218
		
219 212
		if (! hasTypeInformation(rs)){
220 213
			return;
221 214
		}
......
252 245
				specTypeDepositoryStr = makeAdditionalSpecimenInformation(
253 246
						specTypeDepositoryStr, specimen, specTaxId);
254 247
				
255
				Collection collection = makeCollection(specTypeDepositoryStr, specimen, specTaxId);
248
				Collection collection = makeCollection(state, specTypeDepositoryStr, specimen, specTaxId);
256 249
				String collectionCode = collection.getCode();
257 250
				if (isBlank(collectionCode)){
258 251
					collectionCode = collection.getName();
......
302 295

  
303 296

  
304 297
	/**
298
	 * @param state 
305 299
	 * @param specTypeDepositoryStr
306 300
	 * @param specimen
307 301
	 * @param specTaxId 
308 302
	 */
309
	protected Collection makeCollection(String specTypeDepositoryStr, Specimen specimen, Integer specTaxId) {
310
		//TODO deduplicate
311
		Map<String, Collection> collectionMap = new HashMap<String, Collection>();
303
	protected Collection makeCollection(GlobisImportState state, String specTypeDepositoryStr, Specimen specimen, Integer specTaxId) {
312 304
		
313 305
		//Collection
314 306
		specTypeDepositoryStr = specTypeDepositoryStr.replace("Washington, D.C.", "Washington@ D.C.");
315 307
		
316 308
		Collection collection;
317 309
		if (specTypeDepositoryStr.equals("BMNH, London and/or MNHN, Paris")){
318
			//TODO deduplicate
319
			collection = Collection.NewInstance();
320
			collection.setName(specTypeDepositoryStr);
310
			collection = state.getRelatedObject(COLLECTION_NAMESPACE, specTypeDepositoryStr, Collection.class);
311
			if (collection == null){
312
				collection = Collection.NewInstance();
313
				collection.setName(specTypeDepositoryStr);
314
				collection.setTownOrLocation("London or Paris");
315
				state.addRelatedObject(COLLECTION_NAMESPACE, collection.getName(), collection);
316
			}
321 317
			specimen.setCollection(collection);
322 318
		}else if (specTypeDepositoryStr.equals("coll. L. V. Kaabak, A .V. Sotshivko & V. V. Titov, Moscow")){
323
			collection = Collection.NewInstance();
324
			collection.setName("coll. L. V. Kaabak, A .V. Sotshivko & V. V. Titov");
325
			collection.setTownOrLocation("Moscow");
319
			String colName = "coll. L. V. Kaabak, A .V. Sotshivko & V. V. Titov";
320
			collection = state.getRelatedObject(COLLECTION_NAMESPACE, colName, Collection.class);
321
			if (collection == null){
322
				collection = Collection.NewInstance();
323
				collection.setName(colName);
324
				collection.setTownOrLocation("Moscow");
325
				state.addRelatedObject(COLLECTION_NAMESPACE, collection.getName(), collection);
326
			}
326 327
			specimen.setCollection(collection);
327 328
		}else if (specTypeDepositoryStr.matches("coll. R. E. Parrott?, Port Hope, Ontario")){
328
			//TODO deduplicate
329
			collection = Collection.NewInstance();
330
			collection.setName("coll. R. E. Parrott");
331
			collection.setTownOrLocation("Port Hope, Ontario");
329
			String colName = "coll. R. E. Parrott";
330
			collection = state.getRelatedObject(COLLECTION_NAMESPACE, colName, Collection.class);
331
			if (collection == null){
332
				collection = Collection.NewInstance();
333
				collection.setName(colName);
334
				collection.setTownOrLocation("Port Hope, Ontario");
335
				state.addRelatedObject(COLLECTION_NAMESPACE, collection.getName(), collection);
336
			}
332 337
			specimen.setCollection(collection);
333 338
		}else{
334 339
			
335 340
			String[] split = specTypeDepositoryStr.split(",");
336 341
			if (split.length != 2){
337 342
				if (split.length == 1 && split[0].startsWith("coll.")){
338
					collection = Collection.NewInstance();
339
					collection.setName(split[0]);
343
					collection = state.getRelatedObject(COLLECTION_NAMESPACE, split[0], Collection.class);
344
					if (collection == null){
345
						collection = Collection.NewInstance();
346
						collection.setName(split[0]);
347
						state.addRelatedObject(COLLECTION_NAMESPACE, collection.getName(), collection);
348
					}
340 349
					specimen.setCollection(collection);
341 350
				}else{
342 351
					logger.warn("Split size is not 2: " + specTypeDepositoryStr + " (specTaxID:" + specTaxId + ")");
343 352
					collection = Collection.NewInstance();
344 353
					collection.setCode("??");
354
					//TODO deduplicate ??
345 355
				}
346 356
				
347 357
			}else{
348 358
				String collectionStr = split[0];
349 359
				String location = split[1].replace("Washington@ D.C.", "Washington, D.C.");
350 360
				
351
				collection = collectionMap.get(collectionStr);
361
				collection = state.getRelatedObject(COLLECTION_NAMESPACE, collectionStr, Collection.class);
352 362
				if (collection == null){
353 363
					collection = Collection.NewInstance();
354 364
					collection.setCode(collectionStr);
355 365
					collection.setTownOrLocation(split[1]);
356
				}else if (CdmUtils.nullSafeEqual(location, collection.getTownOrLocation())){
366
					state.addRelatedObject(COLLECTION_NAMESPACE, collection.getCode(), collection);
367
						
368
				}else if (! CdmUtils.nullSafeEqual(location, collection.getTownOrLocation())){
357 369
					String message = "Location (%s) is not equal to location (%s) of existing collection";
358 370
					logger.warn(String.format(message, location, collection.getTownOrLocation(), collection.getCode()));
359 371
				}
......
540 552

  
541 553

  
542 554

  
543
	private Synonym getSynonym(GlobisImportState state, ResultSet rs) throws SQLException {
544
		ZoologicalName name = makeName(state, rs);
555
	private Synonym getSynonym(GlobisImportState state, ResultSet rs, Integer specTaxId) throws SQLException {
556
		ZoologicalName name = makeName(state, rs, specTaxId);
545 557
				
546 558
		Synonym synonym = Synonym.NewInstance(name, state.getTransactionalSourceReference());
547 559
		
......
554 566
	/**
555 567
	 * @param state
556 568
	 * @param rs
569
	 * @param specTaxId 
557 570
	 * @return
558 571
	 * @throws SQLException
559 572
	 */
560
	protected ZoologicalName makeName(GlobisImportState state, ResultSet rs)
573
	protected ZoologicalName makeName(GlobisImportState state, ResultSet rs, Integer specTaxId)
561 574
			throws SQLException {
562 575
		//rank
563 576
		String rankStr = rs.getString("SpecRank");
......
580 593
		String yearStr = rs.getString("SpecYear");
581 594
		String authorAndYearStr = CdmUtils.concat(", ", authorStr, yearStr);
582 595
		handleAuthorAndYear(authorAndYearStr, name);
596
		
597
		name.addSource(String.valueOf(specTaxId), SPEC_TAX_NAMESPACE, state.getTransactionalSourceReference(), null);
583 598
		return name;
584 599
	}
585 600

  
......
611 626
	}
612 627

  
613 628

  
614

  
615

  
616
	private boolean isInfraSpecies(GlobisImportState state, ResultSet rs, Rank rank) {
617
		// TODO Auto-generated method stub
618
		return false;
619
	}
620

  
621

  
622

  
623

  
624
	private Reference<?> getJournal(GlobisImportState state, ResultSet rs, String refJournal) throws SQLException {
625
		
626
		
627
		Reference<?> journal = ReferenceFactory.newJournal();
628
		String issn = rs.getString("RefISSN");
629
		if (StringUtils.isNotBlank(issn)){
630
			issn.replaceAll("ISSN", "").trim();
631
			journal.setIssn(issn);			
632
		}
633

  
634
		
635
		
636
		//TODO deduplicate
637
		journal.setTitle(refJournal);
638
		return journal;
639
	}
640

  
641

  
642

  
643

  
644
	/* (non-Javadoc)
645
	 * @see eu.etaxonomy.cdm.io.common.mapping.IMappingImport#createObject(java.sql.ResultSet, eu.etaxonomy.cdm.io.common.ImportStateBase)
646
	 */
647
	public Reference<?> createObject(ResultSet rs, GlobisImportState state)
648
			throws SQLException {
649
		Reference<?> ref;
650
		String refType = rs.getString("RefType");
651
		if (refType == null){
652
			ref = ReferenceFactory.newGeneric();
653
		}else if (refType == "book"){
654
			ref = ReferenceFactory.newBook();
655
		}else if (refType == "paper in journal"){
656
			ref = ReferenceFactory.newArticle();
657
		}else if (refType.startsWith("unpublished") ){
658
			ref = ReferenceFactory.newGeneric();
659
		}else if (refType.endsWith("paper in journal")){
660
			ref = ReferenceFactory.newArticle();
661
		}else if (refType == "paper in book"){
662
			ref = ReferenceFactory.newBookSection();
663
		}else if (refType == "paper in journalwebsite"){
664
			ref = ReferenceFactory.newArticle();
665
		}else{
666
			logger.warn("Unknown reference type: " + refType);
667
			ref = ReferenceFactory.newGeneric();
668
		}
669
		return ref;
670
	}
671

  
672 629
	/* (non-Javadoc)
673 630
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
674 631
	 */
......
700 657
			Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
701 658
			result.put(nameSpace, referenceMap);
702 659
			
660
			//collection map
661
			nameSpace = COLLECTION_NAMESPACE;
662
			List<Collection> listCollection = getCollectionService().list(Collection.class, null, null, null, null);
663
			Map<String, Collection> collectionMap = new HashMap<String, Collection>();
664
			for (Collection collection : listCollection){
665
				collectionMap.put(collection.getCode(), collection);
666
				if (isBlank(collection.getCode())){
667
					logger.warn("Collection code is blank: " + collection);
668
				}
669
			}
670
			result.put(nameSpace, collectionMap);
703 671
			
704 672
		} catch (SQLException e) {
705 673
			throw new RuntimeException(e);
......
727 695

  
728 696

  
729 697

  
698
	@Override
699
	public Reference createObject(ResultSet rs, GlobisImportState state)
700
			throws SQLException {
701
		// not needed
702
		return null;
703
	}
704

  
705

  
706

  
707

  
730 708

  
731 709
}

Also available in: Unified diff