(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) ";
85 //strQueryBase += " AND Reference.refId = 7000000 " ;
86 String strQueryNoInRef = strQueryBase +
87 " AND (Reference.InRefFk is NULL) ";
88
89
90 String strQuery1InRef = strQueryBase +
91 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
92
93 String strQuery2InRef = strQueryBase +
94 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
95
96 String strQueryTesMaxRecursion = strQueryBase +
97 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
98
99 ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTesMaxRecursion);
100 if (testMaxRecursionResultSet.next() == true){
101 logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");
102 return false;
103 }
104
105 List<ResultSet> resultSetList = new ArrayList<ResultSet>();
106 resultSetList.add(source.getResultSet(strQueryNoInRef));
107 resultSetList.add(source.getResultSet(strQuery1InRef));
108 resultSetList.add(source.getResultSet(strQuery2InRef));
109
110 int i = 0;
111 //for each reference
112 Iterator<ResultSet> resultSetListIterator = resultSetList.listIterator();
113 while (resultSetListIterator.hasNext()){
114 i = 0;
115 ResultSet rs = resultSetListIterator.next();
116 while (rs.next()){
117
118 if ((i++ % modCount) == 0){ logger.info("References handled: " + (i-1));}
119
120 //create TaxonName element
121 int refId = rs.getInt("refId");
122 int categoryFk = rs.getInt("refCategoryFk");
123 Object inRefFk = rs.getObject("inRefFk");
124 int inRefCategoryFk = rs.getInt("InRefCategoryFk");
125
126 StrictReferenceBase referenceBase;
127 try {
128 logger.debug("RefCategoryFk: " + categoryFk);
129
130 if (categoryFk == REF_JOURNAL){
131 referenceBase = new Journal();
132 }else if(categoryFk == REF_BOOK){
133 referenceBase = new Book();
134 }else if(categoryFk == REF_ARTICLE){
135 referenceBase = new Article();
136 if (inRefFk != null){
137 if (inRefCategoryFk == REF_JOURNAL){
138 int inRefFkInt = (Integer)inRefFk;
139 if (referenceStore.containsId(inRefFkInt)){
140 ReferenceBase inJournal = referenceStore.get(inRefFkInt);
141 if (Journal.class.isAssignableFrom(inJournal.getClass())){
142 ((Article)referenceBase).setInJournal((Journal)inJournal);
143 }else{
144 logger.warn("InJournal is not of type journal but of type " + inJournal.getClass().getSimpleName() +
145 " Inreference relation could not be set");
146 }
147 }else{
148 logger.error("Journal for Article (refID = " + refId +") could not be found. Inconsistency error. ");
149 return false;
150 }
151 }else{
152 logger.warn("Wrong inrefCategory for Article (refID = " + refId +"). Type must be 'Journal' but was not)." +
153 " InReference was not added to Article! ");
154 }
155 }
156 }else if(categoryFk == REF_DATABASE){
157 referenceBase = new Database();
158 }else if(categoryFk == REF_PART_OF_OTHER_TITLE){
159 if (inRefCategoryFk == REF_BOOK){
160 referenceBase = new BookSection();
161 if (inRefFk != null){
162 int inRefFkInt = (Integer)inRefFk;
163 if (referenceStore.containsId(inRefFkInt)){
164 ReferenceBase inBook = referenceStore.get(inRefFkInt);
165 if (Book.class.isAssignableFrom(inBook.getClass())){
166 ((BookSection)referenceBase).setInBook((Book)inBook);
167 }else{
168 logger.warn("InBook is not of type book but of type " + inBook.getClass().getSimpleName() +
169 " Inreference relation could not be set");
170 }
171 }else{
172 logger.error("Book (refId = " + inRefFkInt + " for part_of_other_title (refID = " + refId +") could not be found in Hashmap. Inconsistency error. ");
173 return false;
174 }
175 }
176 }else if (inRefCategoryFk == REF_ARTICLE){
177 //TODO
178 logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' is part of 'article'." +
179 " This type is not implemented yet. Generic reference created instead") ;
180 referenceBase = new Generic();
181 }else{
182 logger.warn("InReference type (catFk = " + inRefCategoryFk + ") of part-of-reference not recognized for refId " + refId + "." +
183 " Create 'Generic' reference instead");
184 referenceBase = new Generic();
185 }
186 }else if(categoryFk == REF_INFORMAL){
187 if (logger.isDebugEnabled()){logger.debug("RefType 'Informal'");}
188 referenceBase = new Generic();
189 }else if(categoryFk == REF_WEBSITE){
190 if (logger.isDebugEnabled()){logger.debug("RefType 'Website'");}
191 referenceBase = new Generic();
192 }else if(categoryFk == REF_UNKNOWN){
193 if (logger.isDebugEnabled()){logger.debug("RefType 'Unknown'");}
194 referenceBase = new Generic();
195 }else{
196 logger.warn("Unknown categoryFk (" + categoryFk + "). Create 'Generic instead'");
197 referenceBase = new Generic();
198 }
199
200 dbAttrName = "refCache";
201 cdmAttrName = "titleCache";
202 //TODO wohin kommt der refCache
203 //INomenclaturalReference hat nur getNomenclaturalCitation , müsste es nicht so was wie setAbbrevTitle geben?
204 success &= ImportHelper.addStringValue(rs, referenceBase, dbAttrName, cdmAttrName);
205
206 dbAttrName = "nomRefCache";
207 cdmAttrName = "titleCache";
208 success &= ImportHelper.addStringValue(rs, referenceBase, dbAttrName, cdmAttrName);
209
210
211 //refId
212 //TODO
213 // Annotation annotation = new Annotation("Berlin Model id: " + String.valueOf(refId), Language.DEFAULT());
214 // referenceBase.addAnnotations(annotation);
215 //referenceBase.setLsid(String.valueOf(refId));
216
217 // dbAttrName = "BinomHybFlag";
218 // cdmAttrName = "isBinomHybrid";
219 // ImportHelper.addBooleanValue(rs, ref, dbAttrName, cdmAttrName);
220
221 //TODO
222 // all attributes
223
224 if (! referenceStore.containsId(refId)){
225 referenceStore.put(refId, referenceBase);
226 referenceMap.put(refId, referenceBase);
227 }else{
228 logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
229 }
230 } catch (Exception e) {
231 logger.warn("Reference with id " + refId + " threw Exception and could not be saved");
232 e.printStackTrace();
233 success = false;
234 return success;
235 }
236
237 } // end resultSet
238 //save and store in map
239 referenceService.saveReferenceAll(referenceStore.objects());
240 }//end resultSetList
241
242 logger.info("end makeReferences ...");
243 return success;
244 } catch (SQLException e) {
245 logger.error("SQLException:" + e);
246 return false;
247 }
248 }
249
250 }