Project

General

Profile

Download (20 KB) Statistics
| Branch: | Tag: | 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.berlinModel.in;
11

    
12
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_HETEROTYPIC_SYNONYM_OF;
13
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_HOMOTYPIC_SYNONYM_OF;
14
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_INCLUDED_IN;
15
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_MISAPPLIED_NAME_OF;
16
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF;
17
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF;
18
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_PARTIAL_SYN_OF;
19
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF;
20
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF;
21
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_PROPARTE_SYN_OF;
22
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.TAX_REL_IS_SYNONYM_OF;
23

    
24
import java.sql.ResultSet;
25
import java.sql.SQLException;
26
import java.util.HashMap;
27
import java.util.HashSet;
28
import java.util.Map;
29
import java.util.Set;
30
import java.util.UUID;
31

    
32
import org.apache.log4j.Logger;
33
import org.springframework.stereotype.Component;
34

    
35
import eu.etaxonomy.cdm.common.CdmUtils;
36
import eu.etaxonomy.cdm.common.ResultWrapper;
37
import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
38
import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelTaxonRelationImportValidator;
39
import eu.etaxonomy.cdm.io.common.IOValidator;
40
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
41
import eu.etaxonomy.cdm.io.common.Source;
42
import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
43
import eu.etaxonomy.cdm.model.common.CdmBase;
44
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
45
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
46
import eu.etaxonomy.cdm.model.taxon.Synonym;
47
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
48
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
49
import eu.etaxonomy.cdm.model.taxon.Taxon;
50
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
51
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
52
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
53
import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
54
import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
55

    
56
/**
57
 * @author a.mueller
58
 * @created 20.03.2008
59
 * @version 1.0
60
 */
61
@Component
62
public class BerlinModelTaxonRelationImport  extends BerlinModelImportBase  {
63
	private static final Logger logger = Logger.getLogger(BerlinModelTaxonRelationImport.class);
64

    
65
	public static final String TREE_NAMESPACE = "PTRefFk";
66
	
67
	private static int modCount = 30000;
68
	private static final String pluralString = "taxon relations";
69
	private static final String dbTableName = "RelPTaxon";
70

    
71
	
72
	public BerlinModelTaxonRelationImport(){
73
		super();
74
	}
75

    
76
	/**
77
	 * Creates a taxonomic tree for each PTaxon reference which belongs to a taxon that is included at least in one
78
	 * <i>taxonomically included</i> relationship
79
	 * @param state
80
	 * @return
81
	 * @throws SQLException
82
	 */
83
	private boolean makeTaxonomicTrees(BerlinModelImportState state) throws SQLException{
84
		logger.info("start make taxonomic tree ...");
85
		Source source = state.getConfig().getSource();
86

    
87
		Set<String> idSet = getTreeReferenceIdSet(source);
88
		
89
		//nom reference map
90
		String nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
91
		Class cdmClass = ReferenceBase.class;
92
		idSet = new HashSet<String>();
93
		Map<String, ReferenceBase> nomRefMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
94
		
95
		//biblio reference map
96
		nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
97
		cdmClass = ReferenceBase.class;
98
//		idSet = new HashSet<String>();
99
		Map<String, ReferenceBase> biblioRefMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
100
		
101
		ResultSet rs = source.getResultSet(getTaxonomicTreeQuery()) ;
102
		int i = 0;
103
		//for each reference
104
		try {
105
			while (rs.next()){
106
				
107
				if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RelPTaxa handled: " + (i-1));}
108
				
109
				Object ptRefFkObj = rs.getObject("PTRefFk");
110
				String ptRefFk= String.valueOf(ptRefFkObj);
111
				ReferenceBase<?> ref = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, ptRefFk);
112
				
113
				rs.getString("RefCache");
114
				String treeName = "TaxonTree - No Name";
115
				String refCache = rs.getString("RefCache");
116
				if (CdmUtils.isNotEmpty(refCache)){
117
					treeName = refCache;
118
				}
119
				if (ref != null && CdmUtils.isNotEmpty(ref.getTitleCache())){
120
					treeName = ref.getTitleCache();
121
				}
122
				TaxonomicTree tree = TaxonomicTree.NewInstance(treeName);
123
				tree.setReference(ref);
124
				if (i == 1 && state.getConfig().getTaxonomicTreeUuid() != null){
125
					tree.setUuid(state.getConfig().getTaxonomicTreeUuid());
126
				}
127
				IdentifiableSource identifiableSource = IdentifiableSource.NewInstance(ptRefFk, TREE_NAMESPACE);
128
				tree.addSource(identifiableSource);
129
				
130
				getTaxonTreeService().save(tree);
131
				state.putTaxonomicTreeUuidInt((Integer)ptRefFkObj, tree);
132
			}
133
		} catch (SQLException e) {
134
			logger.error("Error in BerlinModleTaxonRelationImport.makeTaxonomicTrees: " + e.getMessage());
135
			throw e;
136
		}
137
		logger.info("end make taxonomic tree ...");
138

    
139
		return true;
140
	}
