Project

General

Profile

Download (15.6 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.berlinModel.in;
11

    
12
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_HAS_SAME_TYPE_AS;
13
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_ALTERNATIVE_NAME_FOR;
14
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_BASIONYM_FOR;
15
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_CONSERVED_TYPE_OF;
16
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_FEMALE_PARENT_OF;
17
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_FIRST_PARENT_OF;
18
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_LATER_HOMONYM_OF;
19
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_LATER_VALIDATION_OF;
20
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_LECTOTYPE_OF;
21
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_MALE_PARENT_OF;
22
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF;
23
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_REJECTED_TYPE_OF;
24
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_REPLACED_SYNONYM_FOR;
25
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_SECOND_PARENT_OF;
26
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF;
27
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_TYPE_OF;
28
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_VALIDATION_OF;
29
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_TYPE_NOT_DESIGNATED;
30

    
31
import java.lang.reflect.Method;
32
import java.sql.ResultSet;
33
import java.sql.SQLException;
34
import java.util.HashMap;
35
import java.util.HashSet;
36
import java.util.Map;
37
import java.util.Set;
38

    
39
import org.apache.log4j.Logger;
40
import org.springframework.stereotype.Component;
41

    
42
import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
43
import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelTaxonNameRelationImportValidator;
44
import eu.etaxonomy.cdm.io.common.IOValidator;
45
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
46
import eu.etaxonomy.cdm.model.agent.Person;
47
import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
48
import eu.etaxonomy.cdm.model.common.Annotation;
49
import eu.etaxonomy.cdm.model.common.AnnotationType;
50
import eu.etaxonomy.cdm.model.common.CdmBase;
51
import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
52
import eu.etaxonomy.cdm.model.name.IBotanicalName;
53
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
54
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
55
import eu.etaxonomy.cdm.model.name.TaxonName;
56
import eu.etaxonomy.cdm.model.reference.Reference;
57
import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
58

    
59
/**
60
 * @author a.mueller
61
 * @since 20.03.2008
62
 */
63
@Component
64
public class BerlinModelTaxonNameRelationImport extends BerlinModelImportBase {
65

    
66
    private static final long serialVersionUID = 1197601822023101796L;
67
    private static final Logger logger = Logger.getLogger(BerlinModelTaxonNameRelationImport.class);
68

    
69
	private static int modCount = 5000;
70
	private static final String pluralString = "name relations";
71
	private static final String dbTableName = "RelName";
72

    
73

    
74
	public BerlinModelTaxonNameRelationImport(){
75
		super(dbTableName, pluralString);
76
	}
77

    
78

    
79
	@Override
80
	protected String getIdQuery(BerlinModelImportState state) {
81
		String nameIdTable = state.getConfig().getNameIdTable();
82
		String result = super.getIdQuery(state);
83
	    if (isNotBlank(nameIdTable)){
84
			if (state.getConfig().isEuroMed()){
85
			    result += " WHERE nameFk1 IN (SELECT NameId FROM %s) AND RelNameQualifierFk IN (2, 4, 5, 13, 14, 15, 17, 18, 37, 62) OR ";
86
			    result += "       nameFk2 IN (SELECT NameId FROM %s)  ";
87
			    //the first part is only to check if there are relations that we have maybe missed.
88
			    //2 is unclear, 17 should be in both, 62 links names to itself
89
			    result = String.format(result, nameIdTable, nameIdTable);
90
			}else{
91
			    result += " WHERE nameFk1 IN (SELECT NameId FROM %s) OR ";
92
			    result += "       nameFk2 IN (SELECT NameId FROM %s) ";
93
			    result = String.format(result, nameIdTable, nameIdTable );
94
			}
95

    
96
		}else{
97
			//
98
		}
99
	    return result;
100
	}
101

    
102

    
103
	@Override
104
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
105
			String strQuery =
106
					" SELECT RelName.*, FromName.nameId as name1Id, ToName.nameId as name2Id, RefDetail.Details " +
107
					" FROM Name as FromName INNER JOIN " +
108
                      	" RelName ON FromName.NameId = RelName.NameFk1 INNER JOIN " +
109
                      	" Name AS ToName ON RelName.NameFk2 = ToName.NameId LEFT OUTER JOIN "+
110
                      	" RefDetail ON RelName.RefDetailFK = RefDetail.RefDetailId " +
111
            " WHERE (RelNameId IN ("+ID_LIST_TOKEN +"))";
112
		return strQuery;
113
	}
114

    
115
	@Override
116
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
117
		boolean success = true ;
118
		BerlinModelImportConfigurator config = state.getConfig();
119
		Set<TaxonName> nameToSave = new HashSet<>();
120
		Map<String, TaxonName> nameMap = partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
121
		Map<String, Reference> refMap = partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
122

    
123
		ResultSet rs = partitioner.getResultSet();
124
		try {
125

    
126
			int i = 0;
127
			//for each name relation
128
			while (rs.next()){
129

    
130
				if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RelName handled: " + (i-1));}
131

    
132
				int relNameId = rs.getInt("RelNameId");
133
				int name1Id = rs.getInt("name1Id");
134
				int name2Id = rs.getInt("name2Id");
135
				Object relRefFkObj = rs.getObject("refFk");
136
				String details = rs.getString("details");
137
				int relQualifierFk = rs.getInt("relNameQualifierFk");
138
				String notes = rs.getString("notes");
139

    
140
				TaxonName nameFrom = nameMap.get(String.valueOf(name1Id));
141
				TaxonName nameTo = nameMap.get(String.valueOf(name2Id));
142

    
143

    
144
				Reference citation = null;
145
				if (relRefFkObj != null){
146
					String relRefFk = String.valueOf(relRefFkObj);
147
					//get nomRef
148
					citation = refMap.get(relRefFk);
149
				}
150

    
151
				//TODO (preliminaryFlag = true testen
152
				String microcitation = details;
153
				String rule = null;
154

    
155
				if (nameFrom != null && nameTo != null){
156
					success = handleNameRelationship(success, config, name1Id, name2Id,	relQualifierFk,
157
							notes, nameFrom, nameTo, citation, microcitation, rule, relNameId);
158

    
159
					if (! nameFrom.isProtectedTitleCache()){
160
						nameFrom.setTitleCache(null);
161
						nameFrom.getTitleCache();
162
					}
163
					if (! nameTo.isProtectedTitleCache()){
164
						nameTo.setTitleCache(null);
165
						nameTo.getTitleCache();
166
					}
167
					nameToSave.add(nameFrom);
168

    
169
					//TODO
170
					//ID
171
					//etc.
172
				}else{
173
					//TODO
174
					if (nameFrom == null){
175
						if ( ! (config.isUseEmAreaVocabulary() && relNameId == 28159 )) {
176
							logger.warn("from TaxonName " + name1Id + "  for RelName (" + relNameId + " , type: " + relQualifierFk  + " , toName: " + name2Id+ ") does not exist in store. ToName is: " + (nameTo == null ? "" : nameTo.getTitleCache()));
177
						}
178
					}
179
					if (nameTo == null){
180
						logger.warn("to TaxonName " + name2Id + " for RelName (" + relNameId + " , type: " + relQualifierFk  + " , fromName: " + name1Id + ") does not exist in store. FromName is: "  + (nameFrom == null ? "" : nameFrom.getTitleCache()));
181
					}
182
					success = false;
183
				}
184
			}
185

    
186

    
187
			partitioner.startDoSave();
188
			getNameService().save(nameToSave);
189

    
190
			return success;
191
		} catch (SQLException e) {
192
			logger.error("SQLException:" +  e);
193
			return false;
194
		}
195
	}
