Project

General

Profile

Download (15.1 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_TYPE_OF;
27
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_VALIDATION_OF;
28
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_TYPE_NOT_DESIGNATED;
29
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF;
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.commons.lang.StringUtils;
40
import org.apache.log4j.Logger;
41
import org.springframework.stereotype.Component;
42

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

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

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

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

    
77
	
78
	@Override
79
	protected String getIdQuery(BerlinModelImportState state) {
80
		if (StringUtils.isNotBlank(state.getConfig().getNameIdTable())){
81
			String result = super.getIdQuery(state);
82
			result += " WHERE nameFk1 IN (SELECT NameId FROM %s) OR ";
83
			result += "       nameFk2 IN (SELECT NameId FROM %s)";
84
			result = String.format(result, state.getConfig().getNameIdTable(),state.getConfig().getNameIdTable() );
85
			return result;
86
		}else{
87
			return super.getIdQuery(state);
88
		}
89
	}
90
	
91

    
92
	@Override
93
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
94
			String strQuery = 
95
					" SELECT RelName.*, FromName.nameId as name1Id, ToName.nameId as name2Id, RefDetail.Details " + 
96
					" FROM Name as FromName INNER JOIN " +
97
                      	" RelName ON FromName.NameId = RelName.NameFk1 INNER JOIN " +
98
                      	" Name AS ToName ON RelName.NameFk2 = ToName.NameId LEFT OUTER JOIN "+
99
                      	" RefDetail ON RelName.RefDetailFK = RefDetail.RefDetailId " + 
100
            " WHERE (RelNameId IN ("+ID_LIST_TOKEN +"))";
101
		return strQuery;
102
	}
103

    
104
	@Override
105
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
106
		boolean success = true ;
107
		BerlinModelImportConfigurator config = state.getConfig();
108
		Set<TaxonNameBase> nameToSave = new HashSet<TaxonNameBase>();
109
		Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
110
		Map<String, Reference> refMap = partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
111
		
112
		ResultSet rs = partitioner.getResultSet();
113
		try {
114
			
115
			int i = 0;
116
			//for each name relation
117
			while (rs.next()){
118
				
119
				if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RelName handled: " + (i-1));}
120
				
121
				int relNameId = rs.getInt("RelNameId");
122
				int name1Id = rs.getInt("name1Id");
123
				int name2Id = rs.getInt("name2Id");
124
				Object relRefFkObj = rs.getObject("refFk");
125
				String details = rs.getString("details");
126
				int relQualifierFk = rs.getInt("relNameQualifierFk");
127
				String notes = rs.getString("notes");
128
				
129
				TaxonNameBase<?,?> nameFrom = nameMap.get(String.valueOf(name1Id));
130
				TaxonNameBase<?,?> nameTo = nameMap.get(String.valueOf(name2Id));
131
				
132
				
133
				Reference<?> citation = null;
134
				if (relRefFkObj != null){
135
					String relRefFk = String.valueOf(relRefFkObj);
136
					//get nomRef
137
					citation = refMap.get(relRefFk);
138
				}
139
				
140
				//TODO (preliminaryFlag = true testen
141
				String microcitation = details;
142
				String rule = null;  
143
				
144
				if (nameFrom != null && nameTo != null){
145
					success = handleNameRelationship(success, config, name1Id, name2Id,	relQualifierFk, 
146
							notes, nameFrom, nameTo, citation, microcitation, rule);
147
					
148
					if (! nameFrom.isProtectedTitleCache()){
149
						nameFrom.setTitleCache(null);
150
						nameFrom.getTitleCache();
151
					}
152
					if (! nameTo.isProtectedTitleCache()){
153
						nameTo.setTitleCache(null);
154
						nameTo.getTitleCache();
155
					}
156
					nameToSave.add(nameFrom);
157
					
158
					//TODO
159
					//ID
160
					//etc.
161
				}else{
162
					//TODO
163
					if (nameFrom == null){
164
						if ( ! (config.isUseEmAreaVocabulary() && relNameId == 28159 )) {
165
							logger.warn("from TaxonName " + name1Id + "  for RelName (" + relNameId + " , type: " + relQualifierFk  + " , toName: " + name2Id+ ") does not exist in store. ToName is: " + (nameTo == null ? "" : nameTo.getTitleCache()));
166
						}
167
					}
168
					if (nameTo == null){
169
						logger.warn("to TaxonName " + name2Id + " for RelName (" + relNameId + " , type: " + relQualifierFk  + " , fromName: " + name1Id + ") does not exist in store. FromName is: "  + (nameFrom == null ? "" : nameFrom.getTitleCache()));
170
					}
171
					success = false;
172
				}
173
			}
174
			
175
			
176
			partitioner.startDoSave();
177
			getNameService().save(nameToSave);
178
			
179
			return success;
180
		} catch (SQLException e) {
181
			logger.error("SQLException:" +  e);
182
			return false;
183
		}