141

    
142
	/**
143
	 * @return
144
	 * @throws SQLException 
145
	 */
146
	private Set<String> getTreeReferenceIdSet(Source source) throws SQLException {
147
		Set<String> result = new HashSet<String>();
148
		ResultSet rs = source.getResultSet(getTaxonomicTreeQuery()) ;
149
		while (rs.next()){
150
			Object id = rs.getObject("PTRefFk");
151
			result.add(String.valueOf(id));
152
		}
153
		return result;
154
	}
155

    
156
	/**
157
	 * @return
158
	 */
159
	private String getTaxonomicTreeQuery() {
160
		String strQuery = "SELECT PTaxon.PTRefFk, Reference.RefCache " + 
161
						" FROM RelPTaxon INNER JOIN " + 
162
							" PTaxon AS PTaxon ON RelPTaxon.PTNameFk2 = PTaxon.PTNameFk AND RelPTaxon.PTRefFk2 = PTaxon.PTRefFk INNER JOIN " +
163
							" Reference ON PTaxon.PTRefFk = Reference.RefId " + 
164
						" WHERE (RelPTaxon.RelQualifierFk = 1) " + 
165
						" GROUP BY PTaxon.PTRefFk, Reference.RefCache ";
166
		return strQuery;
167
	}
168
	
169

    
170
	/* (non-Javadoc)
171
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
172
	 */
173
	@Override
174
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
175
		String strQuery = 
176
			" SELECT RelPTaxon.*, FromTaxon.RIdentifier as taxon1Id, ToTaxon.RIdentifier as taxon2Id, ToTaxon.PTRefFk as treeRefFk, q.is_concept_relation " + 
177
			" FROM PTaxon as FromTaxon " +
178
              	" INNER JOIN RelPTaxon ON FromTaxon.PTNameFk = RelPTaxon.PTNameFk1 AND FromTaxon.PTRefFk = RelPTaxon.PTRefFk1 " +
179
              	" INNER JOIN PTaxon AS ToTaxon ON RelPTaxon.PTNameFk2 = ToTaxon.PTNameFk AND RelPTaxon.PTRefFk2 = ToTaxon.PTRefFk " +
180
              	" INNER JOIN RelPTQualifier q ON q.RelPTQualifierId = RelPTaxon.RelQualifierFk " + 
181
            " WHERE RelPTaxon.RelPTaxonId IN ("+ID_LIST_TOKEN+") ";
182
		return strQuery;
183
	}
184

    
185
	/* (non-Javadoc)
186
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
187
	 */
188
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
189
		boolean success = true ;
190
		BerlinModelImportConfigurator config = state.getConfig();
191
		Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();
192
		Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);
193
		Map<Integer, TaxonomicTree> taxonTreeMap = new HashMap<Integer, TaxonomicTree>();
194
		Map<String, ReferenceBase> biblioRefMap = (Map<String, ReferenceBase>) partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);
195
		Map<String, ReferenceBase> nomRefMap = (Map<String, ReferenceBase>) partitioner.getObjectMap(BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE);
196

    
197
		ResultSet rs = partitioner.getResultSet();
198
			
