(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 static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.*;
4
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.util.HashSet;
8 import java.util.Set;
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.agent.Agent;
17 import eu.etaxonomy.cdm.model.name.BotanicalName;
18 import eu.etaxonomy.cdm.model.name.NameRelationshipType;
19 import eu.etaxonomy.cdm.model.name.Rank;
20 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
21 import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
22 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
23 import eu.etaxonomy.cdm.strategy.exceptions.UnknownRankException;
24
25 public class BerlinModelTaxonNameIO {
26 private static final Logger logger = Logger.getLogger(BerlinModelTaxonNameIO.class);
27
28 private static int modCount = 5000;
29
30 //TODO
31 static boolean invokeStatus(ReferenceBase berlinModelRef, Source source, CdmApplicationController cdmApp,
32 boolean deleteAll, MapWrapper<TaxonNameBase> taxonNameMap,
33 MapWrapper<ReferenceBase> referenceMap, MapWrapper<Agent> authorMap){
34 return false;
35 }
36
37 public static boolean invoke(ReferenceBase berlinModelRef, Source source, CdmApplicationController cdmApp,
38 boolean deleteAll, MapWrapper<TaxonNameBase> taxonNameMap,
39 MapWrapper<ReferenceBase> referenceMap, MapWrapper<Agent> authorMap){
40
41
42 String dbAttrName;
43 String cdmAttrName;
44 boolean success = true ;
45
46 logger.info("start makeTaxonNames ...");
47 INameService nameService = cdmApp.getNameService();
48 boolean delete = deleteAll;
49
50 try {
51
52
53 //get data from database
54 String strQuery =
55 "SELECT Name.* , RefDetail.RefDetailId, RefDetail.RefFk, " +
56 " RefDetail.FullRefCache, RefDetail.FullNomRefCache, RefDetail.PreliminaryFlag AS RefDetailPrelim, RefDetail.Details, " +
57 " RefDetail.SecondarySources, RefDetail.IdInSource " +
58 " FROM Name LEFT OUTER JOIN RefDetail ON Name.NomRefDetailFk = RefDetail.RefDetailId AND Name.NomRefDetailFk = RefDetail.RefDetailId AND " +
59 " Name.NomRefFk = RefDetail.RefFk AND Name.NomRefFk = RefDetail.RefFk" +
60 " WHERE (1=1) ";
61 //strQuery += " AND Name.Created_When > '03.03.2004' ";
62
63
64 ResultSet rs = source.getResultSet(strQuery) ;
65
66 int i = 0;
67 //for each reference
68 while (rs.next()){
69
70 if ((i++ % modCount) == 0){ logger.info("Names handled: " + (i-1));}
71
72 //create TaxonName element
73 int nameId = rs.getInt("nameId");
74 int rankId = rs.getInt("rankFk");
75 Object nomRefFk = rs.getObject("NomRefFk");
76
77 try {
78 if (logger.isDebugEnabled()){logger.debug(rankId);}
79 Rank rank = BerlinModelTransformer.rankId2Rank(rankId);
80 //FIXME
81 //BotanicalName name = BotanicalName.NewInstance(BerlinModelTransformer.rankId2Rank(rankId));
82 BotanicalName botanicalName = new BotanicalName(rank);
83
84 if (rankId < 40){
85 dbAttrName = "supraGenericName";
86 }else{
87 dbAttrName = "genus";
88 }
89 cdmAttrName = "genusOrUninomial";
90 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
91
92 dbAttrName = "genusSubdivisionEpi";
93 cdmAttrName = "infraGenericEpithet";
94 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
95
96 dbAttrName = "speciesEpi";
97 cdmAttrName = "specificEpithet";
98 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
99
100
101 dbAttrName = "infraSpeciesEpi";
102 cdmAttrName = "infraSpecificEpithet";
103 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
104
105 dbAttrName = "unnamedNamePhrase";
106 cdmAttrName = "appendedPhrase";
107 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
108
109 dbAttrName = "preliminaryFlag";
110 cdmAttrName = "XX" + "protectedTitleCache";
111 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
112
113 dbAttrName = "HybridFormulaFlag";
114 cdmAttrName = "isHybridFormula";
115 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
116
117 dbAttrName = "MonomHybFlag";
118 cdmAttrName = "isMonomHybrid";
119 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
120
121 dbAttrName = "BinomHybFlag";
122 cdmAttrName = "isBinomHybrid";
123 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
124
125 dbAttrName = "TrinomHybFlag";
126 cdmAttrName = "isTrinomHybrid";
127 success &= ImportHelper.addBooleanValue(rs, botanicalName, dbAttrName, cdmAttrName);
128
129 //botanicalName.s
130
131 // dbAttrName = "notes";
132 // cdmAttrName = "isTrinomHybrid";
133 // ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
134
135 //TODO
136 //Created
137 //Note
138 //makeAuthorTeams
139 //CultivarGroupName
140 //CultivarName
141 //Source_Acc
142 //OrthoProjection
143
144 //Details
145
146 dbAttrName = "details";
147 cdmAttrName = "nomenclaturalMicroReference";
148 success &= ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
149
150 //TODO
151 //preliminaryFlag
152
153 if (referenceMap != null){
154 if (nomRefFk != null){
155 int nomRefFkInt = (Integer)nomRefFk;
156 ReferenceBase nomenclaturalReference = referenceMap.get(nomRefFkInt);
157 if (nomenclaturalReference == null){
158 //TODO
159 logger.warn("Nomenclatural reference (nomRefFk = " + nomRefFkInt + ") for TaxonName (nameId = " + nameId + ")"+
160 " was not found in reference store. Relation was not set!!");
161 }else if (! INomenclaturalReference.class.isAssignableFrom(nomenclaturalReference.getClass())){
162 logger.error("Nomenclatural reference (nomRefFk = " + nomRefFkInt + ") for TaxonName (nameId = " + nameId + ")"+
163 " is not assignable from INomenclaturalReference. Relation was not set!! (Class = " + nomenclaturalReference.getClass()+ ")");
164 }else{
165 botanicalName.setNomenclaturalReference((INomenclaturalReference)nomenclaturalReference);
166 }
167 }
168 }
169
170 //refId
171 //TODO
172 // Annotation annotation = new Annotation("Berlin Model nameId: " + String.valueOf(refId), Language.DEFAULT());
173 // botanicalName.addAnnotations(annotation);
174
175 //nameId
176 ImportHelper.setOriginalSource(botanicalName, berlinModelRef, nameId);
177
178 taxonNameMap.put(nameId, botanicalName);
179
180 } catch (UnknownRankException e) {
181 logger.warn("Name with id " + nameId + " has unknown rankId " + rankId + " and could not be saved.");
182 success = false;
183 }
184
185 } //while rs.hasNext()
186 logger.info(i + " names handled");
187 nameService.saveTaxonNameAll(taxonNameMap.objects());
188
189 // makeNameSpecificData(nameMap);
190
191 logger.info("end makeTaxonNames ...");
192 return success;
193 } catch (SQLException e) {
194 logger.error("SQLException:" + e);
195 return false;
196 }
197
198 }
199
200 public static boolean invokeRelations(ReferenceBase berlinModelRef, Source source, CdmApplicationController cdmApp, boolean deleteAll,
201 MapWrapper<TaxonNameBase> nameMap, MapWrapper<ReferenceBase> referenceMap){
202
203 Set<TaxonNameBase> nameStore = new HashSet<TaxonNameBase>();
204
205 String dbAttrName;
206 String cdmAttrName;
207
208 logger.info("start makeNameRelationships ...");
209
210 INameService nameService = cdmApp.getNameService();
211 boolean delete = deleteAll;
212
213 try {
214 //get data from database
215 String strQuery =
216 " SELECT RelName.*, FromName.nameId as name1Id, ToName.nameId as name2Id " +
217 " FROM Name as FromName INNER JOIN " +
218 " RelName ON FromName.NameId = RelName.NameFk1 INNER JOIN " +
219 " Name AS ToName ON RelName.NameFk2 = ToName.NameId "+
220 " WHERE (1=1)";
221 ResultSet rs = source.getResultSet(strQuery) ;
222
223 int i = 0;
224 //for each reference
225 while (rs.next()){
226
227 if ((i++ % modCount) == 0){ logger.info("RelName handled: " + (i-1));}
228
229 int relNameId = rs.getInt("RelNameId");
230 int name1Id = rs.getInt("name1Id");
231 int name2Id = rs.getInt("name2Id");
232 int relRefFk = rs.getInt("refFk");
233 int relQualifierFk = rs.getInt("relNameQualifierFk");
234
235 TaxonNameBase nameFrom = nameMap.get(name1Id);
236 TaxonNameBase nameTo = nameMap.get(name2Id);
237
238 //TODO
239 ReferenceBase citation = null;
240 String microcitation = null;
241
242 if (nameFrom != null && nameTo != null){
243 if (relQualifierFk == NAME_REL_IS_BASIONYM_FOR){
244 //TODO references, mikroref, etc
245 nameTo.setBasionym(nameFrom);
246 }else if (relQualifierFk == NAME_REL_IS_LATER_HOMONYM_OF){
247 String rule = null; //TODO
248 nameFrom.addRelationshipToName(nameTo, NameRelationshipType.LATER_HOMONYM(), rule) ;
249 //TODO reference
250 }else if (relQualifierFk == NAME_REL_IS_REPLACED_SYNONYM_FOR){
251 String rule = null; //TODO
252 nameFrom.addRelationshipToName(nameTo, NameRelationshipType.REPLACED_SYNONYM(), rule) ;
253 //TODO reference
254 }else if (relQualifierFk == NAME_REL_IS_TYPE_OF){
255 logger.warn("NameRelationShipType " + relQualifierFk + " not yet implemented");
256 //TODO reference
257 }else if (relQualifierFk == NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF){
258 String rule = null; //TODO
259 nameFrom.addRelationshipToName(nameTo, NameRelationshipType.ORTHOGRAPHIC_VARIANT(), rule) ;
260 //TODO reference
261 }else {
262 //TODO
263 logger.warn("NameRelationShipType " + relQualifierFk + " not yet implemented");
264 }
265 nameStore.add(nameFrom);
266
267 //TODO
268 //Reference
269 //ID
270 //etc.
271 }else{
272 //TODO
273 if (nameFrom == null){
274 logger.warn("from TaxonName for RelName (" + relNameId + ") does not exist in store");
275 }
276 if (nameTo == null){
277 logger.warn("to TaxonNames for RelName (" + relNameId + ") does not exist in store");
278 }
279 }
280 }
281 logger.info("TaxonName to save: " + nameStore.size());
282 nameService.saveTaxonNameAll(nameStore);
283
284 logger.info("end makeRelName ...");
285 return true;
286 } catch (SQLException e) {
287 logger.error("SQLException:" + e);
288 return false;
289 }
290
291 }
292
293 }