184
	}
185

    
186
	/**
187
	 * @param success
188
	 * @param config
189
	 * @param name1Id
190
	 * @param name2Id
191
	 * @param relQualifierFk
192
	 * @param notes
193
	 * @param nameFrom
194
	 * @param nameTo
195
	 * @param citation
196
	 * @param microcitation
197
	 * @param rule
198
	 * @return
199
	 */
200
	private boolean handleNameRelationship(boolean success,
201
				BerlinModelImportConfigurator config, int name1Id, int name2Id,
202
				int relQualifierFk, String notes, TaxonNameBase nameFrom,
203
				TaxonNameBase nameTo, Reference<?> citation,
204
				String microcitation, String rule) {
205
		AnnotatableEntity nameRelationship = null;
206
		if (relQualifierFk == NAME_REL_IS_BASIONYM_FOR){
207
			nameRelationship = nameTo.addBasionym(nameFrom, citation, microcitation, rule);
208
		}else if (relQualifierFk == NAME_REL_IS_LATER_HOMONYM_OF){
209
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.LATER_HOMONYM(), citation, microcitation, rule) ;
210
		}else if (relQualifierFk == NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF){
211
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.LATER_HOMONYM(), citation, microcitation, rule) ;
212
		}else if (relQualifierFk == NAME_REL_IS_REPLACED_SYNONYM_FOR){
213
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.REPLACED_SYNONYM(), citation, microcitation, rule) ;
214
		}else if (relQualifierFk == NAME_REL_HAS_SAME_TYPE_AS){
215
			nameTo.getHomotypicalGroup().merge(nameFrom.getHomotypicalGroup());
216
		}else if (relQualifierFk == NAME_REL_IS_VALIDATION_OF){
217
			nameRelationship = nameTo.addRelationshipToName(nameFrom, NameRelationshipType.VALIDATED_BY_NAME(), citation, microcitation, rule) ;
218
		}else if (relQualifierFk == NAME_REL_IS_LATER_VALIDATION_OF){
219
			nameRelationship = nameTo.addRelationshipToName(nameFrom, NameRelationshipType.LATER_VALIDATED_BY_NAME(), citation, microcitation, rule) ;
220
		}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 ){
221
			boolean isRejectedType = (relQualifierFk == NAME_REL_IS_REJECTED_TYPE_OF);
222
			boolean isConservedType = (relQualifierFk == NAME_REL_IS_CONSERVED_TYPE_OF);
223
			boolean isLectoType = (relQualifierFk == NAME_REL_IS_LECTOTYPE_OF);
224
			boolean isNotDesignated = (relQualifierFk == NAME_REL_TYPE_NOT_DESIGNATED);
225
			
226
			NameTypeDesignationStatus status = null;
227
			String originalNameString = null;
228
			//TODO addToAllNames true or false?
229
			boolean addToAllNames = false;
230
			if (config.getNameTypeDesignationStatusMethod() != null){
231
				Method method = config.getNameTypeDesignationStatusMethod();
232
				method.setAccessible(true);
233
				try {
234
					status = (NameTypeDesignationStatus)method.invoke(null, notes);
235
					nameRelationship = nameTo.addNameTypeDesignation(nameFrom, citation, microcitation, originalNameString, status, addToAllNames);
236
				} catch (Exception e) {
237
					throw new RuntimeException(e);
238
				}
239
			}else{
240
				if (isLectoType){
241
					status = NameTypeDesignationStatus.LECTOTYPE();
242
				}
243
				nameRelationship = nameTo.addNameTypeDesignation(nameFrom, citation, microcitation, originalNameString, status, isRejectedType, isConservedType, /*isLectoType,*/ isNotDesignated, addToAllNames);
244
			}
245
			
246
		}else if (relQualifierFk == NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF){
247
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.ORTHOGRAPHIC_VARIANT(), citation, microcitation, rule) ;
248
		}else if (relQualifierFk == NAME_REL_IS_ALTERNATIVE_NAME_FOR){
249
			nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.ALTERNATIVE_NAME(), citation, microcitation, rule) ;
