(no commit message)
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / BerlinModelTaxonNameIO.java
1 package eu.etaxonomy.cdm.io.berlinModel;
2
3 import java.sql.ResultSet;
4 import java.sql.SQLException;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.UUID;
9
10 import org.apache.log4j.Logger;
11
12 import eu.etaxonomy.cdm.api.application.CdmApplicationController;
13 import eu.etaxonomy.cdm.api.service.INameService;
14 import eu.etaxonomy.cdm.api.service.IReferenceService;
15 import eu.etaxonomy.cdm.io.source.Source;
16 import eu.etaxonomy.cdm.model.name.BotanicalName;
17 import eu.etaxonomy.cdm.model.name.Rank;
18 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
19 import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
20 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
21 import eu.etaxonomy.cdm.strategy.exceptions.UnknownRankException;
22
23 public class BerlinModelTaxonNameIO {
24 private static final Logger logger = Logger.getLogger(BerlinModelTaxonNameIO.class);
25
26 private static int modCount = 1000;
27
28 public static boolean invoke(
29 Source source,
30 CdmApplicationController cdmApp,
31 boolean deleteAll,
32 MapWrapper<TaxonNameBase> taxonNameMap,
33 MapWrapper<ReferenceBase> referenceMap){
34
35
36 String dbAttrName;
37 String cdmAttrName;
38 boolean success = true ;
39
40 logger.info("start makeTaxonNames ...");
41 INameService nameService = cdmApp.getNameService();
42 IReferenceService referenceService = cdmApp.getReferenceService();
43 boolean delete = deleteAll;
44
45
46 // if (delete){
47 // List<TaxonNameBase> listAllNames = nameService.getAllNames(0, 1000);
48 // while(listAllNames.size() > 0 ){
49 // for (TaxonNameBase name : listAllNames ){
50 // //FIXME
51 // //nameService.remove(name);
52 // }
53 // listAllNames = nameService.getAllNames(0, 1000);
54 // }
55 // }
56
57 try {
58
59
60 //get data from database
61 String strQuery =
62 "SELECT Name.* , RefDetail.RefDetailId, RefDetail.RefFk, " +
63 " RefDetail.FullRefCache, RefDetail.FullNomRefCache, RefDetail.PreliminaryFlag AS RefDetailPrelim, RefDetail.Details, " +
64 " RefDetail.SecondarySources, RefDetail.IdInSource " +
65 " FROM Name LEFT OUTER JOIN RefDetail ON Name.NomRefDetailFk = RefDetail.RefDetailId AND Name.NomRefDetailFk = RefDetail.RefDetailId AND " +
66 " Name.NomRefFk = RefDetail.RefFk AND Name.NomRefFk = RefDetail.RefFk";
67 ResultSet rs = source.getResultSet(strQuery) ;
68
69 int i = 0;
70 //for each reference
71 while (rs.next()){
72
73 if ((i++ % modCount) == 0){ logger.info("Names handled: " + (i-1));}
74
75 //create TaxonName element
76 int nameId = rs.getInt("nameId");
77 int rankId = rs.getInt("rankFk");
78 Object nomRefFk = rs.getInt("NomRefFk");
79
80 try {
81 logger.info(rankId);
82 Rank rank = BerlinModelTransformer.rankId2Rank(rankId);
83 //FIXME
84 //BotanicalName name = BotanicalName.NewInstance(BerlinModelTransformer.rankId2Rank(rankId));
85 BotanicalName botanicalName = new BotanicalName(rank);
86
87 if (rankId < 40){
88 dbAttrName = "supraGenericName";
89 }else{
90 dbAttrName = "genus";
91 }
92 cdmAttrName = "genusOrUninomial";
93 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
94
95 dbAttrName = "genusSubdivisionEpi";
96 cdmAttrName = "infraGenericEpithet";
97 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
98
99 dbAttrName = "speciesEpi";
100 cdmAttrName = "specificEpithet";
101 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
102
103
104 dbAttrName = "infraSpeciesEpi";
105 cdmAttrName = "infraSpecificEpithet";
106 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
107
108 dbAttrName = "unnamedNamePhrase";
109 cdmAttrName = "appendedPhrase";
110 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
111
112 dbAttrName = "preliminaryFlag";
113 cdmAttrName = "XX" + "protectedTitleCache";
114 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
115
116 dbAttrName = "HybridFormulaFlag";
117 cdmAttrName = "isHybridFormula";
118 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
119
120 dbAttrName = "MonomHybFlag";
121 cdmAttrName = "isMonomHybrid";
122 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
123
124 dbAttrName = "BinomHybFlag";
125 cdmAttrName = "isBinomHybrid";
126 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
127
128 dbAttrName = "TrinomHybFlag";
129 cdmAttrName = "isTrinomHybrid";
130 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
131
132 //botanicalName.s
133
134 // dbAttrName = "notes";
135 // cdmAttrName = "isTrinomHybrid";
136 // ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
137
138 //TODO
139 //Created
140 //Note
141 //makeAuthorTeams
142 //CultivarGroupName
143 //CultivarName
144 //Source_Acc
145 //OrthoProjection
146
147 //Details
148
149 dbAttrName = "details";
150 cdmAttrName = "nomenclaturalMicroReference";
151 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
152
153 //TODO
154 //preliminaryFlag
155
156 if (referenceMap != null){
157 if (nomRefFk != null){
158 int nomRefFkInt = (Integer)nomRefFk;
159 ReferenceBase nomenclaturalReference = referenceMap.get(nomRefFkInt);
160 if (INomenclaturalReference.class.isAssignableFrom(nomenclaturalReference.getClass())){
161 botanicalName.setNomenclaturalReference((INomenclaturalReference)nomenclaturalReference);
162 }else{
163 logger.error("Nomenclatural reference (nomRefFk = " + nomRefFkInt + ") for TaxonName (nameId = " + nameId + ")"+
164 " is not assignable from INomenclaturalReference. Relation was not set!!");
165 }
166 }
167 }
168
169
170 //name ID
171 //refId
172 //TODO
173 // Annotation annotation = new Annotation("Berlin Model nameId: " + String.valueOf(refId), Language.DEFAULT());
174 // botanicalName.addAnnotations(annotation);
175
176 taxonNameMap.put(nameId, botanicalName);
177
178 } catch (UnknownRankException e) {
179 logger.warn("Name with id " + nameId + " has unknown rankId " + rankId + " and could not be saved.");
180 success = false;
181 }
182
183 } //while rs.hasNext()
184 nameService.saveTaxonNameAll(taxonNameMap.objects());
185
186
187 // //Code
188 // strAttrName = "nomenclaturalCode";
189 // strValue = "Botanical";
190 // parent = elTaxonName;
191 // xml.addStringAttribute(strValue, parent, strAttrName, NS_NULL);
192 //
193 // //Simple
194 // strDbAttr = "FullNameCache";
195 // strElName = "Simple";
196 // parent = elTaxonName;
197 // xml.addElement(rs,strDbAttr, parent, strElName, nsTcs, OBLIGATORY);
198 //
199 // if (fullVersion){
200 // //Rank
201 // strDbAttr = "RankAbbrev";
202 // strElName = "Rank";
203 // parent = elTaxonName;
204 // xml.addElement(rs,strDbAttr, parent, strElName, nsTcs, OBLIGATORY);
205 //
206 // //CanonicalName
207 // parent = elTaxonName;
208 // makeCanonicalName(rs, parent);
209 //
210 //
211 // //CanonicalAuthorship
212 // parent = elTaxonName;
213 // makeCanonicalAuthorship(rs, parent);
214 //
215 // } //fi fullVersion
216 //
217 // //PublishedIn
218 // strDbAttr = "NomRefFk";
219 // strAttrName = "ref";
220 // strElName = "PublishedIn";
221 // parent = elTaxonName;
222 // Attribute attrPublRef = xml.addAttributeInElement(rs, strDbAttr, parent, strAttrName, strElName, nsTcs, FACULTATIVE);
223 //
224 // if (attrPublRef != null){
225 // //does Publication exist?
226 // String ref = attrPublRef.getValue();
227 // if (! publicationMap.containsKey(ref)){
228 // logger.error("PublishedIn ref " + ref + " for " + nameId + " does not exist.");
229 // }
230 // }
231 //
232 //
233 // if (fullVersion){
234 // //Year
235 // String year = rs.getString("RefYear");
236 // if (year == null) {
237 // year = rs.getString("HigherRefYear");
238 // }
239 // strValue = year;
240 // strElName = "Year";
241 // parent = elTaxonName;
242 // xml.addStringElement(strValue, parent, strElName, nsTcs, FACULTATIVE);
243 //
244 // //MicroReference
245 // strDbAttr = "Details";
246 // strElName = "MicroReference";
247 // parent = elTaxonName;
248 // xml.addElement(rs,strDbAttr, parent, strElName, nsTcs, FACULTATIVE);
249 //
250 // }//fi fullversion
251 // }//while
252 //
253 // //insert related Names (Basionyms, ReplacedSyns, etc.
254 // makeSpellingCorrections(nameMap);
255 // makeBasionyms(nameMap);
256 // makeLaterHomonyms(nameMap);
257 // makeReplacedNames(nameMap);
258 //
259 // //insert Status infos
260 // makeNameSpecificData(nameMap);
261 //cdmApp.flush();
262 logger.info("end makeTaxonNames ...");
263 return success;
264 } catch (SQLException e) {
265 logger.error("SQLException:" + e);
266 return false;
267 }
268
269 }
270
271 }