4 package eu
.etaxonomy
.cdm
.io
.berlinModel
;
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
;
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
;
21 import java
.util
.UUID
;
23 import org
.apache
.log4j
.Logger
;
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
;
45 public class BerlinModelReferenceIO
{
46 private static final Logger logger
= Logger
.getLogger(BerlinModelReferenceIO
.class);
48 private static int modCount
= 1000;
50 public static boolean invoke(ReferenceBase berlinModelRef
, Source source
, CdmApplicationController cdmApp
, boolean deleteAll
,
51 MapWrapper
<ReferenceBase
> referenceMap
, MapWrapper
<Agent
> authorMap
){
55 boolean success
= true;
56 MapWrapper
<ReferenceBase
> referenceStore
= new MapWrapper
<ReferenceBase
>(null);
57 //Map<Integer, ReferenceBase> referenceCollectionMap = new HashMap<Integer, ReferenceBase>();
60 logger
.info("start makeReferences ...");
61 IReferenceService referenceService
= cdmApp
.getReferenceService();
62 boolean delete
= deleteAll
;
65 // List<TaxonNameBase> listAllReferences = referenceService.getAllReferences(0, 1000);
66 // while(listAllReferences.size() > 0 ){
67 // for (TaxonNameBase name : listAllReferences ){
69 // //nameService.remove(name);
71 // listAllReferences = referenceService.getAllReferences(0, 1000);
77 //get data from database
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 " +
86 //strQueryBase += " AND Reference.refId = 7000000 " ;
87 String strQueryNoInRef
= strQueryBase
+
88 " AND (Reference.InRefFk is NULL) ";
91 String strQuery1InRef
= strQueryBase
+
92 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
94 String strQuery2InRef
= strQueryBase
+
95 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
97 String strQueryTesMaxRecursion
= strQueryBase
+
98 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
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.");
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
));
113 Iterator
<ResultSet
> resultSetListIterator
= resultSetList
.listIterator();
114 while (resultSetListIterator
.hasNext()){
116 ResultSet rs
= resultSetListIterator
.next();
119 if ((i
++ % modCount
) == 0){ logger
.info("References handled: " + (i
-1));}
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");
127 StrictReferenceBase referenceBase
;
129 logger
.debug("RefCategoryFk: " + categoryFk
);
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
);
145 logger
.warn("InJournal is not of type journal but of type " + inJournal
.getClass().getSimpleName() +
146 " Inreference relation could not be set");
149 logger
.error("Journal for Article (refID = " + refId
+") could not be found. Inconsistency error. ");
153 logger
.warn("Wrong inrefCategory for Article (refID = " + refId
+"). Type must be 'Journal' but was not)." +
154 " InReference was not added to Article! ");
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
);
169 logger
.warn("InBook is not of type book but of type " + inBook
.getClass().getSimpleName() +
170 " Inreference relation could not be set");
173 logger
.error("Book (refId = " + inRefFkInt
+ " for part_of_other_title (refID = " + refId
+") could not be found in Hashmap. Inconsistency error. ");
177 }else if (inRefCategoryFk
== REF_ARTICLE
){
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();
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();
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();
197 logger
.warn("Unknown categoryFk (" + categoryFk
+ "). Create 'Generic instead'");
198 referenceBase
= new Generic();
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
);
207 dbAttrName
= "nomRefCache";
208 cdmAttrName
= "titleCache";
209 success
&= ImportHelper
.addStringValue(rs
, referenceBase
, dbAttrName
, cdmAttrName
);
211 OriginalSource originalSource
= new OriginalSource();
212 originalSource
.setIdInSource(String
.valueOf(refId
));
213 originalSource
.setCitation(berlinModelRef
);
214 referenceBase
.addSource(originalSource
);
216 // dbAttrName = "BinomHybFlag";
217 // cdmAttrName = "isBinomHybrid";
218 // ImportHelper.addBooleanValue(rs, ref, dbAttrName, cdmAttrName);
223 if (! referenceStore
.containsId(refId
)){
224 referenceStore
.put(refId
, referenceBase
);
225 referenceMap
.put(refId
, referenceBase
);
227 logger
.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
229 } catch (Exception e
) {
230 logger
.warn("Reference with id " + refId
+ " threw Exception and could not be saved");
237 //save and store in map
238 referenceService
.saveReferenceAll(referenceStore
.objects());
241 logger
.info("end makeReferences ...");
243 } catch (SQLException e
) {
244 logger
.error("SQLException:" + e
);