Project

General

Profile

Download (15 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.io.berlinModel;
2

    
3
import java.sql.ResultSet;
4
import java.sql.SQLException;
5
import java.util.Map;
6

    
7
import org.apache.log4j.Logger;
8

    
9
import eu.etaxonomy.cdm.api.application.CdmApplicationController;
10
import eu.etaxonomy.cdm.api.service.INameService;
11
import eu.etaxonomy.cdm.common.CdmUtils;
12
import eu.etaxonomy.cdm.io.common.ICdmIO;
13
import eu.etaxonomy.cdm.io.common.IImportConfigurator;
14
import eu.etaxonomy.cdm.io.common.ImportHelper;
15
import eu.etaxonomy.cdm.io.common.MapWrapper;
16
import eu.etaxonomy.cdm.io.common.Source;
17
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
18
import eu.etaxonomy.cdm.model.common.CdmBase;
19
import eu.etaxonomy.cdm.model.common.Marker;
20
import eu.etaxonomy.cdm.model.common.MarkerType;
21
import eu.etaxonomy.cdm.model.name.BotanicalName;
22
import eu.etaxonomy.cdm.model.name.CultivarPlantName;
23
import eu.etaxonomy.cdm.model.name.NonViralName;
24
import eu.etaxonomy.cdm.model.name.Rank;
25
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
26
import eu.etaxonomy.cdm.model.name.ZoologicalName;
27
import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
28
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
29
import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
30

    
31

    
32
public class BerlinModelTaxonNameIO extends BerlinModelIOBase {
33
	private static final Logger logger = Logger.getLogger(BerlinModelTaxonNameIO.class);
34

    
35
	private static int modCount = 5000;
36

    
37
	public BerlinModelTaxonNameIO(){
38
		super();
39
	}
40
	
41
	/* (non-Javadoc)
42
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
43
	 */
44
	@Override
45
	protected boolean doCheck(IImportConfigurator config){
46
		boolean result = true;
47
		logger.warn("Checking for TaxonNames not yet implemented");
48
		//result &= checkArticlesWithoutJournal(bmiConfig);
49
		//result &= checkPartOfJournal(bmiConfig);
50
		
51
		return result;
52
	}
53
	
54
	/* (non-Javadoc)
55
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)
56
	 */
57
	@Override
58
	protected boolean doInvoke(IImportConfigurator config, 
59
			Map<String, MapWrapper<? extends CdmBase>> stores){				
60
			
61
		MapWrapper<TaxonNameBase> taxonNameMap = (MapWrapper<TaxonNameBase>)stores.get(ICdmIO.TAXONNAME_STORE);
62
		MapWrapper<TeamOrPersonBase> authorMap = (MapWrapper<TeamOrPersonBase>)stores.get(ICdmIO.AUTHOR_STORE);
63
		
64
		BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
65
		Source source = bmiConfig.getSource();
66
		String dbAttrName;
67
		String cdmAttrName;
68
		boolean success = true ;
69
		
70
		logger.info("start makeTaxonNames ...");
71
		INameService nameService = config.getCdmAppController().getNameService();
72
		
73
		try {
74
			
75
			
76
			//get data from database
77
			String strQuery = 
78
					"SELECT Name.* , RefDetail.RefDetailId, RefDetail.RefFk, " +
79
                      		" RefDetail.FullRefCache, RefDetail.FullNomRefCache, RefDetail.PreliminaryFlag AS RefDetailPrelim, RefDetail.Details, " + 
80
                      		" RefDetail.SecondarySources, RefDetail.IdInSource, Rank.RankAbbrev, Rank.Rank " +
81
                    " FROM Name LEFT OUTER JOIN RefDetail ON Name.NomRefDetailFk = RefDetail.RefDetailId AND  " +
82
                    	" Name.NomRefFk = RefDetail.RefFk " +
83
                    	" LEFT OUTER JOIN Rank ON Name.RankFk = Rank.rankID " + 
84
                    " WHERE (1=1) ";
85
					//strQuery += " AND RefDetail.PreliminaryFlag = 1 ";
86
					//strQuery += " AND Name.Created_When > '03.03.2004' ";
87
			
88
			ResultSet rs = source.getResultSet(strQuery) ;
89
			String namespace = "Name";
90
			
91
			int i = 0;
92
			//for each reference
93
			while (rs.next()){
94
				
95
				if ((i++ % modCount) == 0 && i != 1 ){ logger.info("Names handled: " + (i-1));}
96
				
97
				//create TaxonName element
98
				int nameId = rs.getInt("nameId");
99
				Object authorFk = rs.getObject("AuthorTeamFk");
100
				Object exAuthorFk = rs.getObject("ExAuthorTeamFk");
101
				Object basAuthorFk = rs.getObject("BasAuthorTeamFk");
102
				Object exBasAuthorFk = rs.getObject("ExBasAuthorTeamFk");
103
				
104
				try {
105
					boolean useUnknownRank = true;
106
					Rank rank = BerlinModelTransformer.rankId2Rank(rs, useUnknownRank);
107
					
108
					TaxonNameBase taxonNameBase;
109
					if (bmiConfig.getNomenclaturalCode() != null){
110
						taxonNameBase = bmiConfig.getNomenclaturalCode().getNewTaxonNameInstance(rank);
111
					}else{
112
						taxonNameBase = NonViralName.NewInstance(rank);
113
					}
114
					
115
					if (rank == null){
116
						//TODO rank should never be null or a more sophisticated algorithm has to be implemented for genus/supraGenericName
117
						logger.warn("Rank is null. Genus epethiton was imported. May be wrong");
118
					}
119
					if (rank != null && rank.isSupraGeneric()){
120
						dbAttrName = "supraGenericName";
121
					}else{
122
						dbAttrName = "genus";
123
					}
124
					cdmAttrName = "genusOrUninomial";
125
					success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
126
					
127
					dbAttrName = "genusSubdivisionEpi";
128
					cdmAttrName = "infraGenericEpithet";
129
					success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
130
					
131
					dbAttrName = "speciesEpi";
132
					cdmAttrName = "specificEpithet";
133
					success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
134
					
135

    
136
					dbAttrName = "infraSpeciesEpi";
137
					cdmAttrName = "infraSpecificEpithet";
138
					success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
139
					
140
					dbAttrName = "unnamedNamePhrase";
141
					cdmAttrName = "appendedPhrase";
142
					success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
143
					
144
					dbAttrName = "preliminaryFlag";
145
					cdmAttrName = "XX" + "protectedTitleCache";
146
					success &= ImportHelper.addBooleanValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
147
					
148
					//Details
149
					dbAttrName = "details";
150
					cdmAttrName = "nomenclaturalMicroReference";
151
					success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
152

    
153
					//nomRef
154
					success &= makeNomenclaturalReference(bmiConfig, taxonNameBase, nameId, rs, stores);
155

    
156
					//created, notes
157
					success &= doIdCreatedUpdatedNotes(bmiConfig, taxonNameBase, rs, nameId, namespace);
158
					
159
					//Marker
160
					boolean flag = true;
161
					Marker marker = Marker.NewInstance(MarkerType.TO_BE_CHECKED() ,flag);
162
					taxonNameBase.addMarker(marker);
163

    
164
					//NonViralName
165
					if (taxonNameBase instanceof NonViralName){
166
						NonViralName nonViralName = (NonViralName)taxonNameBase;
167
						
168
						//authorTeams
169
						if (authorMap != null ){
170
							boolean ignoreNull = config.isIgnoreNull();
171
							nonViralName.setCombinationAuthorTeam(getAuthorTeam(authorMap, authorFk, nameId, ignoreNull));
172
							nonViralName.setExCombinationAuthorTeam(getAuthorTeam(authorMap, exAuthorFk, nameId, ignoreNull));
173
							nonViralName.setBasionymAuthorTeam(getAuthorTeam(authorMap, basAuthorFk, nameId, ignoreNull));
174
							nonViralName.setExBasionymAuthorTeam(getAuthorTeam(authorMap, exBasAuthorFk, nameId, ignoreNull));
175
						}
176
					}//nonviralName
177

    
178
					//zoologicalName
179
					if (taxonNameBase instanceof ZoologicalName){
180
						ZoologicalName zooName = (ZoologicalName)taxonNameBase;
181
						makeZoologialName(rs, zooName, nameId);
182
					}
183
					//botanicalName  
184
					else if (taxonNameBase instanceof BotanicalName){
185
						BotanicalName botName = (BotanicalName)taxonNameBase;
186
						success &= makeBotanicalNamePart(rs, botName) ;
187
						
188
					}
189
					
190
					
191
					//TODO
192
					//Source_Acc
193
					//OrthoProjection
194

    
195
					//TODO
196
					//preliminaryFlag see above
197
					
198
					taxonNameMap.put(nameId, taxonNameBase);
199
					
200
				}
201
				catch (UnknownCdmTypeException e) {
202
					logger.warn("Name with id " + nameId + " has unknown rankId " + " and could not be saved.");
203
					success = false; 
204
				}
205
				
206
			} //while rs.hasNext()
207
			logger.info(i + " names handled");
208
			nameService.saveTaxonNameAll(taxonNameMap.objects());
209
			
210
//			makeNameSpecificData(nameMap);
211

    
212
			logger.info("end makeTaxonNames ...");
213
			return success;
214
		} catch (SQLException e) {
215
			logger.error("SQLException:" +  e);
216
			return false;
217
		}
218

    
219
	}
220
	
221
	private boolean makeZoologialName(ResultSet rs, ZoologicalName zooName, int nameId) 
222
					throws SQLException{
223
		boolean success = true;
224
		//publicationYear
225
		String authorTeamYear = rs.getString("authorTeamYear");
226
		try {
227
			if (! "".equals(CdmUtils.Nz(authorTeamYear).trim())){
228
				Integer publicationYear  = Integer.valueOf(authorTeamYear.trim());
229
				zooName.setPublicationYear(publicationYear);
230
			}
231
		} catch (NumberFormatException e) {
232
			logger.warn("authorTeamYear could not be parsed for taxonName: "+ nameId);
233
		}
234
		//original publication year
235
		String basAuthorTeamYear = rs.getString("basAuthorTeamYear");
236
		try {
237
			if (! "".equals(CdmUtils.Nz(basAuthorTeamYear).trim())){
238
				Integer OriginalPublicationYear  = Integer.valueOf(basAuthorTeamYear.trim());
239
				zooName.setOriginalPublicationYear(OriginalPublicationYear);
240
			}
241
		} catch (NumberFormatException e) {
242
			logger.warn("basAuthorTeamYear could not be parsed for taxonName: "+ nameId);
243
		}
244
		return success;
245
	}
246
	
247
	private boolean makeBotanicalNamePart(ResultSet rs, BotanicalName botanicalName){
248
		boolean success = true;
249
		String dbAttrName;
250
		String cdmAttrName;
251
		
252
		dbAttrName = "HybridFormulaFlag";
253
		cdmAttrName = "isHybridFormula";
254
		success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
255

    
256
		dbAttrName = "MonomHybFlag";
257
		cdmAttrName = "isMonomHybrid";
258
		success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
259

    
260
		dbAttrName = "BinomHybFlag";
261
		cdmAttrName = "isBinomHybrid";
262
		success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
263

    
264
		dbAttrName = "TrinomHybFlag";
265
		cdmAttrName = "isTrinomHybrid";
266
		success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
267

    
268
		if (botanicalName instanceof CultivarPlantName){
269
			//TODO
270
			//CultivarGroupName
271
			//CultivarName
272
		}
273
		return success;
274
	}
275
	
276
	
277
	private boolean makeNomenclaturalReference(IImportConfigurator config, TaxonNameBase taxonNameBase, 
278
					int nameId, ResultSet rs, Map<String, MapWrapper<? extends CdmBase>> stores) 
279
					throws SQLException{
280
		MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REFERENCE_STORE);
281
		MapWrapper<ReferenceBase> nomRefMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.NOMREF_STORE);
282
		MapWrapper<ReferenceBase> refDetailMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REF_DETAIL_STORE);