196

    
197
	/**
198
	 * @param success
199
	 * @param config
200
	 * @param name1Id
201
	 * @param name2Id
202
	 * @param relQualifierFk
203
	 * @param notes
204
	 * @param nameFrom
205
	 * @param nameTo
206
	 * @param citation
207
	 * @param microcitation
208
	 * @param rule
209
	 * @param relNameId
210
	 * @return
211
	 */
212
	private boolean handleNameRelationship(boolean success,
213
				BerlinModelImportConfigurator config, int name1Id, int name2Id,
214
				int relQualifierFk, String notes, TaxonName nameFrom,
215
				TaxonName nameTo, Reference citation,
216
				String microcitation, String rule, int relNameId) {
217
		AnnotatableEntity nameRelationship = null;
218
		if (relQualifierFk == NAME_REL_IS_BASIONYM_FOR){
219
			nameRelationship = nameTo.addBasionym(nameFrom, citation, microcitation, rule);
220
		}else if (relQualifierFk == NAME_REL_IS_LATER_HOMONYM_OF){
221
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.LATER_HOMONYM(), citation, microcitation, rule) ;
222
		}else if (relQualifierFk == NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF){
223
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.LATER_HOMONYM(), citation, microcitation, rule) ;
224
		}else if (relQualifierFk == NAME_REL_IS_REPLACED_SYNONYM_FOR){
225
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.REPLACED_SYNONYM(), citation, microcitation, rule) ;
226
		}else if (relQualifierFk == NAME_REL_HAS_SAME_TYPE_AS){
227
			nameTo.getHomotypicalGroup().merge(nameFrom.getHomotypicalGroup());
228
		}else if (relQualifierFk == NAME_REL_IS_VALIDATION_OF){
229
			nameRelationship = nameTo.addRelationshipToName(nameFrom, NameRelationshipType.VALIDATED_BY_NAME(), citation, microcitation, rule) ;
230
		}else if (relQualifierFk == NAME_REL_IS_LATER_VALIDATION_OF){
231
			nameRelationship = nameTo.addRelationshipToName(nameFrom, NameRelationshipType.LATER_VALIDATED_BY_NAME(), citation, microcitation, rule) ;
232
		}else if (relQualifierFk == NAME_REL_IS_TYPE_OF || relQualifierFk == NAME_REL_IS_REJECTED_TYPE_OF ||  relQualifierFk == NAME_REL_IS_CONSERVED_TYPE_OF || relQualifierFk == NAME_REL_IS_LECTOTYPE_OF || relQualifierFk == NAME_REL_TYPE_NOT_DESIGNATED ){
233
			boolean isRejectedType = (relQualifierFk == NAME_REL_IS_REJECTED_TYPE_OF);
234
			boolean isConservedType = (relQualifierFk == NAME_REL_IS_CONSERVED_TYPE_OF);
235
			boolean isLectoType = (relQualifierFk == NAME_REL_IS_LECTOTYPE_OF);
236
			boolean isNotDesignated = (relQualifierFk == NAME_REL_TYPE_NOT_DESIGNATED);
237

    
238
			NameTypeDesignationStatus status = null;
239
			String originalNameString = null;
240
			//TODO addToAllNames true or false?
241
			boolean addToAllNames = false;
242
			if (config.getNameTypeDesignationStatusMethod() != null){
243
				Method method = config.getNameTypeDesignationStatusMethod();
244
				method.setAccessible(true);
245
				try {
246
					status = (NameTypeDesignationStatus)method.invoke(null, notes);
247
					nameRelationship = nameTo.addNameTypeDesignation(nameFrom, citation, microcitation, originalNameString, status, addToAllNames);
248
				} catch (Exception e) {
249
					throw new RuntimeException(e);
250
				}
251
			}else{
252
				if (isLectoType){
253
					status = NameTypeDesignationStatus.LECTOTYPE();
254
				}
255
				if (isNotDesignated && nameTo == nameFrom){
256
				    nameFrom = null;  //E+M case
257
				}
258

    
259
				nameRelationship = nameTo.addNameTypeDesignation(nameFrom, citation, microcitation, originalNameString, status, isRejectedType, isConservedType, isNotDesignated, addToAllNames);
260
			}
261

    
262
		}else if (relQualifierFk == NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF){
263
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.ORTHOGRAPHIC_VARIANT(), citation, microcitation, rule) ;
264
		}else if (relQualifierFk == NAME_REL_IS_ALTERNATIVE_NAME_FOR){
265
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.ALTERNATIVE_NAME(), citation, microcitation, rule) ;
266
		}else if (relQualifierFk == NAME_REL_IS_FIRST_PARENT_OF || relQualifierFk == NAME_REL_IS_SECOND_PARENT_OF || relQualifierFk == NAME_REL_IS_FEMALE_PARENT_OF || relQualifierFk == NAME_REL_IS_MALE_PARENT_OF){
267
			//HybridRelationships
268
			try {
269
				HybridRelationshipType hybridRelType = BerlinModelTransformer.relNameId2HybridRel(relQualifierFk);
270
				IBotanicalName parent = nameFrom;
271
				IBotanicalName child = nameTo;
272

    
273
				nameRelationship = parent.addHybridChild(child, hybridRelType, rule);
274

    
275
			} catch (UnknownCdmTypeException e) {
276
				logger.warn(e);
277
				success = false;
278
			}
279
		}else {
280
			//TODO
281
			Method method = config.getNamerelationshipTypeMethod();
282
			if (method != null){
283
				try {
284
					method.invoke(null, relQualifierFk, nameTo, nameFrom);
285
				} catch (Exception e) {
286
					logger.error(e.getMessage());
287
					logger.warn("NameRelationship could not be imported");
288
					success = false;
289
				}
290
			}else{
291
				logger.warn("NameRelationShipType " + relQualifierFk + " not yet implemented");
292
				success = false;
293
			}
294
		}
