1 package eu
.etaxonomy
.cdm
.io
.berlinModel
;
3 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.*;
4 import java
.sql
.ResultSet
;
5 import java
.sql
.SQLException
;
6 import java
.util
.HashMap
;
11 import org
.apache
.log4j
.Logger
;
13 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationController
;
14 import eu
.etaxonomy
.cdm
.api
.service
.IAgentService
;
15 import eu
.etaxonomy
.cdm
.api
.service
.INameService
;
16 import eu
.etaxonomy
.cdm
.api
.service
.IReferenceService
;
17 import eu
.etaxonomy
.cdm
.api
.service
.IService
;
18 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
19 import eu
.etaxonomy
.cdm
.io
.source
.Source
;
20 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
21 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
22 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
23 import eu
.etaxonomy
.cdm
.model
.reference
.Article
;
24 import eu
.etaxonomy
.cdm
.model
.reference
.Book
;
25 import eu
.etaxonomy
.cdm
.model
.reference
.BookSection
;
26 import eu
.etaxonomy
.cdm
.model
.reference
.Database
;
27 import eu
.etaxonomy
.cdm
.model
.reference
.Generic
;
28 import eu
.etaxonomy
.cdm
.model
.reference
.Journal
;
29 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceBase
;
30 import eu
.etaxonomy
.cdm
.model
.reference
.StrictReferenceBase
;
31 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
32 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationshipType
;
33 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
34 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
35 import eu
.etaxonomy
.cdm
.strategy
.exceptions
.UnknownRankException
;
37 public class BerlinModelImport
{
38 private static final Logger logger
= Logger
.getLogger(BerlinModelImport
.class);
40 private boolean deleteAll
= false;
43 private Source source
;
46 private CdmApplicationController cdmApp
;
49 //final boolean OBLIGATORY = true;
50 //final boolean FACULTATIVE = false;
51 final int modCount
= 100;
55 private Map
<Integer
, UUID
> referenceMap
= new HashMap
<Integer
, UUID
>();
56 private Map
<Integer
, UUID
> taxonNameMap
= new HashMap
<Integer
, UUID
>();
57 private Map
<Integer
, UUID
> taxonMap
= new HashMap
<Integer
, UUID
>();
63 public boolean doImport(Source source
, CdmApplicationController cdmApp
){
64 if (source
== null || cdmApp
== null){
65 throw new NullPointerException("Source and CdmApplicationController must not be null");
70 //make and save Authors
73 //make and save References
74 if (! makeReferences()){
91 //make and save publications
92 /* makePublications(root);
93 saveToXml(root.getChild("Publications", nsTcs), outputPath, outputFileName + "Publications", format);
95 saveToXml(root.getChild("TaxonNames", nsTcs), outputPath, outputFileName + "_TaxonNames", format);
97 //make and save Concepts
99 saveToXml(root.getChild("TaxonConcepts", nsTcs), outputPath, outputFileName + "_TaxonConcepts", format);
109 private boolean makeAuthors(){
113 logger
.info("start makeAuthors ...");
114 logger
.warn("Authors not yet implemented !!");
116 IAgentService agentService
= cdmApp
.getAgentService();
117 boolean delete
= deleteAll
;
120 // List<Agent> listAllAgents = agentService.getAllAgents(0, 1000);
121 // while(listAllAgents.size() > 0 ){
122 // for (Agent name : listAllAgents ){
124 // //nameService.remove(name);
126 // listAllAgents = agentService.getAllAgents(0, 1000);
130 //get data from database
133 " FROM AuthorTeam " ;
134 ResultSet rs
= source
.getResultSet(strQuery
) ;
140 logger
.info("end makeAuthors ...");
142 // } catch (SQLException e) {
143 // logger.error("SQLException:" + e);
152 private boolean makeReferences(){
155 boolean success
= true;
157 logger
.info("start makeReferences ...");
158 IReferenceService referenceService
= cdmApp
.getReferenceService();
159 boolean delete
= deleteAll
;
162 // List<TaxonNameBase> listAllReferences = referenceService.getAllReferences(0, 1000);
163 // while(listAllReferences.size() > 0 ){
164 // for (TaxonNameBase name : listAllReferences ){
166 // //nameService.remove(name);
168 // listAllReferences = referenceService.getAllReferences(0, 1000);
174 //get data from database
176 " SELECT Reference.* , InReference.RefId as InRefId, InReference.RefCategoryFk as InRefCategoryFk, " +
177 " InInReference.RefId as InInRefId, InInReference.RefCategoryFk as InInRefCategoryFk " +
178 " FROM Reference AS InInReference " +
179 " RIGHT OUTER JOIN Reference AS InReference ON InInReference.RefId = InReference.InRefFk " +
180 " RIGHT OUTER JOIN Reference ON InReference.RefId = dbo.Reference.InRefFk ";
183 ResultSet rs
= source
.getResultSet(strQuery
) ;
189 if ((i
++ % modCount
) == 0){ logger
.info("References handled: " + (i
-1));}
191 //create TaxonName element
192 int refId
= rs
.getInt("refId");
193 int categoryFk
= rs
.getInt("refCategoryFk");
194 int inRefFk
= rs
.getInt("inRefFk");
195 int inRefCategoryFk
= rs
.getInt("InRefCategoryFk");
197 StrictReferenceBase ref
;
199 logger
.debug("RefCategoryFk: " + categoryFk
);
201 if (categoryFk
== REF_JOURNAL
){
203 }else if(categoryFk
== REF_BOOK
){
205 }else if(categoryFk
== REF_ARTICLE
){
207 }else if(categoryFk
== REF_DATABASE
){
208 ref
= new Database();
209 }else if(categoryFk
== REF_PART_OF_OTHER_TITLE
){
210 if (inRefCategoryFk
== REF_BOOK
){
212 ref
= new BookSection();
214 logger
.warn("Reference type of part-of-reference not recognized");
217 }else if(categoryFk
== REF_UNKNOWN
){
224 dbAttrName
= "refCache";
225 cdmAttrName
= "titleCache";
226 //TODO wohin kommt der refCache
227 //INomenclaturalReference hat nur getNomenclaturalCitation , müsste es nicht so was wie setAbbrevTitle geben?
228 success
&= ImportHelper
.addStringValue(rs
, ref
, dbAttrName
, cdmAttrName
);
230 dbAttrName
= "nomRefCache";
231 cdmAttrName
= "titleCache";
232 success
&= ImportHelper
.addStringValue(rs
, ref
, dbAttrName
, cdmAttrName
);
234 // dbAttrName = "BinomHybFlag";
235 // cdmAttrName = "isBinomHybrid";
236 // ImportHelper.addBooleanValue(rs, ref, dbAttrName, cdmAttrName);
242 UUID refUuid
= referenceService
.saveReference(ref
);
243 //Session sess = new Session().
244 referenceMap
.put(refId
, refUuid
);
246 } catch (Exception e
) {
247 logger
.warn("Reference with id " + refId
+ " threw Exception and could not be saved");
256 logger
.info("end makeReferences ...");
258 } catch (SQLException e
) {
259 logger
.error("SQLException:" + e
);
269 private boolean makeTaxonNames(){
272 boolean success
= true ;
274 logger
.info("start makeTaxonNames ...");
275 INameService nameService
= cdmApp
.getNameService();
276 boolean delete
= deleteAll
;
279 List
<TaxonNameBase
> listAllNames
= nameService
.getAllNames(0, 1000);
280 while(listAllNames
.size() > 0 ){
281 for (TaxonNameBase name
: listAllNames
){
283 //nameService.remove(name);
285 listAllNames
= nameService
.getAllNames(0, 1000);
292 //get data from database
294 "SELECT TOP 102 Name.* , RefDetail.RefDetailId, RefDetail.RefFk, " +
295 " RefDetail.FullRefCache, RefDetail.FullNomRefCache, RefDetail.PreliminaryFlag AS RefDetailPrelim, RefDetail.Details, " +
296 " RefDetail.SecondarySources, RefDetail.IdInSource " +
297 " FROM Name LEFT OUTER JOIN RefDetail ON Name.NomRefDetailFk = RefDetail.RefDetailId AND Name.NomRefDetailFk = RefDetail.RefDetailId AND " +
298 " Name.NomRefFk = RefDetail.RefFk AND Name.NomRefFk = RefDetail.RefFk";
299 ResultSet rs
= source
.getResultSet(strQuery
) ;
305 if ((i
++ % modCount
) == 0){ logger
.info("Names handled: " + (i
-1));}
307 //create TaxonName element
308 int nameId
= rs
.getInt("nameId");
309 int rankId
= rs
.getInt("rankFk");
313 Rank rank
= BerlinModelTransformer
.rankId2Rank(rankId
);
315 //BotanicalName name = BotanicalName.NewInstance(BerlinModelTransformer.rankId2Rank(rankId));
316 BotanicalName botanicalName
= new BotanicalName(rank
);
319 dbAttrName
= "supraGenericName";
321 dbAttrName
= "genus";
323 cdmAttrName
= "genusOrUninomial";
324 success
&= ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
326 dbAttrName
= "genusSubdivisionEpi";
327 cdmAttrName
= "infraGenericEpithet";
328 success
&= ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
330 dbAttrName
= "speciesEpi";
331 cdmAttrName
= "specificEpithet";
332 success
&= ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
335 dbAttrName
= "infraSpeciesEpi";
336 cdmAttrName
= "infraSpecificEpithet";
337 success
&= ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
339 dbAttrName
= "unnamedNamePhrase";
340 cdmAttrName
= "appendedPhrase";
341 success
&= ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
343 dbAttrName
= "preliminaryFlag";
344 cdmAttrName
= "XX" + "protectedTitleCache";
345 success
&= ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
347 dbAttrName
= "HybridFormulaFlag";
348 cdmAttrName
= "isHybridFormula";
349 success
&= ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
351 dbAttrName
= "MonomHybFlag";
352 cdmAttrName
= "isMonomHybrid";
353 success
&= ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
355 dbAttrName
= "BinomHybFlag";
356 cdmAttrName
= "isBinomHybrid";
357 success
&= ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
359 dbAttrName
= "TrinomHybFlag";
360 cdmAttrName
= "isTrinomHybrid";
361 success
&= ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
365 // dbAttrName = "notes";
366 // cdmAttrName = "isTrinomHybrid";
367 // ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
380 dbAttrName
= "details";
381 cdmAttrName
= "nomenclaturalMicroReference";
382 success
&= ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
388 UUID nameUuid
= nameService
.saveTaxonName(botanicalName
);
389 taxonNameMap
.put(nameId
, nameUuid
);
391 } catch (UnknownRankException e
) {
392 logger
.warn("Name with id " + nameId
+ " has unknown rankId " + rankId
+ " and could not be saved.");
399 // strDbAttr = "NameId";
400 // //save id for later
401 // int intID = rs.getInt(strDbAttr);
403 // String nameId = rs.getString(strDbAttr);
405 // //add TaxonName to nameMap
406 // nameMap.put(nameId, elTaxonName);
409 // strValue = nameId;
410 // strAttrName = "id";
411 // parent = elTaxonName;
412 // xml.addStringAttribute(strValue, parent, strAttrName, NS_NULL);
415 // strAttrName = "nomenclaturalCode";
416 // strValue = "Botanical";
417 // parent = elTaxonName;
418 // xml.addStringAttribute(strValue, parent, strAttrName, NS_NULL);
421 // strDbAttr = "FullNameCache";
422 // strElName = "Simple";
423 // parent = elTaxonName;
424 // xml.addElement(rs,strDbAttr, parent, strElName, nsTcs, OBLIGATORY);
428 // strDbAttr = "RankAbbrev";
429 // strElName = "Rank";
430 // parent = elTaxonName;
431 // xml.addElement(rs,strDbAttr, parent, strElName, nsTcs, OBLIGATORY);
434 // parent = elTaxonName;
435 // makeCanonicalName(rs, parent);
438 // //CanonicalAuthorship
439 // parent = elTaxonName;
440 // makeCanonicalAuthorship(rs, parent);
442 // } //fi fullVersion
445 // strDbAttr = "NomRefFk";
446 // strAttrName = "ref";
447 // strElName = "PublishedIn";
448 // parent = elTaxonName;
449 // Attribute attrPublRef = xml.addAttributeInElement(rs, strDbAttr, parent, strAttrName, strElName, nsTcs, FACULTATIVE);
451 // if (attrPublRef != null){
452 // //does Publication exist?
453 // String ref = attrPublRef.getValue();
454 // if (! publicationMap.containsKey(ref)){
455 // logger.error("PublishedIn ref " + ref + " for " + nameId + " does not exist.");
462 // String year = rs.getString("RefYear");
463 // if (year == null) {
464 // year = rs.getString("HigherRefYear");
467 // strElName = "Year";
468 // parent = elTaxonName;
469 // xml.addStringElement(strValue, parent, strElName, nsTcs, FACULTATIVE);
472 // strDbAttr = "Details";
473 // strElName = "MicroReference";
474 // parent = elTaxonName;
475 // xml.addElement(rs,strDbAttr, parent, strElName, nsTcs, FACULTATIVE);
480 // //insert related Names (Basionyms, ReplacedSyns, etc.
481 // makeSpellingCorrections(nameMap);
482 // makeBasionyms(nameMap);
483 // makeLaterHomonyms(nameMap);
484 // makeReplacedNames(nameMap);
486 // //insert Status infos
487 // makeNameSpecificData(nameMap);
489 logger
.info("end makeTaxonNames ...");
491 } catch (SQLException e
) {
492 logger
.error("SQLException:" + e
);
502 private boolean makeTaxa(){
506 logger
.info("start makeTaxa ...");
508 ITaxonService taxonService
= cdmApp
.getTaxonService();
509 INameService nameService
= cdmApp
.getNameService();
510 IReferenceService referenceService
= cdmApp
.getReferenceService();
511 boolean delete
= deleteAll
;
514 // List<TaxonBase> listAllTaxa = taxonService.getAllTaxa(0, 1000);
515 // while(listAllTaxa.size() > 0 ){
516 // for (TaxonBase taxon : listAllTaxa ){
518 // //nameService.remove(name);
520 // listAllTaxa = taxonService.getAllTaxa(0, 1000);
524 //get data from database
528 ResultSet rs
= source
.getResultSet(strQuery
) ;
535 if ((i
++ % modCount
) == 0){ logger
.info("Names handled: " + (i
-1));}
537 //create TaxonName element
538 int taxonId
= rs
.getInt("taxonId");
539 int statusFk
= rs
.getInt("statusFk");
541 int nameFk
= rs
.getInt("nameFk");
542 int refFk
= rs
.getInt("refFk");
544 TaxonNameBase taxonName
;
545 UUID nameUuid
= taxonNameMap
.get(nameFk
);
546 if (nameUuid
== null){
549 taxonName
= nameService
.getTaxonNameByUuid(nameUuid
);
553 ReferenceBase reference
;
554 UUID refUuid
= referenceMap
.get(refFk
);
555 if (refUuid
== null){
558 reference
= referenceService
.getReferenceByUuid(refUuid
);
565 logger
.info(statusFk
);
567 taxon
= Taxon
.NewInstance(taxonName
, reference
);
569 }else if (statusFk
== 2){
570 synonym
= Synonym
.NewInstance(taxonName
, reference
);
573 synonym
= Synonym
.NewInstance(taxonName
, reference
);
579 ImportHelper
.addStringValue(rs
, taxonBase
, dbAttrName
, cdmAttrName
);
581 dbAttrName
= "genusSubdivisionEpi";
582 cdmAttrName
= "infraGenericEpithet";
583 ImportHelper
.addStringValue(rs
, taxonBase
, dbAttrName
, cdmAttrName
);
585 dbAttrName
= "isDoubtful";
586 cdmAttrName
= "isDoubtful";
587 ImportHelper
.addBooleanValue(rs
, taxonBase
, dbAttrName
, cdmAttrName
);
595 UUID taxonUuid
= taxonService
.saveTaxon(taxonBase
);
596 taxonMap
.put(taxonId
, taxonUuid
);
598 } catch (Exception e
) {
599 logger
.warn("An exception occurred when creating taxon with id " + taxonId
+ ". Taxon could not be saved.");
604 logger
.info("end makeTaxa ...");
606 } catch (SQLException e
) {
607 logger
.error("SQLException:" + e
);
616 private boolean makeRelTaxa(){
620 logger
.info("start makeTaxonRelationships ...");
621 logger
.warn("RelTaxa not yet implemented !!");
623 ITaxonService taxonService
= cdmApp
.getTaxonService();
624 boolean delete
= deleteAll
;
627 // List<Agent> listAllAgents = agentService.getAllAgents(0, 1000);
628 // while(listAllAgents.size() > 0 ){
629 // for (Agent name : listAllAgents ){
631 // //nameService.remove(name);
633 // listAllAgents = agentService.getAllAgents(0, 1000);
637 //get data from database
640 " FROM RelPTaxon Join Taxon1 Join Taxon2" ;
641 ResultSet rs
= source
.getResultSet(strQuery
) ;
646 if ((i
++ % modCount
) == 0){ logger
.info("RelPTaxa handled: " + (i
-1));}
649 int taxon1Id
= rs
.getInt("taxon1Id");
650 int taxon2Id
= rs
.getInt("taxon2Id");
651 int factId
= rs
.getInt("factId");
652 int relTypeFk
= rs
.getInt("relTypeFk");
654 TaxonBase taxon1
= getTaxonById(taxon1Id
, taxonService
);
655 TaxonBase taxon2
= getTaxonById(taxon2Id
, taxonService
);
658 ReferenceBase citation
= null;
659 String microcitation
= null;
662 if (relTypeFk
== IS_INCLUDED_IN
){
663 ((Taxon
)taxon2
).addTaxonomicChild((Taxon
)taxon1
, citation
, microcitation
);
664 }else if (relTypeFk
== IS_SYNONYM_OF
){
665 ((Taxon
)taxon2
).addSynonym((Synonym
)taxon1
, SynonymRelationshipType
.SYNONYM_OF());
666 }else if (relTypeFk
== IS_HOMOTYPIC_SYNONYM_OF
){
667 ((Taxon
)taxon2
).addSynonym((Synonym
)taxon1
, SynonymRelationshipType
.HOMOTYPIC_SYNONYM_OF());
668 }else if (relTypeFk
== IS_HETEROTYPIC_SYNONYM_OF
){
669 ((Taxon
)taxon2
).addSynonym((Synonym
)taxon1
, SynonymRelationshipType
.HETEROTYPIC_SYNONYM_OF());
670 }else if (relTypeFk
== IS_MISAPPLIED_NAME_OF
){
671 ((Taxon
)taxon2
).addMisappliedName((Taxon
)taxon1
, citation
, microcitation
);
674 logger
.warn("TaxonRelationShipType " + relTypeFk
+ " not yet implemented");
683 logger
.info("end makeFacts ...");
685 } catch (SQLException e
) {
686 logger
.error("SQLException:" + e
);
692 private TaxonBase
getTaxonById(int id
, IService
<TaxonBase
> service
){
694 UUID uuid
= taxonMap
.get(id
);
698 result
= ((ITaxonService
)service
).getTaxonByUuid(uuid
); //.getCdmObjectByUuid(uuid);// taxonService.getTaxonByUuid(taxonUuid);
707 private boolean makeFacts(){
711 logger
.info("start makeFacts ...");
712 logger
.warn("Facts not yet implemented !!");
714 //IAgentService agentService = cdmApp.getAgentService();
715 boolean delete
= deleteAll
;
718 // List<Agent> listAllAgents = agentService.getAllAgents(0, 1000);
719 // while(listAllAgents.size() > 0 ){
720 // for (Agent name : listAllAgents ){
722 // //nameService.remove(name);
724 // listAllAgents = agentService.getAllAgents(0, 1000);
728 //get data from database
732 ResultSet rs
= source
.getResultSet(strQuery
) ;
737 if ((i
++ % modCount
) == 0){ logger
.info("Facts handled: " + (i
-1));}
739 //create TaxonName element
740 int factId
= rs
.getInt("factId");
747 logger
.info("end makeFacts ...");
749 } catch (SQLException e
) {
750 logger
.error("SQLException:" + e
);