283
		MapWrapper<ReferenceBase> nomRefDetailMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.NOMREF_DETAIL_STORE);
284
		
285
		Object nomRefFk = rs.getObject("NomRefFk");
286
		int nomRefDetailFk = rs.getInt("NomRefDetailFk");
287
		boolean refDetailPrelim = rs.getBoolean("RefDetailPrelim");
288
		
289
		boolean success = true;
290
		//nomenclatural Reference
291
		if (referenceMap != null){
292
			if (nomRefFk != null){
293
				int nomRefFkInt = (Integer)nomRefFk;
294
				
295
				//get nomRef
296
				ReferenceBase nomReference = nomRefDetailMap.get(nomRefDetailFk);
297
				if (nomReference == null){
298
					nomReference = refDetailMap.get(nomRefDetailFk);
299
				}	
300
				if (nomReference == null){
301
					nomReference = nomRefMap.get(nomRefFkInt);
302
				}if (nomReference == null){
303
					nomReference = referenceMap.get(nomRefFkInt);
304
				}									
305
				
306
				//setNomRef
307
				if (nomReference == null ){
308
					//TODO
309
					if (! config.isIgnoreNull()){logger.warn("Nomenclatural reference (nomRefFk = " + nomRefFkInt + ") for TaxonName (nameId = " + nameId + ")"+
310
						" was not found in reference store. Nomenclatural reference was not set!!");}
311
				}else if (! INomenclaturalReference.class.isAssignableFrom(nomReference.getClass())){
312
					logger.error("Nomenclatural reference (nomRefFk = " + nomRefFkInt + ") for TaxonName (nameId = " + nameId + ")"+
313
					" is not assignable from INomenclaturalReference. Relation was not set!! (Class = " + nomReference.getClass()+ ")");
314
				}else{
315
					nomReference.setNomenclaturallyRelevant(true);
316
					taxonNameBase.setNomenclaturalReference((INomenclaturalReference)nomReference);
317
				}
318
			}
319
		}
