(no commit message)
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / BerlinModelReferenceIO.java
1 /**
2 *
3 */
4 package eu.etaxonomy.cdm.io.berlinModel;
5
6 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_ARTICLE;
7 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_BOOK;
8 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_DATABASE;
9 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_INFORMAL;
10 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_JOURNAL;
11 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_PART_OF_OTHER_TITLE;
12 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_UNKNOWN;
13 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_WEBSITE;
14
15 import java.sql.ResultSet;
16 import java.sql.SQLException;
17 import java.util.ArrayList;
18 import java.util.Iterator;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.UUID;
22
23 import org.apache.log4j.Logger;
24
25 import eu.etaxonomy.cdm.api.application.CdmApplicationController;
26 import eu.etaxonomy.cdm.api.service.IReferenceService;
27 import eu.etaxonomy.cdm.io.source.Source;
28 import eu.etaxonomy.cdm.model.agent.Agent;
29 import eu.etaxonomy.cdm.model.common.Annotation;
30 import eu.etaxonomy.cdm.model.common.Language;
31 import eu.etaxonomy.cdm.model.reference.Article;
32 import eu.etaxonomy.cdm.model.reference.Book;
33 import eu.etaxonomy.cdm.model.reference.BookSection;
34 import eu.etaxonomy.cdm.model.reference.Database;
35 import eu.etaxonomy.cdm.model.reference.Generic;
36 import eu.etaxonomy.cdm.model.reference.Journal;
37 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
38 import eu.etaxonomy.cdm.model.reference.StrictReferenceBase;
39
40 /**
41 * @author a.mueller
42 *
43 */
44 public class BerlinModelReferenceIO {
45 private static final Logger logger = Logger.getLogger(BerlinModelReferenceIO.class);
46
47 private static int modCount = 1000;
48
49 public static boolean invoke(Source source, CdmApplicationController cdmApp, boolean deleteAll,
50 MapWrapper<ReferenceBase> referenceMap, MapWrapper<Agent> authorMap){
51
52 String dbAttrName;
53 String cdmAttrName;
54 boolean success = true;
55 MapWrapper<ReferenceBase> referenceStore= new MapWrapper<ReferenceBase>(null);
56 //Map<Integer, ReferenceBase> referenceCollectionMap = new HashMap<Integer, ReferenceBase>();
57
58
59 logger.info("start makeReferences ...");
60 IReferenceService referenceService = cdmApp.getReferenceService();
61 boolean delete = deleteAll;
62
63 // if (delete){
64 // List<TaxonNameBase> listAllReferences = referenceService.getAllReferences(0, 1000);
65 // while(listAllReferences.size() > 0 ){
66 // for (TaxonNameBase name : listAllReferences ){
67 // //FIXME
68 // //nameService.remove(name);
69 // }
70 // listAllReferences = referenceService.getAllReferences(0, 1000);
71 // }
72 // }
73 try {
74
75
76 //get data from database
77 String strQueryBase =
78 " SELECT Reference.* , InReference.RefId as InRefId, InReference.RefCategoryFk as InRefCategoryFk, " +
79 " InInReference.RefId as InInRefId, InInReference.RefCategoryFk as InInRefCategoryFk, " +
80 " InReference.InRefFk AS InRefInRefFk, InInReference.InRefFk AS InInRefInRefFk " +
81 " FROM Reference AS InInReference " +
82 " RIGHT OUTER JOIN Reference AS InReference ON InInReference.RefId = InReference.InRefFk " +
83 " RIGHT OUTER JOIN Reference ON InReference.RefId = dbo.Reference.InRefFk " +
84 " WHERE (1=1) AND Reference.refId = 7000000 " ;
85 String strQueryNoInRef = strQueryBase +
86 " AND (Reference.InRefFk is NULL) ";
87
88
89 String strQuery1InRef = strQueryBase +
90 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
91
92 String strQuery2InRef = strQueryBase +
93 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
94
95 String strQueryTesMaxRecursion = strQueryBase +
96 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
97
98 ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTesMaxRecursion);
99 if (testMaxRecursionResultSet.next() == true){
100 logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");
101 return false;
102 }
103
104 List<ResultSet> resultSetList = new ArrayList<ResultSet>();
105 resultSetList.add(source.getResultSet(strQueryNoInRef));
106 resultSetList.add(source.getResultSet(strQuery1InRef));
107 resultSetList.add(source.getResultSet(strQuery2InRef));
108
109 int i = 0;
110 //for each reference
111 Iterator<ResultSet> resultSetListIterator = resultSetList.listIterator();
112 while (resultSetListIterator.hasNext()){
113 i = 0;
114 ResultSet rs = resultSetListIterator.next();
115 while (rs.next()){
116
117 if ((i++ % modCount) == 0){ logger.info("References handled: " + (i-1));}
118
119 //create TaxonName element
120 int refId = rs.getInt("refId");
121 int categoryFk = rs.getInt("refCategoryFk");
122 Object inRefFk = rs.getObject("inRefFk");
123 int inRefCategoryFk = rs.getInt("InRefCategoryFk");
124
125 StrictReferenceBase referenceBase;
126 try {
127 logger.debug("RefCategoryFk: " + categoryFk);
128
129 if (categoryFk == REF_JOURNAL){
130 referenceBase = new Journal();
131 }else if(categoryFk == REF_BOOK){
132 referenceBase = new Book();
133 }else if(categoryFk == REF_ARTICLE){
134 referenceBase = new Article();
135 if (inRefFk != null){
136 if (inRefCategoryFk == REF_JOURNAL){
137 int inRefFkInt = (Integer)inRefFk;
138 if (referenceStore.containsId(inRefFkInt)){
139 ReferenceBase inJournal = referenceStore.get(inRefFkInt);
140 if (Journal.class.isAssignableFrom(inJournal.getClass())){
141 ((Article)referenceBase).setInJournal((Journal)inJournal);
142 }else{
143 logger.warn("InJournal is not of type journal but of type " + inJournal.getClass().getSimpleName() +
144 " Inreference relation could not be set");
145 }
146 }else{
147 logger.error("Journal for Article (refID = " + refId +") could not be found. Inconsistency error. ");
148 return false;
149 }
150 }else{
151 logger.warn("Wrong inrefCategory for Article (refID = " + refId +"). Type must be 'Journal' but was not)." +
152 " InReference was not added to Article! ");
153 }
154 }
155 }else if(categoryFk == REF_DATABASE){
156 referenceBase = new Database();
157 }else if(categoryFk == REF_PART_OF_OTHER_TITLE){
158 if (inRefCategoryFk == REF_BOOK){
159 referenceBase = new BookSection();
160 if (inRefFk != null){
161 int inRefFkInt = (Integer)inRefFk;
162 if (referenceStore.containsId(inRefFkInt)){
163 ReferenceBase inBook = referenceStore.get(inRefFkInt);
164 if (Book.class.isAssignableFrom(inBook.getClass())){
165 ((BookSection)referenceBase).setInBook((Book)inBook);
166 }else{
167 logger.warn("InBook is not of type book but of type " + inBook.getClass().getSimpleName() +
168 " Inreference relation could not be set");
169 }
170 }else{
171 logger.error("Book (refId = " + inRefFkInt + " for part_of_other_title (refID = " + refId +") could not be found in Hashmap. Inconsistency error. ");
172 return false;
173 }
174 }
175 }else if (inRefCategoryFk == REF_ARTICLE){
176 //TODO
177 logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' is part of 'article'." +
178 " This type is not implemented yet. Generic reference created instead") ;
179 referenceBase = new Generic();
180 }else{
181 logger.warn("InReference type (catFk = " + inRefCategoryFk + ") of part-of-reference not recognized for refId " + refId + "." +
182 " Create 'Generic' reference instead");
183 referenceBase = new Generic();
184 }
185 }else if(categoryFk == REF_INFORMAL){
186 if (logger.isDebugEnabled()){logger.debug("RefType 'Informal'");}
187 referenceBase = new Generic();
188 }else if(categoryFk == REF_WEBSITE){
189 if (logger.isDebugEnabled()){logger.debug("RefType 'Website'");}
190 referenceBase = new Generic();
191 }else if(categoryFk == REF_UNKNOWN){
192 if (logger.isDebugEnabled()){logger.debug("RefType 'Unknown'");}
193 referenceBase = new Generic();
194 }else{
195 logger.warn("Unknown categoryFk (" + categoryFk + "). Create 'Generic instead'");
196 referenceBase = new Generic();
197 }
198
199 dbAttrName = "refCache";
200 cdmAttrName = "titleCache";
201 //TODO wohin kommt der refCache
202 //INomenclaturalReference hat nur getNomenclaturalCitation , müsste es nicht so was wie setAbbrevTitle geben?
203 success &= ImportHelper.addStringValue(rs, referenceBase, dbAttrName, cdmAttrName);
204
205 dbAttrName = "nomRefCache";
206 cdmAttrName = "titleCache";
207 success &= ImportHelper.addStringValue(rs, referenceBase, dbAttrName, cdmAttrName);
208
209
210 //refId
211 //TODO
212 // Annotation annotation = new Annotation("Berlin Model id: " + String.valueOf(refId), Language.DEFAULT());
213 // referenceBase.addAnnotations(annotation);
214 //referenceBase.setLsid(String.valueOf(refId));
215
216 // dbAttrName = "BinomHybFlag";
217 // cdmAttrName = "isBinomHybrid";
218 // ImportHelper.addBooleanValue(rs, ref, dbAttrName, cdmAttrName);
219
220 //TODO
221 // all attributes
222
223 if (! referenceStore.containsId(refId)){
224 referenceStore.put(refId, referenceBase);
225 referenceMap.put(refId, referenceBase);
226 }else{
227 logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
228 }
229 } catch (Exception e) {
230 logger.warn("Reference with id " + refId + " threw Exception and could not be saved");
231 e.printStackTrace();
232 success = false;
233 return success;
234 }
235
236 } // end resultSet
237 //save and store in map
238 referenceService.saveReferenceAll(referenceStore.objects());
239 }//end resultSetList
240
241 logger.info("end makeReferences ...");
242 return success;
243 } catch (SQLException e) {
244 logger.error("SQLException:" + e);
245 return false;
246 }
247 }
248
249 }