Project

General

Profile

Download (11.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.wp6;
11

    
12
import java.util.HashMap;
13
import java.util.List;
14
import java.util.Map;
15
import java.util.Set;
16
import java.util.UUID;
17

    
18
import org.apache.commons.lang.StringUtils;
19
import org.apache.log4j.Logger;
20
import org.hibernate.criterion.Criterion;
21
import org.springframework.stereotype.Component;
22

    
23
import eu.etaxonomy.cdm.common.CdmUtils;
24
import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;
25
import eu.etaxonomy.cdm.io.excel.common.ExcelImportBase;
26
import eu.etaxonomy.cdm.io.excel.common.ExcelRowBase;
27
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
28
import eu.etaxonomy.cdm.model.common.Language;
29
import eu.etaxonomy.cdm.model.common.OriginalSourceType;
30
import eu.etaxonomy.cdm.model.common.TermType;
31
import eu.etaxonomy.cdm.model.common.TermVocabulary;
32
import eu.etaxonomy.cdm.model.description.CommonTaxonName;
33
import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
34
import eu.etaxonomy.cdm.model.description.TaxonDescription;
35
import eu.etaxonomy.cdm.model.location.Country;
36
import eu.etaxonomy.cdm.model.location.NamedArea;
37
import eu.etaxonomy.cdm.model.reference.Reference;
38
import eu.etaxonomy.cdm.model.taxon.Taxon;
39
import eu.etaxonomy.cdm.persistence.query.OrderHint;
40

    
41
/**
42
 * @author a.babadshanjan
43
 * @created 08.01.2009
44
 */
45

    
46
@Component
47
public class CommonNameExcelImport
48
            extends ExcelImportBase<CichorieaeCommonNameImportState, CommonNameImportConfigurator, ExcelRowBase> {
49

    
50
    private static final long serialVersionUID = 747044451715401750L;
51
    private static final Logger logger = Logger.getLogger(CommonNameExcelImport.class);
52

    
53
	protected static final String SPECIES_COLUMN = "Art";
54
	protected static final String COMMON_NAME_COLUMN = "common name";
55
	protected static final String REFERENCE_COLUMN = "Literaturnummer";
56
	protected static final String DISTIRBUTION_COLUMN = "Verbreitung";
57
	protected static final String AREA_COLUMN = "Vorschlag Bezeichnung L�nder/Regionen";
58

    
59
	private Map<String, NamedArea> areaStore = new HashMap<String, NamedArea>();
60
	private Map<String, Language> languageStore = new HashMap<String, Language>();
61

    
62

    
63
	@Override
64
	protected boolean isIgnore(CichorieaeCommonNameImportState state) {
65
		return false;
66
	}
67

    
68
	@Override
69
	protected boolean doCheck(CichorieaeCommonNameImportState state) {
70
		logger.warn("DoCheck not yet implemented for CommonNameExcelImport");
71
		return true;
72
	}
73

    
74

    
75
	@Override
76
    protected void analyzeRecord(HashMap<String, String> record, CichorieaeCommonNameImportState state) {
77
		Set<String> keys = record.keySet();
78

    
79
    	CommonNameRow row = new CommonNameRow();
80
    	state.setCommonNameRow(row);
81

    
82
    	for (String originalKey: keys) {
83
    		String indexedKey = CdmUtils.removeDuplicateWhitespace(originalKey.trim()).toString();
84
    		String[] split = indexedKey.split("_");
85
    		String key = split[0];
86
    		if (split.length > 1){
87
    			String indexString = split[1];
88
    			try {
89
    				Integer.valueOf(indexString);
90
				} catch (NumberFormatException e) {
91
					String message = "Index must be integer";
92
					logger.error(message);
93
					continue;
94
				}
95
    		}
96

    
97
    		String value = record.get(indexedKey);
98
    		if (! StringUtils.isBlank(value)) {
99
    			if (logger.isDebugEnabled()) { logger.debug(key + ": " + value); }
100
        		value = CdmUtils.removeDuplicateWhitespace(value.trim()).toString();
101
    		}else{
102
    			continue;
103
    		}
104

    
105

    
106
    		if (key.equalsIgnoreCase(SPECIES_COLUMN)) {
107
    			row.parseSpecies(value);
108

    
109
			} else if(key.equalsIgnoreCase(COMMON_NAME_COLUMN)) {
110
				row.setCommonNames(value);
111

    
112
			} else if(key.equalsIgnoreCase(REFERENCE_COLUMN)) {
113
				row.setReference(value);
114
			} else if(key.equalsIgnoreCase(DISTIRBUTION_COLUMN)) {
115
				//do nothing
116

    
117
			} else if(key.equalsIgnoreCase(AREA_COLUMN)) {
118
				row.setArea(value);
119
 			} else {
120
				state.setUnsuccessfull();
121
				logger.error("Unexpected column header " + key);
122
			}
123
    	}
124
    	return;
125
    }
126

    
127

    
128
	/**
129
	 *  Stores taxa records in DB
130
	 */
131
	@Override
132
    protected void firstPass(CichorieaeCommonNameImportState state) {
133

    
134
		CommonNameRow taxonLight = state.getCommonNameRow();
135
		//species name
136
		String speciesStr = taxonLight.getSpecies();
137
		TaxonDescription taxonDesc = getTaxon(state, speciesStr);
138
		Reference ref = getReference(state, taxonLight);
139

    
140
		NamedArea area = getArea(state, taxonLight.getArea());
141

    
142
		makeCommonNames(state, taxonLight.getCommonNames(), taxonDesc, ref, area, taxonLight.getNameUsedInSource());
143

    
144
//		OLD
145
//		TaxonNameBase nameUsedInSource = getNameUsedInSource(state, taxonLight.getNameUsedInSource());
146

    
147
		getTaxonService().save(taxonDesc.getTaxon());
148
		return;
149
    }
150

    
151

    
152

    
153
	private Map<String, Reference> referenceStore = new HashMap<String, Reference>();
154
	private Reference getReference(CichorieaeCommonNameImportState state, CommonNameRow taxonLight) {
155
		String reference = taxonLight.getReference();
156
		Reference result = referenceStore.get(reference);
157
		if (result == null){
158
			result = (Reference)getCommonService().getSourcedObjectByIdInSource(Reference.class, reference, "import to Berlin Model");
159
			if (result == null){
160
				logger.warn("Reference not found: " + reference + " for taxon " + taxonLight.getSpecies());
161
//				result = ReferenceFactory.newGeneric();
162
//				result.setTitleCache(reference);
163
			}else{
164
				referenceStore.put(reference, result);
165
			}
166
		}
167
		return result;
168
	}
169

    
170

    
171

    
172
	private NamedArea getArea(CichorieaeCommonNameImportState state, String area) {
173
		NamedArea result;
174
		List<OrderHint> orderHints = null;
175
		List<Criterion> criteria = null;
176
		result = areaStore.get(area);
177

    
178
		if (result == null){
179
			try {
180
				result = state.getTransformer().getNamedAreaByKey(area);
181
			} catch (UndefinedTransformerMethodException e) {
182
				e.printStackTrace();
183
			}
184
			if (result == null){
185
				List<DefinedTermBase> candidates = getTermService().findByTitle(Country.class, area, null, criteria, null, null, orderHints, null).getRecords();
186
				if (candidates.size() == 0){
187
					candidates = getTermService().findByTitle(NamedArea.class, area, null, criteria, null, null, orderHints, null).getRecords();
188
				}
189
				if (candidates.size()>0){
190
					//TODO
191
					result = (NamedArea)candidates.get(0);
192
				}else{
193
					UUID uuidArea;
194
					try {
195
						uuidArea = state.getTransformer().getNamedAreaUuid(area);
196
						if (uuidArea == null){
197
							logger.warn("Area not defined: " + area)  ;
198
						}
199
						result = getNamedArea(state, uuidArea, area, area, null, null, null);
200
					} catch (UndefinedTransformerMethodException e) {
201
						e.printStackTrace();
202
					}
203
					if (result == null){
204
						logger.warn("Area not defined: " + area)  ;
205
					}
206
				}
207
			}
208
			areaStore.put(area, result);
209
		}
210
		return result;
211
	}
212

    
213

    
214
	Map<String, TaxonDescription> taxonStore = new HashMap<String, TaxonDescription>();
215

    
216
	private TaxonDescription getTaxon(CichorieaeCommonNameImportState state, String taxonNameStr) {
217
		TaxonDescription desc;
218
		Taxon taxon;
219

    
220
		if (taxonStore.get(taxonNameStr) != null){
221
			desc = taxonStore.get(taxonNameStr);
222
		}else{
223
			taxon = getTaxonService().findBestMatchingTaxon(taxonNameStr);
224
//			TaxonNameBase name = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
225
//			name.setTitleCache(taxonNameStr, true);
226
//
227
//			result = Taxon.NewInstance(name, null);
228
			if (taxon == null){
229
				logger.warn("Taxon not found: " +  taxonNameStr);
230
				desc = null;
231
			}else{
232
				desc = getNewDescription(state, taxon);
233
				taxonStore.put(taxonNameStr, desc);
234
			}
235
		}
236
		return desc;
237
	}
238

    
239
	private TaxonDescription getNewDescription(CichorieaeCommonNameImportState state, Taxon taxon) {
240
		Reference excelRef = state.getConfig().getSourceReference();
241
		TaxonDescription desc = TaxonDescription.NewInstance(taxon, false);
242
		desc.setTitleCache("Common Names Excel import", true);
243
		desc.addSource(OriginalSourceType.Import, null, null, excelRef, null);
244
		return desc;
245
	}
246

    
247

    
248
	private void makeCommonNames(CichorieaeCommonNameImportState state, Map<String, List<String>> commonNamesMap, TaxonDescription description, Reference ref, NamedArea area, String nameUsedInSource) {
249
		//Common Names
250
//		TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);
251
		for (String languageKey : commonNamesMap.keySet()){
252
			Language language = getLanguage(state, languageKey);
253
			List<String> commonNamesList = commonNamesMap.get(languageKey);
254
			for (String strCommonName : commonNamesList){
255
				CommonTaxonName commonName = CommonTaxonName.NewInstance(strCommonName, language, area);
256
				if (ref != null || StringUtils.isNotBlank(nameUsedInSource)){
257
					DescriptionElementSource source = DescriptionElementSource.NewPrimarySourceInstance(ref, null);
258
					source.setOriginalNameString(nameUsedInSource);
259
					commonName.addSource(source);
260
				}else{
261
					logger.debug("No reference defined");
262
				}
263
				description.addElement(commonName);
264
			}
265
		}
266
	}
267

    
268
	private Language getLanguage(CichorieaeCommonNameImportState state, String languageKey) {
269
		if (languageKey.equals("*")){
270
			return null;
271
		}
272
		Language result;
273
		languageKey = languageKey.replace(", no ISO-Code", "");
274
		result = languageStore.get(languageKey);
275
		if (result == null){
276
			try{
277
				if (languageKey.length()<4){
278
					try {
279
						result = getTermService().getLanguageByIso(languageKey);
280
					} catch (Exception e) {
281
						// TODO Auto-generated catch block
282
						e.printStackTrace();
283
					}
284
				}else{
285
					UUID uuid = state.getTransformer().getLanguageUuid(languageKey);
286
					result = (Language)getTermService().find(uuid);
287
				}
288
				if (result == null){
289
					result = state.getTransformer().getLanguageByKey(languageKey);
290
					if (result == null){
291
						UUID uuidLanguage;
292
						uuidLanguage = state.getTransformer().getLanguageUuid(languageKey);
293
						if (uuidLanguage == null){
294
							logger.warn("Language not defined: " + languageKey)  ;
295
						}
296
						result = getLanguage(state, uuidLanguage, languageKey, languageKey, null);
297
						if (result == null){
298
							logger.warn("Language not defined: " + languageKey)  ;
299
						}
300
					}else if (result.getId() == 0){
301
//						UUID uuidLanguageVoc = UUID.fromString("45ac7043-7f5e-4f37-92f2-3874aaaef2de");
302
						UUID uuidLanguageVoc = UUID.fromString("434cea89-9052-4567-b2db-ff77f42e9084");
303
						TermVocabulary<Language> voc = getVocabulary(TermType.Language, uuidLanguageVoc, "User Defined Languages", "User Defined Languages", null, null, false, result);
304
//						TermVocabulary<Language> voc = getVocabularyService().find(uuidLanguageVoc);
305
						voc.addTerm(result);
306
						getTermService().saveOrUpdate(result);
307
						state.putLanguage(result);
308
					}
309
				}
310
				languageStore.put(languageKey, result);
311
			} catch (UndefinedTransformerMethodException e) {
312
				e.printStackTrace();
313
			}
314

    
315
		}
316
		return result;
317
	}
318

    
319

    
320
	/**
321
	 *  Stores parent-child, synonym and common name relationships
322
	 */
323
	@Override
324
    protected void secondPass(CichorieaeCommonNameImportState state) {
325
		//no second pass
326
		return;
327
	}
328

    
329

    
330

    
331
//	private TaxonNameBase getNameUsedInSource(CichorieaeCommonNameImportState state, String nameUsedInSource) {
332
//		if (StringUtils.isBlank(nameUsedInSource)){
333
//			return null;
334
//		}else{
335
//			Pager<TaxonNameBase> list = getNameService().findByName(BotanicalName.class, nameUsedInSource, null, null, null, null, null, null);
336
//			if (list.getCount() > 0){
337
//				return list.getRecords().get(0);
338
//			}else{
339
//				return null;
340
//			}
341
//		}
342
//
343
//	}
344

    
345

    
346

    
347
}
(3-3/6)