250
		}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){
251
			//HybridRelationships
252
			if (! (nameTo instanceof NonViralName ) || ! (nameFrom instanceof NonViralName)){
253
				logger.warn("HybridrelationshipNames ("+name1Id +"," + name2Id +") must be of type NonViralNameName but are not");
254
				success = false;
255
			}
256
			try {
257
				HybridRelationshipType hybridRelType = BerlinModelTransformer.relNameId2HybridRel(relQualifierFk);
258
				BotanicalName parent = (BotanicalName)nameFrom;
259
				BotanicalName child = (BotanicalName)nameTo;
260
				
261
				nameRelationship = parent.addHybridChild(child, hybridRelType, rule);
262
				
263
			} catch (UnknownCdmTypeException e) {
264
				logger.warn(e);
265
				success = false;
266
			}
267
		}else {
268
			//TODO
269
			Method method = config.getNamerelationshipTypeMethod();
270
			if (method != null){
271
				try {
272
					method.invoke(null, relQualifierFk, nameTo, nameFrom);
273
				} catch (Exception e) {
274
					logger.error(e.getMessage());
275
					logger.warn("NameRelationship could not be imported");
276
					success = false;
277
				} 
278
			}else{
279
				logger.warn("NameRelationShipType " + relQualifierFk + " not yet implemented");
280
				success = false;
281
			}
282
		}
283
		doNotes(nameRelationship, notes);
284
		return success;
285
	}
286

    
287
	@Override
288
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
289
		String nameSpace;
290
		Class<?> cdmClass;
291
		Set<String> idSet;
292
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
293
		
294
		try{
295
			Set<String> nameIdSet = new HashSet<String>();
296
			Set<String> referenceIdSet = new HashSet<String>();
297
			Set<String> refDetailIdSet = new HashSet<String>();
298
			while (rs.next()){
299
				handleForeignKey(rs, nameIdSet, "name1Id");
300
				handleForeignKey(rs, nameIdSet, "name2Id");
301
				handleForeignKey(rs, referenceIdSet, "RefFk");
302
				handleForeignKey(rs, refDetailIdSet, "RefDetailFk");
303
	}
304
	
305
			//name map
306
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
307
			cdmClass = TaxonNameBase.class;
308
			idSet = nameIdSet;
309
			Map<String, Person> objectMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
310
			result.put(nameSpace, objectMap);
311

    
312
			//reference map
313
			nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;
314
			cdmClass = Reference.class;
315
			idSet = referenceIdSet;
316
			Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
317
			result.put(nameSpace, referenceMap);
318
	
319
			//refDetail map
320
			nameSpace = BerlinModelRefDetailImport.REFDETAIL_NAMESPACE;
321
			cdmClass = Reference.class;
322
			idSet = refDetailIdSet;
323
			Map<String, Reference> refDetailMap= (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
324
			result.put(nameSpace, refDetailMap);
325

    
326
		} catch (SQLException e) {
327
			throw new RuntimeException(e);
328
				}
329
		return result;
330
	}
331
				
332
	/* (non-Javadoc)
333
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
334
	 */
335
	@Override
336
	protected boolean doCheck(BerlinModelImportState state){
337
		IOValidator<BerlinModelImportState> validator = new BerlinModelTaxonNameRelationImportValidator();
338
		return validator.validate(state);
339
	}
340
			
341
	/* (non-Javadoc)
342
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
343
	 */
344
	protected boolean isIgnore(BerlinModelImportState state){
345
		return ! state.getConfig().isDoRelNames();
346
		}
347

    
348
	
349
}
(16-16/21)