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
.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
;
44 public class BerlinModelReferenceIO
{
45 private static final Logger logger
= Logger
.getLogger(BerlinModelReferenceIO
.class);
47 private static int modCount
= 1000;
49 public static boolean invoke(Source source
, CdmApplicationController cdmApp
, boolean deleteAll
,
50 MapWrapper
<ReferenceBase
> referenceMap
, MapWrapper
<Agent
> authorMap
){
54 boolean success
= true;
55 MapWrapper
<ReferenceBase
> referenceStore
= new MapWrapper
<ReferenceBase
>(null);
56 //Map<Integer, ReferenceBase> referenceCollectionMap = new HashMap<Integer, ReferenceBase>();
59 logger
.info("start makeReferences ...");
60 IReferenceService referenceService
= cdmApp
.getReferenceService();
61 boolean delete
= deleteAll
;
64 // List<TaxonNameBase> listAllReferences = referenceService.getAllReferences(0, 1000);
65 // while(listAllReferences.size() > 0 ){
66 // for (TaxonNameBase name : listAllReferences ){
68 // //nameService.remove(name);
70 // listAllReferences = referenceService.getAllReferences(0, 1000);
76 //get data from database
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) ";
89 String strQuery1InRef
= strQueryBase
+
90 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
92 String strQuery2InRef
= strQueryBase
+
93 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
95 String strQueryTesMaxRecursion
= strQueryBase
+
96 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
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.");
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
));
111 Iterator
<ResultSet
> resultSetListIterator
= resultSetList
.listIterator();
112 while (resultSetListIterator
.hasNext()){
114 ResultSet rs
= resultSetListIterator
.next();
117 if ((i
++ % modCount
) == 0){ logger
.info("References handled: " + (i
-1));}
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");
125 StrictReferenceBase referenceBase
;
127 logger
.debug("RefCategoryFk: " + categoryFk
);
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
);
143 logger
.warn("InJournal is not of type journal but of type " + inJournal
.getClass().getSimpleName() +
144 " Inreference relation could not be set");
147 logger
.error("Journal for Article (refID = " + refId
+") could not be found. Inconsistency error. ");
151 logger
.warn("Wrong inrefCategory for Article (refID = " + refId
+"). Type must be 'Journal' but was not)." +
152 " InReference was not added to Article! ");
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
);
167 logger
.warn("InBook is not of type book but of type " + inBook
.getClass().getSimpleName() +
168 " Inreference relation could not be set");
171 logger
.error("Book (refId = " + inRefFkInt
+ " for part_of_other_title (refID = " + refId
+") could not be found in Hashmap. Inconsistency error. ");
175 }else if (inRefCategoryFk
== REF_ARTICLE
){
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();
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();
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();
195 logger
.warn("Unknown categoryFk (" + categoryFk
+ "). Create 'Generic instead'");
196 referenceBase
= new Generic();
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
);
205 dbAttrName
= "nomRefCache";
206 cdmAttrName
= "titleCache";
207 success
&= ImportHelper
.addStringValue(rs
, referenceBase
, dbAttrName
, cdmAttrName
);
212 // Annotation annotation = new Annotation("Berlin Model id: " + String.valueOf(refId), Language.DEFAULT());
213 // referenceBase.addAnnotations(annotation);
214 //referenceBase.setLsid(String.valueOf(refId));
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
);