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