320
		return success;
321
	}
322
	
323
	private static TeamOrPersonBase getAuthorTeam(MapWrapper<TeamOrPersonBase> authorMap, Object teamIdObject, int nameId, boolean ignoreNull){
324
		if (teamIdObject == null){
325
			return null;
326
		}else {
327
			int teamId = (Integer)teamIdObject;
328
			TeamOrPersonBase author = authorMap.get(teamId);
329
			if (author == null){
330
				//TODO
331
				if (!ignoreNull){ logger.warn("AuthorTeam (teamId = " + teamId + ") for TaxonName (nameId = " + nameId + ")"+
332
				" was not found in authorTeam store. Relation was not set!!");}
333
				return null;
334
//			}else if(teamId == 0){ //casus El Salvador
335
//				//do nothing 
336
//				return null;
337
			}else{
338
				return author;
339
			}
340
		}
341
	}
342
	
343
	/* (non-Javadoc)
344
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
345
	 */
346
	protected boolean isIgnore(IImportConfigurator config){
347
		return ! config.isDoTaxonNames();
348
	}
349

    
350
	
351
//FOR FUTURE USE , DONT DELETE	
352
//	new CdmStringMapper("nameId", "nameId"),
353
//	new CdmStringMapper("rankFk", "rankFk"),
354
//	new CdmStringMapper("nameCache", "nameCache"),
355
//	new CdmStringMapper("unnamedNamePhrase", "unnamedNamePhrase"),
356
//	new CdmStringMapper("fullNameCache", "fullNameCache"),
357
//	new CdmStringMapper("preliminaryFlag", "preliminaryFlag"),
358
//	new CdmStringMapper("supragenericName", "supragenericName"),
359
//	new CdmStringMapper("genus", "genus"),
360
//	new CdmStringMapper("genusSubdivisionEpi", "genusSubdivisionEpi"),
361
//	new CdmStringMapper("speciesEpi", "speciesEpi"),
362
//	new CdmStringMapper("infraSpeciesEpi", "infraSpeciesEpi"),
363
//	new CdmStringMapper("authorTeamFk", "authorTeamFk"),
364
//	new CdmStringMapper("exAuthorTeamFk", "exAuthorTeamFk"),
365
//	new CdmStringMapper("basAuthorTeamFk", "basAuthorTeamFk"),
366
//	new CdmStringMapper("exBasAuthorTeamFk", "exBasAuthorTeamFk"),
367
//	new CdmStringMapper("hybridFormulaFlag", "hybridFormulaFlag"),
368
//	new CdmStringMapper("monomHybFlag", "monomHybFlag"),
369
//	new CdmStringMapper("binomHybFlag", "binomHybFlag"),
370
//	new CdmStringMapper("trinomHybFlag", "trinomHybFlag"),
371
//	new CdmStringMapper("cultivarGroupName", "cultivarGroupName"),
372
//	new CdmStringMapper("cultivarName", "cultivarName"),
373
//	new CdmStringMapper("nomRefFk", "nomRefFk"),
374
//	new CdmStringMapper("nomRefDetailFk", "nomRefDetailFk"),
375
//	new CdmStringMapper("nameSourceRefFk", "nameSourceRefFk"),
376
//	new CdmStringMapper("source_Acc", "source_Acc"),
377
//	new CdmStringMapper("created_When", "created_When"),
378
//	new CdmStringMapper("created_Who", "created_Who"),
379
//	new CdmStringMapper("notes", "notes"),
380
//	new CdmStringMapper("parsingComments", "parsingComments"),
381
//	new CdmStringMapper("oldNomRefFk", "oldNomRefFk"),
382
//	new CdmStringMapper("oldNomRefDetailFk", "oldNomRefDetailFk"),
383
//	new CdmStringMapper("updated_Who", "updated_Who"),
384
//	new CdmStringMapper("orthoProjection", "orthoProjection"),
385

    
386
	
387
}
(10-10/16)