(no commit message)
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / BerlinModelImport.java
1 package eu.etaxonomy.cdm.io.berlinModel;
2
3 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.*;
4 import java.sql.ResultSet;
5 import java.sql.SQLException;
6 import java.util.ArrayList;
7 import java.util.Collection;
8 import java.util.HashMap;
9 import java.util.Iterator;
10 import java.util.List;
11 import java.util.Map;
12 import java.util.UUID;
13
14 import org.apache.log4j.Logger;
15 import org.springframework.stereotype.Service;
16
17 import eu.etaxonomy.cdm.api.application.CdmApplicationController;
18 import eu.etaxonomy.cdm.api.service.IAgentService;
19 import eu.etaxonomy.cdm.api.service.INameService;
20 import eu.etaxonomy.cdm.api.service.IReferenceService;
21 import eu.etaxonomy.cdm.api.service.IService;
22 import eu.etaxonomy.cdm.api.service.ITaxonService;
23 import eu.etaxonomy.cdm.io.source.Source;
24 import eu.etaxonomy.cdm.model.agent.Agent;
25 import eu.etaxonomy.cdm.model.name.BotanicalName;
26 import eu.etaxonomy.cdm.model.name.Rank;
27 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
28 import eu.etaxonomy.cdm.model.reference.Article;
29 import eu.etaxonomy.cdm.model.reference.Book;
30 import eu.etaxonomy.cdm.model.reference.BookSection;
31 import eu.etaxonomy.cdm.model.reference.Database;
32 import eu.etaxonomy.cdm.model.reference.Generic;
33 import eu.etaxonomy.cdm.model.reference.Journal;
34 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
35 import eu.etaxonomy.cdm.model.reference.StrictReferenceBase;
36 import eu.etaxonomy.cdm.model.taxon.Synonym;
37 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
38 import eu.etaxonomy.cdm.model.taxon.Taxon;
39 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
40 import eu.etaxonomy.cdm.strategy.exceptions.UnknownRankException;
41
42 @Service
43 public class BerlinModelImport {
44 private static final Logger logger = Logger.getLogger(BerlinModelImport.class);
45
46 private boolean deleteAll = false;
47
48 //BerlinModelDB
49 private Source source;
50
51 //CdmApplication
52 private CdmApplicationController cdmApp;
53
54 //Constants
55 //final boolean OBLIGATORY = true;
56 //final boolean FACULTATIVE = false;
57 final int modCount = 1000;
58
59
60 //Hashmaps for Joins
61 //OLD: private Map<Integer, UUID> referenceMap = new HashMap<Integer, UUID>();
62 private MapWrapper<Agent> authorStore= new MapWrapper<Agent>(null);
63 private MapWrapper<ReferenceBase> referenceStore= new MapWrapper<ReferenceBase>(null);
64 private MapWrapper<TaxonNameBase> taxonNameStore = new MapWrapper<TaxonNameBase>(null);
65 private MapWrapper<TaxonBase> taxonStore = new MapWrapper<TaxonBase>(null);
66
67
68 /**
69 * Executes the whole
70 */
71 public boolean doImport(Source source, CdmApplicationController cdmApp){
72 if (source == null || cdmApp == null){
73 throw new NullPointerException("Source and CdmApplicationController must not be null");
74 }
75 this.source = source;
76 this.cdmApp = cdmApp;
77
78 //make and save Authors
79 if (false){
80 if (! BerlinModelAuthorIO.invoke(source, cdmApp, deleteAll, authorStore)){
81 return false;
82 }
83 }else{
84 referenceStore = null;
85 }
86 //make and save References
87 if (false){
88 if (! BerlinModelReferenceIO.invoke(source, cdmApp, deleteAll, referenceStore, authorStore)){
89 return false;
90 }
91 }else{
92 referenceStore = null;
93 }
94
95 //make and save Names
96 if (! BerlinModelTaxonNameIO.invoke(source, cdmApp, deleteAll, taxonNameStore, referenceStore, authorStore)){
97 return false;
98 }
99
100 if(true){
101 return true;
102 }
103
104 //make and save Taxa
105 if (! BerlinModelTaxonIO.invoke(source, cdmApp, deleteAll, taxonStore, taxonNameStore, referenceStore)){
106 return false;
107 }
108
109 //make and save Facts
110 makeRelTaxa();
111
112 //make and save Facts
113 makeFacts();
114
115 if (false){
116 //make and save publications
117 /* makePublications(root);
118 saveToXml(root.getChild("Publications", nsTcs), outputPath, outputFileName + "Publications", format);
119
120 saveToXml(root.getChild("TaxonNames", nsTcs), outputPath, outputFileName + "_TaxonNames", format);
121
122 //make and save Concepts
123 makeConcepts(root);
124 saveToXml(root.getChild("TaxonConcepts", nsTcs), outputPath, outputFileName + "_TaxonConcepts", format);
125 */ }
126 return true;
127 }
128
129 /**
130 * @return
131 */
132 private boolean makeRelTaxa(){
133 String dbAttrName;
134 String cdmAttrName;
135
136 logger.info("start makeTaxonRelationships ...");
137 logger.warn("RelTaxa not yet implemented !!");
138
139 ITaxonService taxonService = cdmApp.getTaxonService();
140 boolean delete = deleteAll;
141
142 // if (delete){
143 // List<Agent> listAllAgents = agentService.getAllAgents(0, 1000);
144 // while(listAllAgents.size() > 0 ){
145 // for (Agent name : listAllAgents ){
146 // //FIXME
147 // //nameService.remove(name);
148 // }
149 // listAllAgents = agentService.getAllAgents(0, 1000);
150 // }
151 // }
152 try {
153 //get data from database
154 String strQuery =
155 " SELECT * " +
156 " FROM RelPTaxon Join Taxon1 Join Taxon2" ;
157 ResultSet rs = source.getResultSet(strQuery) ;
158 int i = 0;
159 //for each reference
160 while (rs.next()){
161
162 if ((i++ % modCount) == 0){ logger.info("RelPTaxa handled: " + (i-1));}
163
164
165 int taxon1Id = rs.getInt("taxon1Id");
166 int taxon2Id = rs.getInt("taxon2Id");
167 int factId = rs.getInt("factId");
168 int relTypeFk = rs.getInt("relTypeFk");
169
170 TaxonBase taxon1 = taxonStore.get(taxon1Id);
171 TaxonBase taxon2 = taxonStore.get(taxon2Id);
172
173 //TODO
174 ReferenceBase citation = null;
175 String microcitation = null;
176
177
178 if (relTypeFk == IS_INCLUDED_IN){
179 ((Taxon)taxon2).addTaxonomicChild((Taxon)taxon1, citation, microcitation);
180 }else if (relTypeFk == IS_SYNONYM_OF){
181 ((Taxon)taxon2).addSynonym((Synonym)taxon1, SynonymRelationshipType.SYNONYM_OF());
182 }else if (relTypeFk == IS_HOMOTYPIC_SYNONYM_OF){
183 ((Taxon)taxon2).addSynonym((Synonym)taxon1, SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF());
184 }else if (relTypeFk == IS_HETEROTYPIC_SYNONYM_OF){
185 ((Taxon)taxon2).addSynonym((Synonym)taxon1, SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF());
186 }else if (relTypeFk == IS_MISAPPLIED_NAME_OF){
187 ((Taxon)taxon2).addMisappliedName((Taxon)taxon1, citation, microcitation);
188 }else {
189 //TODO
190 logger.warn("TaxonRelationShipType " + relTypeFk + " not yet implemented");
191 }
192
193
194 //....
195
196
197
198 }
199 logger.info("end makeFacts ...");
200 return true;
201 } catch (SQLException e) {
202 logger.error("SQLException:" + e);
203 return false;
204 }
205 }
206
207
208 /**
209 * @return
210 */
211 private boolean makeFacts(){
212 String dbAttrName;
213 String cdmAttrName;
214
215 logger.info("start makeFacts ...");
216 logger.warn("Facts not yet implemented !!");
217
218 //IAgentService agentService = cdmApp.getAgentService();
219 boolean delete = deleteAll;
220
221 // if (delete){
222 // List<Agent> listAllAgents = agentService.getAllAgents(0, 1000);
223 // while(listAllAgents.size() > 0 ){
224 // for (Agent name : listAllAgents ){
225 // //FIXME
226 // //nameService.remove(name);
227 // }
228 // listAllAgents = agentService.getAllAgents(0, 1000);
229 // }
230 // }
231 try {
232 //get data from database
233 String strQuery =
234 " SELECT * " +
235 " FROM Facts " ;
236 ResultSet rs = source.getResultSet(strQuery) ;
237 int i = 0;
238 //for each reference
239 while (rs.next()){
240
241 if ((i++ % modCount) == 0){ logger.info("Facts handled: " + (i-1));}
242
243 //create TaxonName element
244 int factId = rs.getInt("factId");
245
246 //....
247
248
249
250 }
251 logger.info("end makeFacts ...");
252 return true;
253 } catch (SQLException e) {
254 logger.error("SQLException:" + e);
255 return false;
256 }
257 }
258
259
260
261
262
263
264 }