199
		try{
200
			int i = 0;
201
			//for each reference
202
			while (rs.next()){
203
				
204
				if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RelPTaxa handled: " + (i-1));}
205
				
206
				int relPTaxonId = rs.getInt("RelPTaxonId");
207
				int taxon1Id = rs.getInt("taxon1Id");
208
				int taxon2Id = rs.getInt("taxon2Id");
209
				Object relRefFkObj = rs.getObject("relRefFk");
210
				int treeRefFk = rs.getInt("treeRefFk");
211
				int relQualifierFk = rs.getInt("relQualifierFk");
212
				String notes = rs.getString("notes");
213
				boolean isConceptRelationship = rs.getBoolean("is_concept_relation");
214
				
215
				TaxonBase taxon1 = taxonMap.get(String.valueOf(taxon1Id));
216
				TaxonBase taxon2 = taxonMap.get(String.valueOf(taxon2Id));
217
				
218
				String refFk = String.valueOf(relRefFkObj);
219
				ReferenceBase citation = getReferenceOnlyFromMaps(biblioRefMap,	nomRefMap, refFk);
220
				
221
				String microcitation = null; //does not exist in RelPTaxon
222
	
223
				if (taxon2 != null && taxon1 != null){
224
					if (!(taxon2 instanceof Taxon)){
225
						logger.error("TaxonBase (ID = " + taxon2.getId()+ ", RIdentifier = " + taxon2Id + ") can't be casted to Taxon");
226
						success = false;
227
						continue;
228
					}
229
					AnnotatableEntity taxonRelationship = null;
230
					Taxon toTaxon = (Taxon)taxon2;
231
					if (isTaxonRelationship(relQualifierFk)){
232
						if (!(taxon1 instanceof Taxon)){
233
							logger.error("TaxonBase (ID = " + taxon1.getId()+ ", RIdentifier = " + taxon1Id + ") can't be casted to Taxon");
234
							success = false;
235
							continue;
236
						}
237
						Taxon fromTaxon = (Taxon)taxon1;
238
						if (relQualifierFk == TAX_REL_IS_INCLUDED_IN){
239
							taxonRelationship = makeTaxonomicallyIncluded(state, taxonTreeMap, treeRefFk, fromTaxon, toTaxon, citation, microcitation);
240
						}else if (relQualifierFk == TAX_REL_IS_MISAPPLIED_NAME_OF){
241
							 taxonRelationship = toTaxon.addMisappliedName(fromTaxon, citation, microcitation);
242
						}
243
					}else if (isSynonymRelationship(relQualifierFk)){
244
						if (!(taxon1 instanceof Synonym)){
245
							logger.error("Taxon (ID = " + taxon1.getId()+ ", RIdentifier = " + taxon1Id + ") can't be casted to Synonym");
246
							success = false;
247
							continue;
248
						}
249
						Synonym synonym = (Synonym)taxon1;
250
						SynonymRelationship synRel = getSynRel(relQualifierFk, toTaxon, synonym, citation, microcitation);
251
						taxonRelationship = synRel;
252
						
253
						if (relQualifierFk == TAX_REL_IS_SYNONYM_OF || 
254
								relQualifierFk == TAX_REL_IS_HOMOTYPIC_SYNONYM_OF ||
255
								relQualifierFk == TAX_REL_IS_HETEROTYPIC_SYNONYM_OF){
256
							addProParteAndPartial(synRel, synonym, config);
257
						}else if (relQualifierFk == TAX_REL_IS_PROPARTE_SYN_OF ||
258
								relQualifierFk == TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF ||
259
								relQualifierFk == TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF ){
260
								synRel.setProParte(true);
261
						}else if(relQualifierFk == TAX_REL_IS_PARTIAL_SYN_OF || 
262
								relQualifierFk == TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF ||
263
								relQualifierFk == TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF ){
264
								synRel.setPartial(true);
265
						}else{
266
							success = false;
267
							logger.warn("Proparte/Partial not yet implemented for TaxonRelationShipType " + relQualifierFk);
268
						}
269
					}else if (isConceptRelationship){
270
						ResultWrapper<Boolean> isInverse = new ResultWrapper<Boolean>();
271
						try {
272
							TaxonRelationshipType relType = BerlinModelTransformer.taxonRelId2TaxonRelType(relQualifierFk, isInverse);	
273
							if (! (taxon1 instanceof Taxon)){
274
								success = false;
275
								logger.error("TaxonBase (ID = " + taxon1.getId()+ ", RIdentifier = " + taxon1Id + ") can't be casted to Taxon");
276
							}else{
277
								Taxon fromTaxon = (Taxon)taxon1;
278
								taxonRelationship = fromTaxon.addTaxonRelation(toTaxon, relType, citation, microcitation);
279
							}
280
						} catch (UnknownCdmTypeException e) {
281
							//TODO other relationships
282
							logger.warn("TaxonRelationShipType " + relQualifierFk + " (conceptRelationship) not yet implemented");
283
							success = false;
284
						}
285
					}else {
286
						//TODO
287
						logger.warn("TaxonRelationShipType " + relQualifierFk + " not yet implemented");
288
						success = false;
289
					}
290
					
291
					doNotes(taxonRelationship, notes);
292
					taxaToSave.add(taxon2);
293
					
294
					//TODO
295
					//etc.
296
				}else{
297
					//TODO
298
					logger.warn("Taxa for RelPTaxon " + relPTaxonId + " do not exist in store");
299
					success = false;
300
				}
301
			}
302
		}catch(SQLException e){
303
			throw new RuntimeException(e);
304
		}
