merge pesi->trunk
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / in / BerlinModelTaxonNameImport.java
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 java.sql.ResultSet;
13 import java.sql.SQLException;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.Map;
17 import java.util.Set;
18 import java.util.UUID;
19
20 import org.apache.log4j.Logger;
21 import org.springframework.stereotype.Component;
22
23 import eu.etaxonomy.cdm.common.CdmUtils;
24 import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
25 import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelTaxonNameImportValidator;
26 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
27 import eu.etaxonomy.cdm.io.common.IOValidator;
28 import eu.etaxonomy.cdm.io.common.ImportHelper;
29 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
30 import eu.etaxonomy.cdm.io.common.Source;
31 import eu.etaxonomy.cdm.model.agent.Person;
32 import eu.etaxonomy.cdm.model.agent.Team;
33 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
34 import eu.etaxonomy.cdm.model.common.CdmBase;
35 import eu.etaxonomy.cdm.model.common.Extension;
36 import eu.etaxonomy.cdm.model.common.ExtensionType;
37 import eu.etaxonomy.cdm.model.name.BotanicalName;
38 import eu.etaxonomy.cdm.model.name.CultivarPlantName;
39 import eu.etaxonomy.cdm.model.name.NonViralName;
40 import eu.etaxonomy.cdm.model.name.Rank;
41 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
42 import eu.etaxonomy.cdm.model.name.ZoologicalName;
43 import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
44 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
45 import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
46
47 /**
48 * @author a.mueller
49 * @created 20.03.2008
50 * @version 1.0
51 */
52 @Component
53 public class BerlinModelTaxonNameImport extends BerlinModelImportBase {
54 private static final Logger logger = Logger.getLogger(BerlinModelTaxonNameImport.class);
55
56 public static final String NAMESPACE = "TaxonName";
57
58 public static final UUID SOURCE_ACC_UUID = UUID.fromString("c3959b4f-d876-4b7a-a739-9260f4cafd1c");
59
60 private static int modCount = 5000;
61 private static final String pluralString = "TaxonNames";
62 private static final String dbTableName = "Name";
63
64
65 public BerlinModelTaxonNameImport(){
66 super();
67 }
68
69 /* (non-Javadoc)
70 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery()
71 */
72 @Override
73 protected String getRecordQuery(BerlinModelImportConfigurator config) {
74 Source source = config.getSource();
75
76 String facultativCols = "";
77 String strFacTable = "RefDetail";
78 String strFacColumn = "IdInSource";
79 String strColAlias = null;
80 if (checkSqlServerColumnExists(source, strFacTable, strFacColumn)){
81 facultativCols += ", " + strFacTable + "." + strFacColumn ;
82 if (! CdmUtils.Nz(strColAlias).equals("") ){
83 facultativCols += " AS " + strColAlias;
84 }
85 }
86
87 String strRecordQuery =
88 "SELECT Name.* , RefDetail.RefDetailId, RefDetail.RefFk, " +
89 " RefDetail.FullRefCache, RefDetail.FullNomRefCache, RefDetail.PreliminaryFlag AS RefDetailPrelim, RefDetail.Details, " +
90 " RefDetail.SecondarySources, Rank.RankAbbrev, Rank.Rank " +
91 facultativCols +
92 " FROM Name LEFT OUTER JOIN RefDetail ON Name.NomRefDetailFk = RefDetail.RefDetailId AND " +
93 " Name.NomRefFk = RefDetail.RefFk " +
94 " LEFT OUTER JOIN Rank ON Name.RankFk = Rank.rankID " +
95 " WHERE name.nameId IN ("+ID_LIST_TOKEN+") ";
96 //strQuery += " AND RefDetail.PreliminaryFlag = 1 ";
97 //strQuery += " AND Name.Created_When > '03.03.2004' ";
98 return strRecordQuery;
99 }
100
101
102 /* (non-Javadoc)
103 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
104 */
105 public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
106 String dbAttrName;
107 String cdmAttrName;
108 boolean success = true ;
109 BerlinModelImportConfigurator config = state.getConfig();
110 Set<TaxonNameBase> namesToSave = new HashSet<TaxonNameBase>();
111 Map<String, Team> teamMap = (Map<String, Team>) partitioner.getObjectMap(BerlinModelAuthorTeamImport.NAMESPACE);
112
113 ResultSet rs = partitioner.getResultSet();
114
115 try {
116 int i = 0;
117 //for each reference
118 while (rs.next()){
119
120 if ((i++ % modCount) == 0 && i != 1 ){ logger.info("Names handled: " + (i-1));}
121
122 //create TaxonName element
123 int nameId = rs.getInt("nameId");
124 Object authorFk = rs.getObject("AuthorTeamFk");
125 Object exAuthorFk = rs.getObject("ExAuthorTeamFk");
126 Object basAuthorFk = rs.getObject("BasAuthorTeamFk");
127 Object exBasAuthorFk = rs.getObject("ExBasAuthorTeamFk");
128 String strCultivarGroupName = rs.getString("CultivarGroupName");
129 String strCultivarName = rs.getString("CultivarName");
130
131 try {
132 boolean useUnknownRank = true;
133 Rank rank = BerlinModelTransformer.rankId2Rank(rs, useUnknownRank);
134
135 TaxonNameBase taxonNameBase;
136 if (config.getNomenclaturalCode() != null){
137 taxonNameBase = config.getNomenclaturalCode().getNewTaxonNameInstance(rank);
138 //check cultivar
139 if (taxonNameBase instanceof BotanicalName){
140 if (CdmUtils.isNotEmpty(strCultivarGroupName) && CdmUtils.isNotEmpty(strCultivarName)){
141 taxonNameBase = CultivarPlantName.NewInstance(rank);
142 }
143 }
144 }else{
145 taxonNameBase = NonViralName.NewInstance(rank);
146 }
147
148 if (rank == null){
149 //TODO rank should never be null or a more sophisticated algorithm has to be implemented for genus/supraGenericName
150 logger.warn("Rank is null. Genus epethiton was imported. May be wrong");
151 success = false;
152 }
153 if (rank != null && rank.isSupraGeneric()){
154 dbAttrName = "supraGenericName";
155 }else{
156 dbAttrName = "genus";
157 }
158 cdmAttrName = "genusOrUninomial";
159 success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
160
161 dbAttrName = "genusSubdivisionEpi";
162 cdmAttrName = "infraGenericEpithet";
163 success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
164
165 dbAttrName = "speciesEpi";
166 cdmAttrName = "specificEpithet";
167 success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
168
169
170 dbAttrName = "infraSpeciesEpi";
171 cdmAttrName = "infraSpecificEpithet";
172 success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
173
174 dbAttrName = "unnamedNamePhrase";
175 cdmAttrName = "appendedPhrase";
176 success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
177
178 //Details
179 dbAttrName = "details";
180 cdmAttrName = "nomenclaturalMicroReference";
181 success &= ImportHelper.addStringValue(rs, taxonNameBase, dbAttrName, cdmAttrName);
182
183 //nomRef
184 success &= makeNomenclaturalReference(config, taxonNameBase, nameId, rs, partitioner);
185
186 //Source_Acc
187 String sourceAcc = rs.getString("Source_Acc");
188 if (CdmUtils.isNotEmpty(sourceAcc)){
189 ExtensionType sourceAccExtensionType = getExtensionType(state, SOURCE_ACC_UUID, "Source_Acc","Source_Acc","Source_Acc");
190 Extension datesExtension = Extension.NewInstance(taxonNameBase, sourceAcc, sourceAccExtensionType);
191 }
192
193 //created, notes
194 success &= doIdCreatedUpdatedNotes(state, taxonNameBase, rs, nameId, NAMESPACE);
195
196 //NonViralName
197 if (taxonNameBase instanceof NonViralName){
198 NonViralName nonViralName = (NonViralName)taxonNameBase;
199
200 //authorTeams
201 if (teamMap != null ){
202 nonViralName.setCombinationAuthorTeam(getAuthorTeam(teamMap, authorFk, nameId, config));
203 nonViralName.setExCombinationAuthorTeam(getAuthorTeam(teamMap, exAuthorFk, nameId, config));
204 nonViralName.setBasionymAuthorTeam(getAuthorTeam(teamMap, basAuthorFk, nameId, config));
205 nonViralName.setExBasionymAuthorTeam(getAuthorTeam(teamMap, exBasAuthorFk, nameId, config));
206 }else{
207 logger.warn("TeamMap is null");
208 success = false;
209 }
210 }//nonviralName
211
212
213
214
215
216 //zoologicalName
217 if (taxonNameBase instanceof ZoologicalName){
218 ZoologicalName zooName = (ZoologicalName)taxonNameBase;
219 makeZoologialName(rs, zooName, nameId);
220 }
221 //botanicalName
222 else if (taxonNameBase instanceof BotanicalName){
223 BotanicalName botName = (BotanicalName)taxonNameBase;
224 success &= makeBotanicalNamePart(rs, botName) ;
225
226 }
227
228 // dbAttrName = "preliminaryFlag";
229 Boolean preliminaryFlag = rs.getBoolean("PreliminaryFlag");
230 if (preliminaryFlag == true){
231 //Computes all caches and sets
232 taxonNameBase.setFullTitleCache(taxonNameBase.getFullTitleCache(), true);
233 taxonNameBase.setTitleCache(taxonNameBase.getTitleCache(), true);
234 if (taxonNameBase instanceof NonViralName){
235 NonViralName nvn = (NonViralName)taxonNameBase;
236 nvn.setNameCache(nvn.getNameCache(), true);
237 nvn.setAuthorshipCache(nvn.getAuthorshipCache(), true);
238 }
239 }
240 namesToSave.add(taxonNameBase);
241
242 }
243 catch (UnknownCdmTypeException e) {
244 logger.warn("Name with id " + nameId + " has unknown rankId " + " and could not be saved.");
245 success = false;
246 }
247
248 } //while rs.hasNext()
249 } catch (SQLException e) {
250 logger.error("SQLException:" + e);
251 return false;
252 }
253
254
255 // logger.info( i + " names handled");
256 getNameService().save(namesToSave);
257 return success;
258 }
259
260 /* (non-Javadoc)
261 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
262 */
263 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
264 String nameSpace;
265 Class cdmClass;
266 Set<String> idSet;
267
268 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
269
270 try{
271 Set<String> teamIdSet = new HashSet<String>();
272 Set<String> referenceIdSet = new HashSet<String>();
273 Set<String> refDetailIdSet = new HashSet<String>();
274 while (rs.next()){
275 handleForeignKey(rs, teamIdSet, "AuthorTeamFk");
276 handleForeignKey(rs, teamIdSet, "ExAuthorTeamFk");
277 handleForeignKey(rs, teamIdSet, "BasAuthorTeamFk");
278 handleForeignKey(rs, teamIdSet, "ExBasAuthorTeamFk");
279 handleForeignKey(rs, referenceIdSet, "nomRefFk");
280 handleForeignKey(rs, refDetailIdSet, "nomRefDetailFk");
281 }
282
283 //team map
284 nameSpace = BerlinModelAuthorTeamImport.NAMESPACE;
285 cdmClass = Team.class;
286 idSet = teamIdSet;
287 Map<String, Person> teamMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
288 result.put(nameSpace, teamMap);
289
290 //nom reference map
291 nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
292 cdmClass = ReferenceBase.class;
293 idSet = referenceIdSet;
294 Map<String, ReferenceBase> nomReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
295 result.put(nameSpace, nomReferenceMap);
296
297 //biblio reference map
298 nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
299 cdmClass = ReferenceBase.class;
300 idSet = referenceIdSet;
301 Map<String, ReferenceBase> biblioReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
302 result.put(nameSpace, biblioReferenceMap);
303
304 //nom refDetail map
305 nameSpace = BerlinModelRefDetailImport.NOM_REFDETAIL_NAMESPACE;
306 cdmClass = ReferenceBase.class;
307 idSet = refDetailIdSet;
308 Map<String, ReferenceBase> nomRefDetailMap= (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
309 result.put(nameSpace, nomRefDetailMap);
310
311 //biblio refDetail map
312 nameSpace = BerlinModelRefDetailImport.BIBLIO_REFDETAIL_NAMESPACE;
313 cdmClass = ReferenceBase.class;
314 idSet = refDetailIdSet;
315 Map<String, ReferenceBase> biblioRefDetailMap= (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
316 result.put(nameSpace, biblioRefDetailMap);
317
318 } catch (SQLException e) {
319 throw new RuntimeException(e);
320 }
321 return result;
322 }
323
324 private boolean makeZoologialName(ResultSet rs, ZoologicalName zooName, int nameId)
325 throws SQLException{
326 boolean success = true;
327 //publicationYear
328 String authorTeamYear = rs.getString("authorTeamYear");
329 try {
330 if (! "".equals(CdmUtils.Nz(authorTeamYear).trim())){
331 Integer publicationYear = Integer.valueOf(authorTeamYear.trim());
332 zooName.setPublicationYear(publicationYear);
333 }
334 } catch (NumberFormatException e) {
335 logger.warn("authorTeamYear could not be parsed for taxonName: "+ nameId);
336 }
337 //original publication year
338 String basAuthorTeamYear = rs.getString("basAuthorTeamYear");
339 try {
340 if (! "".equals(CdmUtils.Nz(basAuthorTeamYear).trim())){
341 Integer OriginalPublicationYear = Integer.valueOf(basAuthorTeamYear.trim());
342 zooName.setOriginalPublicationYear(OriginalPublicationYear);
343 }
344 } catch (NumberFormatException e) {
345 logger.warn("basAuthorTeamYear could not be parsed for taxonName: "+ nameId);
346 }
347 return success;
348 }
349
350 private boolean makeBotanicalNamePart(ResultSet rs, BotanicalName botanicalName)throws SQLException{
351 boolean success = true;
352 String dbAttrName;
353 String cdmAttrName;
354
355 dbAttrName = "HybridFormulaFlag";
356 cdmAttrName = "isHybridFormula";
357 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
358
359 dbAttrName = "MonomHybFlag";
360 cdmAttrName = "isMonomHybrid";
361 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
362
363 dbAttrName = "BinomHybFlag";
364 cdmAttrName = "isBinomHybrid";
365 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
366
367 dbAttrName = "TrinomHybFlag";
368 cdmAttrName = "isTrinomHybrid";
369 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
370
371 try {
372 String strCultivarGroupName = rs.getString("CultivarGroupName");
373 String strCultivarName = rs.getString("CultivarName");
374 if (botanicalName instanceof CultivarPlantName){
375 CultivarPlantName cultivarName = (CultivarPlantName)botanicalName;
376 String concatCultivarName = CdmUtils.concat("-", strCultivarName, strCultivarGroupName);
377 if (CdmUtils.isNotEmpty(strCultivarGroupName) && CdmUtils.isNotEmpty(strCultivarName)){
378 logger.warn("CDM does not support cultivarGroupName and CultivarName together: " + concatCultivarName);
379 }
380 cultivarName.setCultivarName(strCultivarGroupName);
381 }
382 } catch (SQLException e) {
383 throw e;
384 }
385 return success;
386 }
387
388
389 private boolean makeNomenclaturalReference(IImportConfigurator config, TaxonNameBase taxonNameBase,
390 int nameId, ResultSet rs, ResultSetPartitioner partitioner) throws SQLException{
391 Map<String, ReferenceBase> biblioRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);
392 Map<String, ReferenceBase> nomRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE);
393 Map<String, ReferenceBase> biblioRefDetailMap = partitioner.getObjectMap(BerlinModelRefDetailImport.BIBLIO_REFDETAIL_NAMESPACE);
394 Map<String, ReferenceBase> nomRefDetailMap = partitioner.getObjectMap(BerlinModelRefDetailImport.NOM_REFDETAIL_NAMESPACE);
395
396 Object nomRefFkObj = rs.getObject("NomRefFk");
397 Object nomRefDetailFkObj = rs.getObject("NomRefDetailFk");
398 boolean refDetailPrelim = rs.getBoolean("RefDetailPrelim");
399
400 boolean success = true;
401 //nomenclatural Reference
402 if (biblioRefMap != null){
403 if (nomRefFkObj != null){
404 String nomRefFk = String.valueOf(nomRefFkObj);
405 String nomRefDetailFk = String.valueOf(nomRefDetailFkObj);
406 //get nomRef
407 ReferenceBase nomReference =
408 getReferenceFromMaps(nomRefDetailMap, biblioRefDetailMap,
409 nomRefMap, biblioRefMap, nomRefDetailFk, nomRefFk);
410
411
412 //setNomRef
413 if (nomReference == null ){
414 //TODO
415 if (! config.isIgnoreNull()){
416 logger.warn("Nomenclatural reference (nomRefFk = " + nomRefFk + ") for TaxonName (nameId = " + nameId + ")"+
417 " was not found in reference store. Nomenclatural reference was not set!!");
418 }
419 }else{
420 if (! INomenclaturalReference.class.isAssignableFrom(nomReference.getClass())){
421 logger.warn("Nomenclatural reference (nomRefFk = " + nomRefFk + ") for TaxonName (nameId = " + nameId + ")"+
422 " is not assignable from INomenclaturalReference. (Class = " + nomReference.getClass()+ ")");
423 }
424 nomReference.setNomenclaturallyRelevant(true);
425 taxonNameBase.setNomenclaturalReference(nomReference);
426 }
427 }
428 }
429 return success;
430 }
431
432 private static TeamOrPersonBase getAuthorTeam(Map<String, Team> teamMap, Object teamIdObject, int nameId, BerlinModelImportConfigurator bmiConfig){
433 if (teamIdObject == null){
434 return null;
435 }else {
436 String teamId = String.valueOf(teamIdObject);
437 TeamOrPersonBase author = teamMap.get(teamId);
438 if (author == null){
439 //TODO
440 if (!bmiConfig.isIgnoreNull() && ! (teamId.equals(0) && bmiConfig.isIgnore0AuthorTeam()) ){
441 logger.warn("AuthorTeam (teamId = " + teamId + ") for TaxonName (nameId = " + nameId + ")"+
442 " was not found in authorTeam store. Relation was not set!!");}
443 return null;
444 }else{
445 return author;
446 }
447 }
448 }
449
450 /* (non-Javadoc)
451 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
452 */
453 @Override
454 protected boolean doCheck(BerlinModelImportState state){
455 IOValidator<BerlinModelImportState> validator = new BerlinModelTaxonNameImportValidator();
456 return validator.validate(state);
457 }
458
459 /* (non-Javadoc)
460 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
461 */
462 @Override
463 protected String getTableName() {
464 return dbTableName;
465 }
466
467 /* (non-Javadoc)
468 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
469 */
470 @Override
471 public String getPluralString() {
472 return pluralString;
473 }
474
475 /* (non-Javadoc)
476 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
477 */
478 protected boolean isIgnore(BerlinModelImportState state){
479 return ! state.getConfig().isDoTaxonNames();
480 }
481
482
483
484
485
486
487 //FOR FUTURE USE , DONT DELETE
488 // new CdmStringMapper("nameId", "nameId"),
489 // new CdmStringMapper("rankFk", "rankFk"),
490 // new CdmStringMapper("nameCache", "nameCache"),
491 // new CdmStringMapper("unnamedNamePhrase", "unnamedNamePhrase"),
492 // new CdmStringMapper("fullNameCache", "fullNameCache"),
493 // new CdmStringMapper("preliminaryFlag", "preliminaryFlag"),
494 // new CdmStringMapper("supragenericName", "supragenericName"),
495 // new CdmStringMapper("genus", "genus"),
496 // new CdmStringMapper("genusSubdivisionEpi", "genusSubdivisionEpi"),
497 // new CdmStringMapper("speciesEpi", "speciesEpi"),
498 // new CdmStringMapper("infraSpeciesEpi", "infraSpeciesEpi"),
499 // new CdmStringMapper("authorTeamFk", "authorTeamFk"),
500 // new CdmStringMapper("exAuthorTeamFk", "exAuthorTeamFk"),
501 // new CdmStringMapper("basAuthorTeamFk", "basAuthorTeamFk"),
502 // new CdmStringMapper("exBasAuthorTeamFk", "exBasAuthorTeamFk"),
503 // new CdmStringMapper("hybridFormulaFlag", "hybridFormulaFlag"),
504 // new CdmStringMapper("monomHybFlag", "monomHybFlag"),
505 // new CdmStringMapper("binomHybFlag", "binomHybFlag"),
506 // new CdmStringMapper("trinomHybFlag", "trinomHybFlag"),
507 // new CdmStringMapper("cultivarGroupName", "cultivarGroupName"),
508 // new CdmStringMapper("cultivarName", "cultivarName"),
509 // new CdmStringMapper("nomRefFk", "nomRefFk"),
510 // new CdmStringMapper("nomRefDetailFk", "nomRefDetailFk"),
511 // new CdmStringMapper("nameSourceRefFk", "nameSourceRefFk"),
512 // new CdmStringMapper("source_Acc", "source_Acc"),
513 // new CdmStringMapper("created_When", "created_When"),
514 // new CdmStringMapper("created_Who", "created_Who"),
515 // new CdmStringMapper("notes", "notes"),
516 // new CdmStringMapper("parsingComments", "parsingComments"),
517 // new CdmStringMapper("oldNomRefFk", "oldNomRefFk"),
518 // new CdmStringMapper("oldNomRefDetailFk", "oldNomRefDetailFk"),
519 // new CdmStringMapper("updated_Who", "updated_Who"),
520 // new CdmStringMapper("orthoProjection", "orthoProjection"),
521
522
523 }