Project

General

Profile

Download (12.8 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.T_STATUS_ACCEPTED;
13
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_PARTIAL_SYN;
14
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_PRO_PARTE_SYN;
15
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_SYNONYM;
16
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_UNRESOLVED;
17

    
18
import java.lang.reflect.Method;
19
import java.sql.ResultSet;
20
import java.sql.SQLException;
21
import java.util.HashMap;
22
import java.util.HashSet;
23
import java.util.Map;
24
import java.util.Set;
25
import java.util.UUID;
26

    
27
import org.apache.commons.lang.StringUtils;
28
import org.apache.log4j.Logger;
29
import org.springframework.stereotype.Component;
30

    
31
import eu.etaxonomy.cdm.common.CdmUtils;
32
import eu.etaxonomy.cdm.database.update.DatabaseTypeNotSupportedException;
33
import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
34
import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelTaxonImportValidator;
35
import eu.etaxonomy.cdm.io.common.IOValidator;
36
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
37
import eu.etaxonomy.cdm.model.agent.Person;
38
import eu.etaxonomy.cdm.model.common.CdmBase;
39
import eu.etaxonomy.cdm.model.common.Extension;
40
import eu.etaxonomy.cdm.model.common.ExtensionType;
41
import eu.etaxonomy.cdm.model.common.Marker;
42
import eu.etaxonomy.cdm.model.common.MarkerType;
43
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
44
import eu.etaxonomy.cdm.model.reference.Reference;
45
import eu.etaxonomy.cdm.model.taxon.Synonym;
46
import eu.etaxonomy.cdm.model.taxon.Taxon;
47
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
48

    
49

    
50
/**
51
 * @author a.mueller
52
 * @created 20.03.2008
53
 * @version 1.0
54
 */
55
@Component
56
public class BerlinModelTaxonImport  extends BerlinModelImportBase {
57
	private static final Logger logger = Logger.getLogger(BerlinModelTaxonImport.class);
58
	
59
	public static final String NAMESPACE = "Taxon";
60

    
61
	private static final String pluralString = "Taxa";
62
	private static final String dbTableName = "PTaxon";
63
	
64
	/**
65
	 * How should the publish flag in table PTaxon be interpreted
66
	 * NO_MARKER: No marker is set
67
	 * ONLY_FALSE: 
68
	 */
69
	public enum PublishMarkerChooser{
70
		NO_MARKER,
71
		ONLY_FALSE,
72
		ONLY_TRUE,
73
		ALL;
74
		
75
		boolean doMark(boolean value){
76
			if (value == true){
77
				return this == ALL || this == ONLY_TRUE;
78
			}else{
79
				return this == ALL || this == ONLY_FALSE;
80
			}
81
		}
82
	}
83
	
84
	public BerlinModelTaxonImport(){
85
		super(dbTableName, pluralString);
86
	}
87
	
88
	@Override
89
	protected String getIdQuery(BerlinModelImportState state) {
90
		String sqlSelect = " SELECT RIdentifier";
91
		String taxonTable = state.getConfig().getTaxonTable();
92
		String sqlFrom = String.format(" FROM %s ", taxonTable);
93
		String sqlWhere = "";
94
		
95
		String sql = sqlSelect + " " + sqlFrom + " " + sqlWhere ;
96
		return sql;
97
	}
98

    
99
	@Override
100
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
101
		String sqlSelect = " SELECT pt.*  ";
102
		String sqlFrom = " FROM PTaxon pt "; 
103
		if (isEuroMed(config) ){
104
			sqlFrom = " FROM PTaxon AS pt " + 
105
							" INNER JOIN v_cdm_exp_taxaAll AS em ON pt.RIdentifier = em.RIdentifier " +
106
							" LEFT OUTER JOIN Reference r ON pt.LastScrutinyFk = r.RefId ";
107
			sqlSelect += " , em.MA, r.RefCache as LastScrutiny ";
108
		}
109
		
110
		
111
		String sqlWhere = " WHERE ( pt.RIdentifier IN (" + ID_LIST_TOKEN + ") )";
112
		
113
		String strRecordQuery =sqlSelect + " " + sqlFrom + " " + sqlWhere ;
114
//			" SELECT * " + 
115
//			" FROM PTaxon " + state.getConfig().getTaxonTable();
116
//			" WHERE ( RIdentifier IN (" + ID_LIST_TOKEN + ") )";
117
		return strRecordQuery;
118
	}
119
	
120
	private boolean isEuroMed(BerlinModelImportConfigurator config) {
121
		return config.getTaxonTable().trim().equals("v_cdm_exp_taxaAll");
122
	}
123

    
124

    
125

    
126
	/* (non-Javadoc)
127
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
128
	 */
129
	@Override
130
	protected boolean doCheck(BerlinModelImportState state){
131
		IOValidator<BerlinModelImportState> validator = new BerlinModelTaxonImportValidator();
132
		return validator.validate(state);
133
	}
134

    
135
	/* (non-Javadoc)
136
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
137
	 */
138
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
139
		boolean success = true ;
140
		
141
		BerlinModelImportConfigurator config = state.getConfig();
142
		Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();
143
		Map<String, TaxonNameBase> taxonNameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
144
		Map<String, Reference> refMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
145
		
146
		ResultSet rs = partitioner.getResultSet();
147
		try{
148
			boolean publishFlagExists = state.getConfig().getSource().checkColumnExists("PTaxon", "PublishFlag");
149
			boolean isEuroMed = isEuroMed(state.getConfig());
150
			while (rs.next()){
151

    
152
			//	if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("PTaxa handled: " + (i-1));}
153
				
154
				//create TaxonName element
155
				int taxonId = rs.getInt("RIdentifier");
156
				int statusFk = rs.getInt("statusFk");
157
				
158
				int nameFk = rs.getInt("PTNameFk");
159
				int refFkInt = rs.getInt("PTRefFk");
160
				String doubtful = rs.getString("DoubtfulFlag");
161
				String uuid = null;
162
				if (resultSetHasColumn(rs,"UUID")){
163
					uuid = rs.getString("UUID");
164
				}
165
				
166
				TaxonNameBase<?,?> taxonName = null;
167
				taxonName  = taxonNameMap.get(String.valueOf(nameFk));
168
				
169
				Reference<?> reference = null;
170
				String refFk = String.valueOf(refFkInt);
171
				reference = refMap.get(refFk); 
172
					
173
				if(! config.isIgnoreNull()){
174
					if (taxonName == null ){
175
						logger.warn("TaxonName belonging to taxon (RIdentifier = " + taxonId + ") could not be found in store. Taxon will not be imported");
176
						success = false;
177
						continue; //next taxon
178
					}else if (reference == null ){
179
						logger.warn("Reference belonging to taxon could not be found in store. Taxon will not be imported");
180
						success = false;
181
						continue; //next taxon
182
					}
183
				}
184
				TaxonBase<?> taxonBase;
185
				Synonym synonym;
186
				Taxon taxon;
187
				try {
188
					logger.debug(statusFk);
189
					if (statusFk == T_STATUS_ACCEPTED || statusFk == T_STATUS_UNRESOLVED ){
190
						taxon = Taxon.NewInstance(taxonName, reference);
191
						taxonBase = taxon;
192
						if (statusFk == T_STATUS_UNRESOLVED){
193
							taxon.setTaxonStatusUnknown(true);
194
						}
195
					}else if (statusFk == T_STATUS_SYNONYM || statusFk == T_STATUS_PRO_PARTE_SYN || statusFk == T_STATUS_PARTIAL_SYN){
196
						synonym = Synonym.NewInstance(taxonName, reference);
197
						taxonBase = synonym;
198
						if (statusFk == T_STATUS_PRO_PARTE_SYN){
199
							config.addProParteSynonym(synonym);
200
						}
201
						if (statusFk == T_STATUS_PARTIAL_SYN){
202
							config.addPartialSynonym(synonym);
203
						}
204
					}else{
205
						logger.warn("TaxonStatus " + statusFk + " not yet implemented. Taxon (RIdentifier = " + taxonId + ") left out.");
206
						success = false;
207
						continue;
208
					}
209
					if (uuid != null){
210
						taxonBase.setUuid(UUID.fromString(uuid));
211
					}
212
					
213
					//douptful
214
					if (doubtful.equals("a")){
215
						taxonBase.setDoubtful(false);
216
					}else if(doubtful.equals("d")){
217
						taxonBase.setDoubtful(true);
218
					}else if(doubtful.equals("i")){
219
						taxonBase.setDoubtful(false);
220
						logger.warn("Doubtful = i (inactivated) does not exist in CDM. Doubtful set to false. RIdentifier: " + taxonId);
221
					}
222
					
223
					//detail
224
					String detail = rs.getString("Detail");
225
					if (StringUtils.isNotBlank(detail)){
226
						ExtensionType detailExtensionType = getExtensionType(state, BerlinModelTransformer.DETAIL_EXT_UUID, "micro reference","micro reference","micro ref.");
227
						Extension.NewInstance(taxonBase, detail, detailExtensionType);
228
					}
229
					//idInSource
230
					String idInSource = rs.getString("IdInSource");
231
					if (StringUtils.isNotBlank(idInSource)){
232
						ExtensionType detailExtensionType = getExtensionType(state, BerlinModelTransformer.ID_IN_SOURCE_EXT_UUID, "Berlin Model IdInSource","Berlin Model IdInSource","BM source id");
233
						Extension.NewInstance(taxonBase, idInSource, detailExtensionType);
234
					}
235
					//namePhrase
236
					String namePhrase = rs.getString("NamePhrase");
237
					if (StringUtils.isNotBlank(namePhrase)){
238
						taxonBase.setAppendedPhrase(namePhrase);
239
					}
240
					//useNameCache
241
					Boolean useNameCacheFlag = rs.getBoolean("UseNameCacheFlag");
242
					if (useNameCacheFlag){
243
						taxonBase.setUseNameCache(true);
244
					}
245
					//publisheFlag
246
					if (publishFlagExists){
247
						Boolean publishFlag = rs.getBoolean("PublishFlag");
248
						Boolean misapplied = false;
249
						if (isEuroMed){
250
							misapplied = rs.getBoolean("MA");
251
						}
252
						
253
						if ( ! misapplied){
254
							logger.error("Publish Flag for synonyms not yet handled correctly");
255
//							taxonBase.setPublish(publishFlag);
256
						}
257
					}
258
					
259
					//
260
					if (resultSetHasColumn(rs,"LastScrutiny")){
261
						String lastScrutiny = rs.getString("LastScrutiny");
262
						ExtensionType extensionTypeSpeciesExpert = getExtensionType(state, BerlinModelTransformer.uuidSpeciesExpertName, "Species Expert", "Species Expert", "Species Expert");
263
						taxonBase.addExtension(lastScrutiny, extensionTypeSpeciesExpert);
264
						ExtensionType extensionTypeExpert = getExtensionType(state, BerlinModelTransformer.uuidExpertName, "Expert", "Expert for a taxonomic group", "Expert");
265
						taxonBase.addExtension(lastScrutiny, extensionTypeExpert);
266
					}
267
					
268
					//Notes
269
					doIdCreatedUpdatedNotes(state, taxonBase, rs, taxonId, NAMESPACE);
270
					
271
					//external url
272
					if (config.getMakeUrlForTaxon() != null){
273
						Method urlMethod = config.getMakeUrlForTaxon();
274
						urlMethod.invoke(null, taxonBase, rs);
275
					}
276
					
277
					partitioner.startDoSave();
278
					taxaToSave.add(taxonBase);
279
				} catch (Exception e) {
280
					logger.warn("An exception (" +e.getMessage()+") occurred when creating taxon with id " + taxonId + ". Taxon could not be saved.");
281
					success = false;
282
				}
283
			}
284
		} catch (SQLException e) {
285
			logger.error("SQLException:" +  e);
286
			return false;
287
		} catch (DatabaseTypeNotSupportedException e) {
288
			logger.error("MethodNotSupportedException:" +  e);
289
			return false;
290
		}
291
	
292
			
293
		//	logger.info( i + " names handled");
294
		getTaxonService().save(taxaToSave);
295
		return success;
296
	}