305
		logger.info("Taxa to save: " + taxaToSave.size());
306
		partitioner.startDoSave();
307
		getTaxonService().save(taxaToSave);
308
		taxonTreeMap = null;
309
		taxaToSave = null;
310
			
311
			return success;
312
	}
313
	
314

    
315
	/* (non-Javadoc)
316
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)
317
	 */
318
	@Override
319
	protected boolean doInvoke(BerlinModelImportState state){				
320
		try {
321
			boolean success = true;
322
			success &= makeTaxonomicTrees(state);
323
			success &= super.doInvoke(state);
324
			return success;
325
		} catch (SQLException e) {
326
			throw new RuntimeException(e);
327
		}
328
		
329
	}
330
	
331

    
332
	/* (non-Javadoc)
333
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
334
	 */
335
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition( ResultSet rs) {
336
		String nameSpace;
337
		Class cdmClass;
338
		Set<String> idSet;
339
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
340
		
341
		try{
342
			Set<String> taxonIdSet = new HashSet<String>();
343
			Set<String> referenceIdSet = new HashSet<String>();
344
//			Set<String> taxonTreeIdSet = new HashSet<String>();
345
			while (rs.next()){
346
				handleForeignKey(rs, taxonIdSet, "taxon1Id");
347
				handleForeignKey(rs, taxonIdSet, "taxon2Id");
348
//				handleForeignKey(rs, taxonTreeIdSet, "treeRefFk");
349
				handleForeignKey(rs, referenceIdSet, "RelRefFk");
350
	}
351
	
352
			//taxon map
353
			nameSpace = BerlinModelTaxonImport.NAMESPACE;
354
			cdmClass = TaxonBase.class;
355
			idSet = taxonIdSet;
356
			Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
357
			result.put(nameSpace, taxonMap);
358

    
359
//			//tree map
360
//			nameSpace = "TaxonomicTree";
361
//			cdmClass = TaxonomicTree.class;
362
//			idSet = taxonTreeIdSet;
363
//			Map<String, TaxonomicTree> treeMap = (Map<String, TaxonomicTree>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
364
//			result.put(cdmClass, treeMap);
365
//			Set<UUID> treeUuidSet = state
366
//			getTaxonTreeService().find(uuidSet);
367
//			
368
			
369
			//nom reference map
370
			nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
371
			cdmClass = ReferenceBase.class;
372
			idSet = referenceIdSet;
373
			Map<String, ReferenceBase> nomReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
374
			result.put(nameSpace, nomReferenceMap);
375

    
376
			//biblio reference map
377
			nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
378
			cdmClass = ReferenceBase.class;
379
			idSet = referenceIdSet;
380
			Map<String, ReferenceBase> biblioReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
381
			result.put(nameSpace, biblioReferenceMap);
382

    
383
		} catch (SQLException e) {
384
			throw new RuntimeException(e);
385
		}
386
		return result;
387
	}
388
	
