1 package eu
.etaxonomy
.cdm
.io
.berlinModel
;
3 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.*;
4 import java
.lang
.reflect
.InvocationTargetException
;
5 import java
.lang
.reflect
.Method
;
6 import java
.sql
.ResultSet
;
7 import java
.sql
.SQLException
;
8 import java
.util
.HashMap
;
11 import java
.util
.UUID
;
13 import org
.apache
.log4j
.Logger
;
15 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationController
;
16 import eu
.etaxonomy
.cdm
.api
.service
.IAgentService
;
17 import eu
.etaxonomy
.cdm
.api
.service
.INameService
;
18 import eu
.etaxonomy
.cdm
.api
.service
.IReferenceService
;
19 import eu
.etaxonomy
.cdm
.api
.service
.IService
;
20 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
21 import eu
.etaxonomy
.cdm
.database
.CdmDataSource
;
22 import eu
.etaxonomy
.cdm
.database
.DataSourceNotFoundException
;
23 import eu
.etaxonomy
.cdm
.database
.DatabaseTypeEnum
;
24 import eu
.etaxonomy
.cdm
.io
.source
.Source
;
25 import eu
.etaxonomy
.cdm
.model
.agent
.Agent
;
26 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
27 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
28 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
29 import eu
.etaxonomy
.cdm
.model
.reference
.Article
;
30 import eu
.etaxonomy
.cdm
.model
.reference
.Book
;
31 import eu
.etaxonomy
.cdm
.model
.reference
.BookSection
;
32 import eu
.etaxonomy
.cdm
.model
.reference
.Database
;
33 import eu
.etaxonomy
.cdm
.model
.reference
.Generic
;
34 import eu
.etaxonomy
.cdm
.model
.reference
.INomenclaturalReference
;
35 import eu
.etaxonomy
.cdm
.model
.reference
.Journal
;
36 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceBase
;
37 import eu
.etaxonomy
.cdm
.model
.reference
.StrictReferenceBase
;
38 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
39 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationshipType
;
40 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
41 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
42 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
43 import eu
.etaxonomy
.cdm
.strategy
.exceptions
.UnknownRankException
;
45 public class BerlinModelImport
{
46 private static final Logger logger
= Logger
.getLogger(BerlinModelImport
.class);
48 private boolean deleteAll
= false;
51 private Source source
;
54 private CdmApplicationController cdmApp
;
57 static String dbms
= "SQLServer";
58 static String strServer
= "BGBM111";
59 static String strDB
= "EuroPlusMed_00_Edit";
60 static int port
= 1247;
61 static String userName
= "webUser";
62 static String pwd
= "";
64 static DatabaseTypeEnum dbType
= DatabaseTypeEnum
.MySQL
;
65 static String cdmServer
= "192.168.2.10";
66 static String cdmDB
= "cdm_test_lib";
67 //static int cdmPort = 1247;
68 static String cdmUserName
= "edit";
69 static String cdmPwd
= "wp5";
72 //final boolean OBLIGATORY = true;
73 //final boolean FACULTATIVE = false;
74 final int modCount
= 100;
78 private Map
<Integer
, UUID
> referenceMap
= new HashMap
<Integer
, UUID
>();
79 private Map
<Integer
, UUID
> taxonNameMap
= new HashMap
<Integer
, UUID
>();
80 private Map
<Integer
, UUID
> taxonMap
= new HashMap
<Integer
, UUID
>();
87 public static void main(String
[] args
) {
88 System
.out
.println("Start import from BerlinModel ...");
89 BerlinModelImport bmImport
= new BerlinModelImport();
91 System
.out
.println("End import from BerlinModel ...");
97 private void doImport(){
98 makeSource(dbms
, strServer
, strDB
, port
, userName
, pwd
);
101 String dataSourceName
= "cdmImportLibrary";
102 CdmDataSource dataSource
;
104 dataSource
= CdmDataSource
.NewInstance(dataSourceName
);
105 } catch (DataSourceNotFoundException e1
) {
106 dataSource
= CdmDataSource
.save(dataSourceName
, dbType
, cdmServer
, cdmDB
, cdmUserName
, cdmPwd
);
109 cdmApp
= new CdmApplicationController(dataSource
);
110 } catch (DataSourceNotFoundException e
) {
111 logger
.error(e
.getMessage());
115 //make and save Authors
119 //make and save References
123 //make and save Names
130 //make and save Facts
133 //make and save Facts
138 //make and save publications
139 /* makePublications(root);
140 saveToXml(root.getChild("Publications", nsTcs), outputPath, outputFileName + "Publications", format);
142 saveToXml(root.getChild("TaxonNames", nsTcs), outputPath, outputFileName + "_TaxonNames", format);
144 //make and save Concepts
146 saveToXml(root.getChild("TaxonConcepts", nsTcs), outputPath, outputFileName + "_TaxonConcepts", format);
155 private boolean makeAuthors(){
159 logger
.info("start makeAuthors ...");
160 logger
.warn("Authors not yet implemented !!");
162 IAgentService agentService
= cdmApp
.getAgentService();
163 boolean delete
= deleteAll
;
166 List
<Agent
> listAllAgents
= agentService
.getAllAgents(0, 1000);
167 while(listAllAgents
.size() > 0 ){
168 for (Agent name
: listAllAgents
){
170 //nameService.remove(name);
172 listAllAgents
= agentService
.getAllAgents(0, 1000);
176 //get data from database
179 " FROM AuthorTeam " ;
180 ResultSet rs
= source
.getResultSet(strQuery
) ;
186 logger
.info("end makeAuthors ...");
188 } catch (SQLException e
) {
189 logger
.error("SQLException:" + e
);
198 private boolean makeReferences(){
202 logger
.info("start makeReferences ...");
203 IReferenceService referenceService
= cdmApp
.getReferenceService();
204 boolean delete
= deleteAll
;
207 List
<TaxonNameBase
> listAllReferences
= referenceService
.getAllReferences(0, 1000);
208 while(listAllReferences
.size() > 0 ){
209 for (TaxonNameBase name
: listAllReferences
){
211 //nameService.remove(name);
213 listAllReferences
= referenceService
.getAllReferences(0, 1000);
219 //get data from database
222 " FROM References " ;
223 ResultSet rs
= source
.getResultSet(strQuery
) ;
229 if ((i
++ % modCount
) == 0){ logger
.info("References handled: " + (i
-1));}
231 //create TaxonName element
232 int refId
= rs
.getInt("refId");
233 int categoryId
= rs
.getInt("categoryFk");
234 int inRefFk
= rs
.getInt("inRefFk");
236 StrictReferenceBase ref
;
238 logger
.info(categoryId
);
240 if (categoryId
== REF_JOURNAL
){
242 }else if(categoryId
== REF_BOOK
){
244 }else if(categoryId
== REF_ARTICLE
){
246 }else if(categoryId
== REF_DATABASE
){
247 ref
= new Database();
248 }else if(categoryId
== REF_PART_OF_OTHER_TITLE
){
249 if (inRefFk
== REF_BOOK
){
251 ref
= new BookSection();
253 logger
.warn("Reference type of part-of-reference not recognized");
256 }else if(categoryId
== REF_UNKNOWN
){
263 dbAttrName
= "refCache";
265 ImportHelper
.addStringValue(rs
, ref
, dbAttrName
, cdmAttrName
);
267 dbAttrName
= "nomRefCache";
268 cdmAttrName
= "titleCache";
269 ImportHelper
.addStringValue(rs
, ref
, dbAttrName
, cdmAttrName
);
272 // dbAttrName = "BinomHybFlag";
273 // cdmAttrName = "isBinomHybrid";
274 // ImportHelper.addBooleanValue(rs, ref, dbAttrName, cdmAttrName);
280 UUID refUuid
= referenceService
.saveReference(ref
);
281 referenceMap
.put(refId
, refUuid
);
283 } catch (Exception e
) {
284 logger
.warn("Reference with id threw Exception and could not be saved");
290 logger
.info("end makeReferences ...");
292 } catch (SQLException e
) {
293 logger
.error("SQLException:" + e
);
303 private boolean makeTaxonNames(){
307 logger
.info("start makeTaxonNames ...");
308 INameService nameService
= cdmApp
.getNameService();
309 boolean delete
= deleteAll
;
312 List
<TaxonNameBase
> listAllNames
= nameService
.getAllNames(0, 1000);
313 while(listAllNames
.size() > 0 ){
314 for (TaxonNameBase name
: listAllNames
){
316 //nameService.remove(name);
318 listAllNames
= nameService
.getAllNames(0, 1000);
325 //get data from database
327 "SELECT TOP 102 Name.* , RefDetail.RefDetailId, RefDetail.RefFk, " +
328 " RefDetail.FullRefCache, RefDetail.FullNomRefCache, RefDetail.PreliminaryFlag AS RefDetailPrelim, RefDetail.Details, " +
329 " RefDetail.SecondarySources, RefDetail.IdInSource " +
330 " FROM Name LEFT OUTER JOIN RefDetail ON Name.NomRefDetailFk = RefDetail.RefDetailId AND Name.NomRefDetailFk = RefDetail.RefDetailId AND " +
331 " Name.NomRefFk = RefDetail.RefFk AND Name.NomRefFk = RefDetail.RefFk";
332 ResultSet rs
= source
.getResultSet(strQuery
) ;
338 if ((i
++ % modCount
) == 0){ logger
.info("Names handled: " + (i
-1));}
340 //create TaxonName element
341 int nameId
= rs
.getInt("nameId");
342 int rankId
= rs
.getInt("rankFk");
346 Rank rank
= BerlinModelTransformer
.rankId2Rank(rankId
);
348 //BotanicalName name = BotanicalName.NewInstance(BerlinModelTransformer.rankId2Rank(rankId));
349 BotanicalName botanicalName
= new BotanicalName(rank
);
352 dbAttrName
= "supraGenericName";
354 dbAttrName
= "genus";
356 cdmAttrName
= "genusOrUninomial";
357 ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
359 dbAttrName
= "genusSubdivisionEpi";
360 cdmAttrName
= "infraGenericEpithet";
361 ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
363 dbAttrName
= "speciesEpi";
364 cdmAttrName
= "specificEpithet";
365 ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
368 dbAttrName
= "infraSpeciesEpi";
369 cdmAttrName
= "infraSpecificEpithet";
370 ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
372 dbAttrName
= "unnamedNamePhrase";
373 cdmAttrName
= "appendedPhrase";
374 ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
376 dbAttrName
= "preliminaryFlag";
377 cdmAttrName
= "XX" + "protectedTitleCache";
378 ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
380 dbAttrName
= "HybridFormulaFlag";
381 cdmAttrName
= "isHybridFormula";
382 ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
384 dbAttrName
= "MonomHybFlag";
385 cdmAttrName
= "isMonomHybrid";
386 ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
388 dbAttrName
= "BinomHybFlag";
389 cdmAttrName
= "isBinomHybrid";
390 ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
392 dbAttrName
= "TrinomHybFlag";
393 cdmAttrName
= "isTrinomHybrid";
394 ImportHelper
.addBooleanValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
398 // dbAttrName = "notes";
399 // cdmAttrName = "isTrinomHybrid";
400 // ImportHelper.addStringValue(rs, botanicalName, dbAttrName, cdmAttrName);
413 dbAttrName
= "details";
414 cdmAttrName
= "nomenclaturalMicroReference";
415 ImportHelper
.addStringValue(rs
, botanicalName
, dbAttrName
, cdmAttrName
);
421 UUID nameUuid
= nameService
.saveTaxonName(botanicalName
);
422 taxonNameMap
.put(nameId
, nameUuid
);
424 } catch (UnknownRankException e
) {
425 logger
.warn("Name with id " + nameId
+ " has unknown rankId " + rankId
+ " and could not be saved.");
431 // strDbAttr = "NameId";
432 // //save id for later
433 // int intID = rs.getInt(strDbAttr);
435 // String nameId = rs.getString(strDbAttr);
437 // //add TaxonName to nameMap
438 // nameMap.put(nameId, elTaxonName);
441 // strValue = nameId;
442 // strAttrName = "id";
443 // parent = elTaxonName;
444 // xml.addStringAttribute(strValue, parent, strAttrName, NS_NULL);
447 // strAttrName = "nomenclaturalCode";
448 // strValue = "Botanical";
449 // parent = elTaxonName;
450 // xml.addStringAttribute(strValue, parent, strAttrName, NS_NULL);
453 // strDbAttr = "FullNameCache";
454 // strElName = "Simple";
455 // parent = elTaxonName;
456 // xml.addElement(rs,strDbAttr, parent, strElName, nsTcs, OBLIGATORY);
460 // strDbAttr = "RankAbbrev";
461 // strElName = "Rank";
462 // parent = elTaxonName;
463 // xml.addElement(rs,strDbAttr, parent, strElName, nsTcs, OBLIGATORY);
466 // parent = elTaxonName;
467 // makeCanonicalName(rs, parent);
470 // //CanonicalAuthorship
471 // parent = elTaxonName;
472 // makeCanonicalAuthorship(rs, parent);
474 // } //fi fullVersion
477 // strDbAttr = "NomRefFk";
478 // strAttrName = "ref";
479 // strElName = "PublishedIn";
480 // parent = elTaxonName;
481 // Attribute attrPublRef = xml.addAttributeInElement(rs, strDbAttr, parent, strAttrName, strElName, nsTcs, FACULTATIVE);
483 // if (attrPublRef != null){
484 // //does Publication exist?
485 // String ref = attrPublRef.getValue();
486 // if (! publicationMap.containsKey(ref)){
487 // logger.error("PublishedIn ref " + ref + " for " + nameId + " does not exist.");
494 // String year = rs.getString("RefYear");
495 // if (year == null) {
496 // year = rs.getString("HigherRefYear");
499 // strElName = "Year";
500 // parent = elTaxonName;
501 // xml.addStringElement(strValue, parent, strElName, nsTcs, FACULTATIVE);
504 // strDbAttr = "Details";
505 // strElName = "MicroReference";
506 // parent = elTaxonName;
507 // xml.addElement(rs,strDbAttr, parent, strElName, nsTcs, FACULTATIVE);
512 // //insert related Names (Basionyms, ReplacedSyns, etc.
513 // makeSpellingCorrections(nameMap);
514 // makeBasionyms(nameMap);
515 // makeLaterHomonyms(nameMap);
516 // makeReplacedNames(nameMap);
518 // //insert Status infos
519 // makeNameSpecificData(nameMap);
521 logger
.info("end makeTaxonNames ...");
523 } catch (SQLException e
) {
524 logger
.error("SQLException:" + e
);
534 private boolean makeTaxa(){
538 logger
.info("start makeTaxa ...");
540 ITaxonService taxonService
= cdmApp
.getTaxonService();
541 INameService nameService
= cdmApp
.getNameService();
542 IReferenceService referenceService
= cdmApp
.getReferenceService();
543 boolean delete
= deleteAll
;
546 List
<TaxonBase
> listAllTaxa
= taxonService
.getAllTaxa(0, 1000);
547 while(listAllTaxa
.size() > 0 ){
548 for (TaxonBase taxon
: listAllTaxa
){
550 //nameService.remove(name);
552 listAllTaxa
= taxonService
.getAllTaxa(0, 1000);
556 //get data from database
560 ResultSet rs
= source
.getResultSet(strQuery
) ;
567 if ((i
++ % modCount
) == 0){ logger
.info("Names handled: " + (i
-1));}
569 //create TaxonName element
570 int taxonId
= rs
.getInt("taxonId");
571 int statusFk
= rs
.getInt("statusFk");
573 int nameFk
= rs
.getInt("nameFk");
574 int refFk
= rs
.getInt("refFk");
576 TaxonNameBase taxonName
;
577 UUID nameUuid
= taxonNameMap
.get(nameFk
);
578 if (nameUuid
== null){
581 taxonName
= nameService
.getTaxonNameByUuid(nameUuid
);
585 ReferenceBase reference
;
586 UUID refUuid
= referenceMap
.get(refFk
);
587 if (refUuid
== null){
590 reference
= referenceService
.getReferenceByUuid(refUuid
);
595 logger
.info(statusFk
);
597 taxonBase
= Taxon
.NewInstance(taxonName
, reference
);
598 }else if (statusFk
== 2){
599 taxonBase
= Synonym
.NewInstance(taxonName
, reference
);
604 ImportHelper
.addStringValue(rs
, taxonBase
, dbAttrName
, cdmAttrName
);
606 dbAttrName
= "genusSubdivisionEpi";
607 cdmAttrName
= "infraGenericEpithet";
608 ImportHelper
.addStringValue(rs
, taxonBase
, dbAttrName
, cdmAttrName
);
610 dbAttrName
= "isDoubtful";
611 cdmAttrName
= "isDoubtful";
612 ImportHelper
.addBooleanValue(rs
, taxonBase
, dbAttrName
, cdmAttrName
);
620 UUID taxonUuid
= taxonService
.saveTaxon(taxonBase
);
621 taxonMap
.put(taxonId
, taxonUuid
);
623 } catch (Exception e
) {
624 logger
.warn("An exception occurred when creating taxon with id " + taxonId
+ ". Taxon could not be saved.");
629 logger
.info("end makeTaxa ...");
631 } catch (SQLException e
) {
632 logger
.error("SQLException:" + e
);
641 private boolean makeRelTaxa(){
645 logger
.info("start makeTaxonRelationships ...");
646 logger
.warn("RelTaxa not yet implemented !!");
648 ITaxonService taxonService
= cdmApp
.getTaxonService();
649 boolean delete
= deleteAll
;
652 // List<Agent> listAllAgents = agentService.getAllAgents(0, 1000);
653 // while(listAllAgents.size() > 0 ){
654 // for (Agent name : listAllAgents ){
656 // //nameService.remove(name);
658 // listAllAgents = agentService.getAllAgents(0, 1000);
662 //get data from database
665 " FROM RelPTaxon Join Taxon1 Join Taxon2" ;
666 ResultSet rs
= source
.getResultSet(strQuery
) ;
671 if ((i
++ % modCount
) == 0){ logger
.info("RelPTaxa handled: " + (i
-1));}
674 int taxon1Id
= rs
.getInt("taxon1Id");
675 int taxon2Id
= rs
.getInt("taxon2Id");
676 int factId
= rs
.getInt("factId");
677 int relTypeFk
= rs
.getInt("relTypeFk");
679 TaxonBase taxon1
= getTaxonById(taxon1Id
, taxonService
);
680 TaxonBase taxon2
= getTaxonById(taxon2Id
, taxonService
);
683 ReferenceBase citation
= null;
684 String microcitation
= null;
687 if (relTypeFk
== IS_INCLUDED_IN
){
688 ((Taxon
)taxon2
).addTaxonomicChild((Taxon
)taxon1
, citation
, microcitation
);
689 }else if (relTypeFk
== IS_SYNONYM_OF
){
690 ((Taxon
)taxon2
).addSynonym((Synonym
)taxon1
, SynonymRelationshipType
.SYNONYM_OF());
691 }else if (relTypeFk
== IS_HOMOTYPIC_SYNONYM_OF
){
692 ((Taxon
)taxon2
).addSynonym((Synonym
)taxon1
, SynonymRelationshipType
.HOMOTYPIC_SYNONYM_OF());
693 }else if (relTypeFk
== IS_HETEROTYPIC_SYNONYM_OF
){
694 ((Taxon
)taxon2
).addSynonym((Synonym
)taxon1
, SynonymRelationshipType
.HETEROTYPIC_SYNONYM_OF());
695 }else if (relTypeFk
== IS_MISAPPLIED_NAME_OF
){
696 ((Taxon
)taxon2
).addMisappliedName((Taxon
)taxon1
, citation
, microcitation
);
699 logger
.warn("TaxonRelationShipType " + relTypeFk
+ " not yet implemented");
708 logger
.info("end makeFacts ...");
710 } catch (SQLException e
) {
711 logger
.error("SQLException:" + e
);
717 private TaxonBase
getTaxonById(int id
, IService
<TaxonBase
> service
){
719 UUID uuid
= taxonMap
.get(id
);
723 result
= service
.getCdmObjectByUuid(uuid
);// taxonService.getTaxonByUuid(taxonUuid);
731 private boolean makeFacts(){
735 logger
.info("start makeFacts ...");
736 logger
.warn("Facts not yet implemented !!");
738 //IAgentService agentService = cdmApp.getAgentService();
739 boolean delete
= deleteAll
;
742 // List<Agent> listAllAgents = agentService.getAllAgents(0, 1000);
743 // while(listAllAgents.size() > 0 ){
744 // for (Agent name : listAllAgents ){
746 // //nameService.remove(name);
748 // listAllAgents = agentService.getAllAgents(0, 1000);
752 //get data from database
756 ResultSet rs
= source
.getResultSet(strQuery
) ;
761 if ((i
++ % modCount
) == 0){ logger
.info("Facts handled: " + (i
-1));}
763 //create TaxonName element
764 int factId
= rs
.getInt("factId");
771 logger
.info("end makeFacts ...");
773 } catch (SQLException e
) {
774 logger
.error("SQLException:" + e
);
785 * @return true, if connection establisehd
787 private boolean makeSource(String dbms
, String strServer
, String strDB
, int port
, String userName
, String pwd
){
788 //establish connection
790 source
= new Source(dbms
, strServer
, strDB
);
791 source
.setPort(port
);
792 source
.setUserAndPwd(userName
, pwd
);
794 } catch (Exception e
) {