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
.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
;
46 public class BerlinModelReferenceIO
{
47 private static final Logger logger
= Logger
.getLogger(BerlinModelReferenceIO
.class);
49 private static int modCount
= 1000;
51 public static boolean invoke(ReferenceBase berlinModelRef
, Source source
, CdmApplicationController cdmApp
, boolean deleteAll
,
52 MapWrapper
<ReferenceBase
> referenceMap
, MapWrapper
<Team
> authorMap
){
56 boolean success
= true;
57 MapWrapper
<ReferenceBase
> referenceStore
= new MapWrapper
<ReferenceBase
>(null);
58 //Map<Integer, ReferenceBase> referenceCollectionMap = new HashMap<Integer, ReferenceBase>();
61 logger
.info("start makeReferences ...");
62 IReferenceService referenceService
= cdmApp
.getReferenceService();
63 boolean delete
= deleteAll
;
66 // List<TaxonNameBase> listAllReferences = referenceService.getAllReferences(0, 1000);
67 // while(listAllReferences.size() > 0 ){
68 // for (TaxonNameBase name : listAllReferences ){
70 // //nameService.remove(name);
72 // listAllReferences = referenceService.getAllReferences(0, 1000);
78 //get data from database
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 " +
87 //strQueryBase += " AND Reference.refId = 7000000 " ;
88 String strQueryNoInRef
= strQueryBase
+
89 " AND (Reference.InRefFk is NULL) ";
92 String strQuery1InRef
= strQueryBase
+
93 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
95 String strQuery2InRef
= strQueryBase
+
96 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
98 String strQueryTesMaxRecursion
= strQueryBase
+
99 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
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.");
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
));
114 Iterator
<ResultSet
> resultSetListIterator
= resultSetList
.listIterator();
115 while (resultSetListIterator
.hasNext()){
117 ResultSet rs
= resultSetListIterator
.next();
120 if ((i
++ % modCount
) == 0){ logger
.info("References handled: " + (i
-1));}
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");
128 StrictReferenceBase referenceBase
;
130 logger
.debug("RefCategoryFk: " + categoryFk
);
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
);
146 logger
.warn("InJournal is not of type journal but of type " + inJournal
.getClass().getSimpleName() +
147 " Inreference relation could not be set");
150 logger
.error("Journal for Article (refID = " + refId
+") could not be found. Inconsistency error. ");
154 logger
.warn("Wrong inrefCategory for Article (refID = " + refId
+"). Type must be 'Journal' but was not)." +
155 " InReference was not added to Article! ");
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
);
170 logger
.warn("InBook is not of type book but of type " + inBook
.getClass().getSimpleName() +
171 " Inreference relation could not be set");
174 logger
.error("Book (refId = " + inRefFkInt
+ " for part_of_other_title (refID = " + refId
+") could not be found in Hashmap. Inconsistency error. ");
178 }else if (inRefCategoryFk
== REF_ARTICLE
){
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();
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();
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();
198 logger
.warn("Unknown categoryFk (" + categoryFk
+ "). Create 'Generic instead'");
199 referenceBase
= new Generic();
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
);
208 dbAttrName
= "nomRefCache";
209 cdmAttrName
= "titleCache";
210 success
&= ImportHelper
.addStringValue(rs
, referenceBase
, dbAttrName
, cdmAttrName
);
213 ImportHelper
.setOriginalSource(referenceBase
, berlinModelRef
, refId
);
215 // dbAttrName = "BinomHybFlag";
216 // cdmAttrName = "isBinomHybrid";
217 // ImportHelper.addBooleanValue(rs, ref, dbAttrName, cdmAttrName);
222 if (! referenceStore
.containsId(refId
)){
223 referenceStore
.put(refId
, referenceBase
);
224 referenceMap
.put(refId
, referenceBase
);
226 logger
.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
228 } catch (Exception e
) {
229 logger
.warn("Reference with id " + refId
+ " threw Exception and could not be saved");
236 //save and store in map
237 referenceService
.saveReferenceAll(referenceStore
.objects());
240 logger
.info("end makeReferences ...");
242 } catch (SQLException e
) {
243 logger
.error("SQLException:" + e
);