389
	private SynonymRelationship getSynRel (int relQualifierFk, Taxon toTaxon, Synonym synonym, ReferenceBase citation, String microcitation){
390
		SynonymRelationship result;
391
		if (relQualifierFk == TAX_REL_IS_HOMOTYPIC_SYNONYM_OF ||
392
				relQualifierFk == TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF ||
393
				relQualifierFk == TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF){
394
			result = toTaxon.addHomotypicSynonym(synonym, citation, microcitation);
395
		}else if (relQualifierFk == TAX_REL_IS_HETEROTYPIC_SYNONYM_OF ||
396
				relQualifierFk == TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF ||
397
				relQualifierFk == TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF){
398
			result = toTaxon.addSynonym(synonym, SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF(), citation, microcitation);
399
		}else if (relQualifierFk == TAX_REL_IS_SYNONYM_OF ||
400
				relQualifierFk == TAX_REL_IS_PROPARTE_SYN_OF ||
401
				relQualifierFk == TAX_REL_IS_PARTIAL_SYN_OF){
402
			result = toTaxon.addSynonym(synonym, SynonymRelationshipType.SYNONYM_OF(), citation, microcitation);
403
		}else{
404
			logger.warn("SynonymyRelationShipType could not be defined for relQualifierFk " + relQualifierFk + ". 'Unknown'-Type taken instead.");
405
			result = toTaxon.addSynonym(synonym, SynonymRelationshipType.SYNONYM_OF(), citation, microcitation);
406
		}
407
		return result;
408

    
409
	}
410
	
411
	private  boolean isSynonymRelationship(int relQualifierFk){
412
		if (relQualifierFk == TAX_REL_IS_SYNONYM_OF || 
413
			relQualifierFk == TAX_REL_IS_HOMOTYPIC_SYNONYM_OF || 
414
			relQualifierFk == TAX_REL_IS_HETEROTYPIC_SYNONYM_OF ||
415
			relQualifierFk == TAX_REL_IS_PROPARTE_SYN_OF || 
416
			relQualifierFk == TAX_REL_IS_PARTIAL_SYN_OF ||
417
			relQualifierFk == TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF ||
418
			relQualifierFk == TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF ||
419
			relQualifierFk == TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF ||
420
			relQualifierFk == TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF
421
		){
422
			return true;
423
		}else{
424
			return false;
425
		}
426
	}
427
	
428
	private  boolean isTaxonRelationship(int relQualifierFk){
429
		if (relQualifierFk == TAX_REL_IS_INCLUDED_IN || 
430
		relQualifierFk == TAX_REL_IS_MISAPPLIED_NAME_OF){
431
			return true;
432
		}else{
433
			return false;
434
		}
435
	}
436
	
437
	private void addProParteAndPartial(SynonymRelationship synRel, Synonym synonym, BerlinModelImportConfigurator bmiConfig){
438
		if (bmiConfig.isPartialSynonym(synonym)){
439
			synRel.setPartial(true);
440
		}
441
		if (bmiConfig.isProParteSynonym(synonym)){
442
			synRel.setProParte(true);
443
		}
444
	}
445
	
446
	private TaxonNode makeTaxonomicallyIncluded(BerlinModelImportState state, Map<Integer, TaxonomicTree> taxonTreeMap, int treeRefFk, Taxon child, Taxon parent, ReferenceBase citation, String microCitation){
447
		TaxonomicTree tree = taxonTreeMap.get(treeRefFk);
448
		if (tree == null){
449
			UUID treeUuid = state.getTreeUuidByIntTreeKey(treeRefFk);
450
			tree = getTaxonTreeService().getTaxonomicTreeByUuid(treeUuid);
451
			taxonTreeMap.put(treeRefFk, tree);
452
		}
453
		if (tree == null){
454
			throw new IllegalStateException("Tree for ToTaxon reference does not exist.");
455
		}
456
		return tree.addParentChild(parent, child, citation, microCitation);
457
	}
458
	
459
	
460
	/* (non-Javadoc)
461
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
462
	 */
463
	@Override
464
	protected boolean doCheck(BerlinModelImportState state){
465
		IOValidator<BerlinModelImportState> validator = new BerlinModelTaxonRelationImportValidator();
466
		return validator.validate(state);
467
	}
468
	
469
	
470
	/* (non-Javadoc)
471
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
472
	 */
473
	@Override
474
	protected String getTableName() {
475
		return dbTableName;
476
	}
477
	
478
	/* (non-Javadoc)
479
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
480
	 */
481
	@Override
482
	public String getPluralString() {
483
		return pluralString;
484
	}
485
	
486
	/* (non-Javadoc)
487
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
488
	 */
489
	protected boolean isIgnore(BerlinModelImportState state){
490
		return ! state.getConfig().isDoRelTaxa();
491
	}
492

    
493
	
494
}
(17-17/21)