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 " +
85 //strQueryBase += " AND Reference.refId = 7000000 " ;
86 String strQueryNoInRef
= strQueryBase
+
87 " AND (Reference.InRefFk is NULL) ";
90 String strQuery1InRef
= strQueryBase
+
91 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
93 String strQuery2InRef
= strQueryBase
+
94 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
96 String strQueryTesMaxRecursion
= strQueryBase
+
97 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
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.");
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
));
112 Iterator
<ResultSet
> resultSetListIterator
= resultSetList
.listIterator();
113 while (resultSetListIterator
.hasNext()){
115 ResultSet rs
= resultSetListIterator
.next();
118 if ((i
++ % modCount
) == 0){ logger
.info("References handled: " + (i
-1));}
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");
126 StrictReferenceBase referenceBase
;
128 logger
.debug("RefCategoryFk: " + categoryFk
);
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
);
144 logger
.warn("InJournal is not of type journal but of type " + inJournal
.getClass().getSimpleName() +
145 " Inreference relation could not be set");
148 logger
.error("Journal for Article (refID = " + refId
+") could not be found. Inconsistency error. ");
152 logger
.warn("Wrong inrefCategory for Article (refID = " + refId
+"). Type must be 'Journal' but was not)." +
153 " InReference was not added to Article! ");
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
);
168 logger
.warn("InBook is not of type book but of type " + inBook
.getClass().getSimpleName() +
169 " Inreference relation could not be set");
172 logger
.error("Book (refId = " + inRefFkInt
+ " for part_of_other_title (refID = " + refId
+") could not be found in Hashmap. Inconsistency error. ");
176 }else if (inRefCategoryFk
== REF_ARTICLE
){
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();
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();
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();
196 logger
.warn("Unknown categoryFk (" + categoryFk
+ "). Create 'Generic instead'");
197 referenceBase
= new Generic();
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
);
206 dbAttrName
= "nomRefCache";
207 cdmAttrName
= "titleCache";
208 success
&= ImportHelper
.addStringValue(rs
, referenceBase
, dbAttrName
, cdmAttrName
);
213 // Annotation annotation = new Annotation("Berlin Model id: " + String.valueOf(refId), Language.DEFAULT());
214 // referenceBase.addAnnotations(annotation);
215 //referenceBase.setLsid(String.valueOf(refId));
217 // dbAttrName = "BinomHybFlag";
218 // cdmAttrName = "isBinomHybrid";
219 // ImportHelper.addBooleanValue(rs, ref, dbAttrName, cdmAttrName);
224 if (! referenceStore
.containsId(refId
)){
225 referenceStore
.put(refId
, referenceBase
);
226 referenceMap
.put(refId
, referenceBase
);
228 logger
.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
230 } catch (Exception e
) {
231 logger
.warn("Reference with id " + refId
+ " threw Exception and could not be saved");
238 //save and store in map
239 referenceService
.saveReferenceAll(referenceStore
.objects());
242 logger
.info("end makeReferences ...");
244 } catch (SQLException e
) {
245 logger
.error("SQLException:" + e
);