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