297

    
298
	/* (non-Javadoc)
299
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
300
	 */
301
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
302
		String nameSpace;
303
		Class<?> cdmClass;
304
		Set<String> idSet;
305
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
306
		
307
		try{
308
			Set<String> nameIdSet = new HashSet<String>();
309
			Set<String> referenceIdSet = new HashSet<String>();
310
			while (rs.next()){
311
				handleForeignKey(rs, nameIdSet, "PTNameFk");
312
				handleForeignKey(rs, referenceIdSet, "PTRefFk");
313
			}
314
			
315
			//name map
316
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
317
			cdmClass = TaxonNameBase.class;
318
			idSet = nameIdSet;
319
			Map<String, Person> nameMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
320
			result.put(nameSpace, nameMap);
321

    
322
			//reference map
323
			nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;
324
			cdmClass = Reference.class;
325
			idSet = referenceIdSet;
326
			Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
327
			result.put(nameSpace, referenceMap);
328

    
329
		} catch (SQLException e) {
330
			throw new RuntimeException(e);
331
		}
332
		return result;
333
	}
334
	
335
	
336
	/* (non-Javadoc)
337
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
338
	 */
339
	@Override
340
	protected String getTableName() {
341
		return dbTableName;
342
	}
343
	
344
	/* (non-Javadoc)
345
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
346
	 */
347
	@Override
348
	public String getPluralString() {
349
		return pluralString;
350
	}
351
	
352
	/* (non-Javadoc)
353
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
354
	 */
355
	protected boolean isIgnore(BerlinModelImportState state){
356
		return ! state.getConfig().isDoTaxa();
357
	}
358

    
359

    
360

    
361
}
(14-14/21)