Project

General

Profile

Download (15.3 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

    
79
	@Override
80
	protected String getIdQuery(BerlinModelImportState state) {
81
		if (StringUtils.isNotBlank(state.getConfig().getNameIdTable())){
82
			String result = super.getIdQuery(state);
83
			result += " WHERE nameFk1 IN (SELECT NameId FROM %s) OR ";
84
			result += "       nameFk2 IN (SELECT NameId FROM %s)";
85
			result = String.format(result, state.getConfig().getNameIdTable(),state.getConfig().getNameIdTable() );
86
			return result;
87
		}else{
88
			return super.getIdQuery(state);
89
		}
90
	}
91
	
92
	
93
	/* (non-Javadoc)
94
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
95
	 */
96
	@Override
97
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
98
			String strQuery = 
99
					" SELECT RelName.*, FromName.nameId as name1Id, ToName.nameId as name2Id, RefDetail.Details " + 
100
					" FROM Name as FromName INNER JOIN " +
101
                      	" RelName ON FromName.NameId = RelName.NameFk1 INNER JOIN " +
102
                      	" Name AS ToName ON RelName.NameFk2 = ToName.NameId LEFT OUTER JOIN "+
103
                      	" RefDetail ON RelName.RefDetailFK = RefDetail.RefDetailId " + 
104
            " WHERE (RelNameId IN ("+ID_LIST_TOKEN +"))";
105
		return strQuery;
106
	}
107

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

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

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

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

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

    
352
	
353
}
(16-16/21)