Project

General

Profile

Download (14.7 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.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.HybridRelationshipType;
51
import eu.etaxonomy.cdm.model.name.IBotanicalName;
52
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
53
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
54
import eu.etaxonomy.cdm.model.name.TaxonName;
55
import eu.etaxonomy.cdm.model.reference.Reference;
56
import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
57

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

    
65
    private static final long serialVersionUID = 1197601822023101796L;
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<TaxonName> nameToSave = new HashSet<>();
109
		Map<String, TaxonName> nameMap = 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
				TaxonName nameFrom = nameMap.get(String.valueOf(name1Id));
130
				TaxonName 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, TaxonName nameFrom,
203
				TaxonName 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
			try {
253
				HybridRelationshipType hybridRelType = BerlinModelTransformer.relNameId2HybridRel(relQualifierFk);
254
				IBotanicalName parent = nameFrom;
255
				IBotanicalName child = nameTo;
256

    
257
				nameRelationship = parent.addHybridChild(child, hybridRelType, rule);
258

    
259
			} catch (UnknownCdmTypeException e) {
260
				logger.warn(e);
261
				success = false;
262
			}
263
		}else {
264
			//TODO
265
			Method method = config.getNamerelationshipTypeMethod();
266
			if (method != null){
267
				try {
268
					method.invoke(null, relQualifierFk, nameTo, nameFrom);
269
				} catch (Exception e) {
270
					logger.error(e.getMessage());
271
					logger.warn("NameRelationship could not be imported");
272
					success = false;
273
				}
274
			}else{
275
				logger.warn("NameRelationShipType " + relQualifierFk + " not yet implemented");
276
				success = false;
277
			}
278
		}
279
		doNotes(nameRelationship, notes);
280
		return success;
281
	}
282

    
283
	@Override
284
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
285
		String nameSpace;
286
		Class<?> cdmClass;
287
		Set<String> idSet;
288
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
289

    
290
		try{
291
			Set<String> nameIdSet = new HashSet<String>();
292
			Set<String> referenceIdSet = new HashSet<String>();
293
			Set<String> refDetailIdSet = new HashSet<String>();
294
			while (rs.next()){
295
				handleForeignKey(rs, nameIdSet, "name1Id");
296
				handleForeignKey(rs, nameIdSet, "name2Id");
297
				handleForeignKey(rs, referenceIdSet, "RefFk");
298
				handleForeignKey(rs, refDetailIdSet, "RefDetailFk");
299
	}
300

    
301
			//name map
302
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
303
			cdmClass = TaxonName.class;
304
			idSet = nameIdSet;
305
			Map<String, Person> objectMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
306
			result.put(nameSpace, objectMap);
307

    
308
			//reference map
309
			nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;
310
			cdmClass = Reference.class;
311
			idSet = referenceIdSet;
312
			Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
313
			result.put(nameSpace, referenceMap);
314

    
315
			//refDetail map
316
			nameSpace = BerlinModelRefDetailImport.REFDETAIL_NAMESPACE;
317
			cdmClass = Reference.class;
318
			idSet = refDetailIdSet;
319
			Map<String, Reference> refDetailMap= (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
320
			result.put(nameSpace, refDetailMap);
321

    
322
		} catch (SQLException e) {
323
			throw new RuntimeException(e);
324
				}
325
		return result;
326
	}
327

    
328
	/* (non-Javadoc)
329
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
330
	 */
331
	@Override
332
	protected boolean doCheck(BerlinModelImportState state){
333
		IOValidator<BerlinModelImportState> validator = new BerlinModelTaxonNameRelationImportValidator();
334
		return validator.validate(state);
335
	}
336

    
337
	/* (non-Javadoc)
338
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
339
	 */
340
	@Override
341
    protected boolean isIgnore(BerlinModelImportState state){
342
		return ! state.getConfig().isDoRelNames();
343
		}
344

    
345

    
346
}
(16-16/21)