295
		Annotation annotation = doNotes(nameRelationship, notes);
296
		if (config.isEuroMed() && annotation != null){
297
		    if (relQualifierFk == NAME_REL_IS_BASIONYM_FOR){
298
		        annotation.setAnnotationType(AnnotationType.TECHNICAL());
299
		    }else if ((relQualifierFk == NAME_REL_IS_LECTOTYPE_OF) && !notes.contains("designated")){
300
		        annotation.setAnnotationType(AnnotationType.TECHNICAL());
301
		    }else{
302
		        logger.warn("Annotation type not defined for name relationship " + relNameId);
303
		    }
304
		}else if (annotation != null){
305
            logger.warn("Annotation type not defined for name relationship " + relNameId);
306
		}
307
		return success;
308
	}
309

    
310
	@Override
311
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
312
		String nameSpace;
313
		Class<?> cdmClass;
314
		Set<String> idSet;
315
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
316

    
317
		try{
318
			Set<String> nameIdSet = new HashSet<>();
319
			Set<String> referenceIdSet = new HashSet<>();
320
			Set<String> refDetailIdSet = new HashSet<>();
321
			while (rs.next()){
322
				handleForeignKey(rs, nameIdSet, "name1Id");
323
				handleForeignKey(rs, nameIdSet, "name2Id");
324
				handleForeignKey(rs, referenceIdSet, "RefFk");
325
				handleForeignKey(rs, refDetailIdSet, "RefDetailFk");
326
	}
327

    
328
			//name map
329
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
330
			cdmClass = TaxonName.class;
331
			idSet = nameIdSet;
332
			Map<String, Person> objectMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
333
			result.put(nameSpace, objectMap);
334

    
335
			//reference map
336
			nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;
337
			cdmClass = Reference.class;
338
			idSet = referenceIdSet;
339
			Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
340
			result.put(nameSpace, referenceMap);
341

    
342
			//refDetail map
343
			nameSpace = BerlinModelRefDetailImport.REFDETAIL_NAMESPACE;
344
			cdmClass = Reference.class;
345
			idSet = refDetailIdSet;
346
			Map<String, Reference> refDetailMap= (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
347
			result.put(nameSpace, refDetailMap);
348

    
349
		} catch (SQLException e) {
350
			throw new RuntimeException(e);
351
				}
352
		return result;
353
	}
354

    
355
	@Override
356
	protected boolean doCheck(BerlinModelImportState state){
357
		IOValidator<BerlinModelImportState> validator = new BerlinModelTaxonNameRelationImportValidator();
358
		return validator.validate(state);
359
	}
360

    
361
	@Override
362
    protected boolean isIgnore(BerlinModelImportState state){
363
		return ! state.getConfig().isDoRelNames();
364
		}
365

    
366

    
367
}
(17-17/22)