(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.common.OriginalSource;
32 import eu.etaxonomy.cdm.model.reference.Article;
33 import eu.etaxonomy.cdm.model.reference.Book;
34 import eu.etaxonomy.cdm.model.reference.BookSection;
35 import eu.etaxonomy.cdm.model.reference.Database;
36 import eu.etaxonomy.cdm.model.reference.Generic;
37 import eu.etaxonomy.cdm.model.reference.Journal;
38 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
39 import eu.etaxonomy.cdm.model.reference.StrictReferenceBase;
40
41 /**
42 * @author a.mueller
43 *
44 */
45 public class BerlinModelReferenceIO {
46 private static final Logger logger = Logger.getLogger(BerlinModelReferenceIO.class);
47
48 private static int modCount = 1000;
49
50 public static boolean invoke(ReferenceBase berlinModelRef, Source source, CdmApplicationController cdmApp, boolean deleteAll,
51 MapWrapper<ReferenceBase> referenceMap, MapWrapper<Agent> authorMap){
52
53 String dbAttrName;
54 String cdmAttrName;
55 boolean success = true;
56 MapWrapper<ReferenceBase> referenceStore= new MapWrapper<ReferenceBase>(null);
57 //Map<Integer, ReferenceBase> referenceCollectionMap = new HashMap<Integer, ReferenceBase>();
58
59
60 logger.info("start makeReferences ...");
61 IReferenceService referenceService = cdmApp.getReferenceService();
62 boolean delete = deleteAll;
63
64 // if (delete){
65 // List<TaxonNameBase> listAllReferences = referenceService.getAllReferences(0, 1000);
66 // while(listAllReferences.size() > 0 ){
67 // for (TaxonNameBase name : listAllReferences ){
68 // //FIXME
69 // //nameService.remove(name);
70 // }
71 // listAllReferences = referenceService.getAllReferences(0, 1000);
72 // }
73 // }
74 try {
75
76
77 //get data from database
78 String strQueryBase =
79 " SELECT Reference.* , InReference.RefId as InRefId, InReference.RefCategoryFk as InRefCategoryFk, " +
80 " InInReference.RefId as InInRefId, InInReference.RefCategoryFk as InInRefCategoryFk, " +
81 " InReference.InRefFk AS InRefInRefFk, InInReference.InRefFk AS InInRefInRefFk " +
82 " FROM Reference AS InInReference " +
83 " RIGHT OUTER JOIN Reference AS InReference ON InInReference.RefId = InReference.InRefFk " +
84 " RIGHT OUTER JOIN Reference ON InReference.RefId = dbo.Reference.InRefFk " +
85 " WHERE (1=1) ";
86 //strQueryBase += " AND Reference.refId = 7000000 " ;
87 String strQueryNoInRef = strQueryBase +
88 " AND (Reference.InRefFk is NULL) ";
89
90
91 String strQuery1InRef = strQueryBase +
92 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
93
94 String strQuery2InRef = strQueryBase +
95 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
96
97 String strQueryTesMaxRecursion = strQueryBase +
98 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
99
100 ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTesMaxRecursion);
101 if (testMaxRecursionResultSet.next() == true){
102 logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");
103 return false;
104 }
105
106 List<ResultSet> resultSetList = new ArrayList<ResultSet>();
107 resultSetList.add(source.getResultSet(strQueryNoInRef));
108 resultSetList.add(source.getResultSet(strQuery1InRef));
109 resultSetList.add(source.getResultSet(strQuery2InRef));
110
111 int i = 0;
112 //for each reference
113 Iterator<ResultSet> resultSetListIterator = resultSetList.listIterator();
114 while (resultSetListIterator.hasNext()){
115 i = 0;
116 ResultSet rs = resultSetListIterator.next();
117 while (rs.next()){
118
119 if ((i++ % modCount) == 0){ logger.info("References handled: " + (i-1));}
120
121 //create TaxonName element
122 int refId = rs.getInt("refId");
123 int categoryFk = rs.getInt("refCategoryFk");
124 Object inRefFk = rs.getObject("inRefFk");
125 int inRefCategoryFk = rs.getInt("InRefCategoryFk");
126
127 StrictReferenceBase referenceBase;
128 try {
129 logger.debug("RefCategoryFk: " + categoryFk);
130
131 if (categoryFk == REF_JOURNAL){
132 referenceBase = new Journal();
133 }else if(categoryFk == REF_BOOK){
134 referenceBase = new Book();
135 }else if(categoryFk == REF_ARTICLE){
136 referenceBase = new Article();
137 if (inRefFk != null){
138 if (inRefCategoryFk == REF_JOURNAL){
139 int inRefFkInt = (Integer)inRefFk;
140 if (referenceStore.containsId(inRefFkInt)){
141 ReferenceBase inJournal = referenceStore.get(inRefFkInt);
142 if (Journal.class.isAssignableFrom(inJournal.getClass())){
143 ((Article)referenceBase).setInJournal((Journal)inJournal);
144 }else{
145 logger.warn("InJournal is not of type journal but of type " + inJournal.getClass().getSimpleName() +
146 " Inreference relation could not be set");
147 }
148 }else{
149 logger.error("Journal for Article (refID = " + refId +") could not be found. Inconsistency error. ");
150 return false;
151 }
152 }else{
153 logger.warn("Wrong inrefCategory for Article (refID = " + refId +"). Type must be 'Journal' but was not)." +
154 " InReference was not added to Article! ");
155 }
156 }
157 }else if(categoryFk == REF_DATABASE){
158 referenceBase = new Database();
159 }else if(categoryFk == REF_PART_OF_OTHER_TITLE){
160 if (inRefCategoryFk == REF_BOOK){
161 referenceBase = new BookSection();
162 if (inRefFk != null){
163 int inRefFkInt = (Integer)inRefFk;
164 if (referenceStore.containsId(inRefFkInt)){
165 ReferenceBase inBook = referenceStore.get(inRefFkInt);
166 if (Book.class.isAssignableFrom(inBook.getClass())){
167 ((BookSection)referenceBase).setInBook((Book)inBook);
168 }else{
169 logger.warn("InBook is not of type book but of type " + inBook.getClass().getSimpleName() +
170 " Inreference relation could not be set");
171 }
172 }else{
173 logger.error("Book (refId = " + inRefFkInt + " for part_of_other_title (refID = " + refId +") could not be found in Hashmap. Inconsistency error. ");
174 return false;
175 }
176 }
177 }else if (inRefCategoryFk == REF_ARTICLE){
178 //TODO
179 logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' is part of 'article'." +
180 " This type is not implemented yet. Generic reference created instead") ;
181 referenceBase = new Generic();
182 }else{
183 logger.warn("InReference type (catFk = " + inRefCategoryFk + ") of part-of-reference not recognized for refId " + refId + "." +
184 " Create 'Generic' reference instead");
185 referenceBase = new Generic();
186 }
187 }else if(categoryFk == REF_INFORMAL){
188 if (logger.isDebugEnabled()){logger.debug("RefType 'Informal'");}
189 referenceBase = new Generic();
190 }else if(categoryFk == REF_WEBSITE){
191 if (logger.isDebugEnabled()){logger.debug("RefType 'Website'");}
192 referenceBase = new Generic();
193 }else if(categoryFk == REF_UNKNOWN){
194 if (logger.isDebugEnabled()){logger.debug("RefType 'Unknown'");}
195 referenceBase = new Generic();
196 }else{
197 logger.warn("Unknown categoryFk (" + categoryFk + "). Create 'Generic instead'");
198 referenceBase = new Generic();
199 }
200
201 dbAttrName = "refCache";
202 cdmAttrName = "titleCache";
203 //TODO wohin kommt der refCache
204 //INomenclaturalReference hat nur getNomenclaturalCitation , müsste es nicht so was wie setAbbrevTitle geben?
205 success &= ImportHelper.addStringValue(rs, referenceBase, dbAttrName, cdmAttrName);
206
207 dbAttrName = "nomRefCache";
208 cdmAttrName = "titleCache";
209 success &= ImportHelper.addStringValue(rs, referenceBase, dbAttrName, cdmAttrName);
210
211 OriginalSource originalSource = new OriginalSource();
212 originalSource.setIdInSource(String.valueOf(refId));
213 originalSource.setCitation(berlinModelRef);
214 referenceBase.addSource(originalSource);
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 }