minor
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / BerlinModelTransformer.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.cdm.io.berlinModel;
11
12 import java.sql.ResultSet;
13 import java.sql.SQLException;
14
15 import org.apache.log4j.Logger;
16
17 import eu.etaxonomy.cdm.common.ResultWrapper;
18 import eu.etaxonomy.cdm.model.common.RelationshipBase;
19 import eu.etaxonomy.cdm.model.common.RelationshipTermBase;
20 import eu.etaxonomy.cdm.model.description.Feature;
21 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
22 import eu.etaxonomy.cdm.model.description.PresenceTerm;
23 import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
24 import eu.etaxonomy.cdm.model.name.NameRelationshipType;
25 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
26 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
27 import eu.etaxonomy.cdm.model.name.Rank;
28 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
29 import eu.etaxonomy.cdm.model.reference.Article;
30 import eu.etaxonomy.cdm.model.reference.Book;
31 import eu.etaxonomy.cdm.model.reference.CdDvd;
32 import eu.etaxonomy.cdm.model.reference.Database;
33 import eu.etaxonomy.cdm.model.reference.Generic;
34 import eu.etaxonomy.cdm.model.reference.Journal;
35 import eu.etaxonomy.cdm.model.reference.Patent;
36 import eu.etaxonomy.cdm.model.reference.PersonalCommunication;
37 import eu.etaxonomy.cdm.model.reference.PrintSeries;
38 import eu.etaxonomy.cdm.model.reference.Proceedings;
39 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
40 import eu.etaxonomy.cdm.model.reference.Report;
41 import eu.etaxonomy.cdm.model.reference.SectionBase;
42 import eu.etaxonomy.cdm.model.reference.Thesis;
43 import eu.etaxonomy.cdm.model.reference.WebPage;
44 import eu.etaxonomy.cdm.model.taxon.Synonym;
45 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
46 import eu.etaxonomy.cdm.model.taxon.Taxon;
47 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
48 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
49 import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
50
51 /**
52 * @author a.mueller
53 * @created 20.03.2008
54 * @version 1.0
55 */
56 public final class BerlinModelTransformer {
57 private static final Logger logger = Logger.getLogger(BerlinModelTransformer.class);
58
59 //REFERENCES
60 public static int REF_ARTICLE = 1;
61 public static int REF_PART_OF_OTHER_TITLE = 2;
62 public static int REF_BOOK = 3;
63 public static int REF_DATABASE = 4;
64 public static int REF_INFORMAL = 5;
65 public static int REF_NOT_APPLICABLE = 6;
66 public static int REF_WEBSITE = 7;
67 public static int REF_CD = 8;
68 public static int REF_JOURNAL = 9;
69 public static int REF_UNKNOWN = 10;
70 public static int REF_PRINT_SERIES = 55;
71 public static int REF_CONFERENCE_PROCEEDINGS = 56;
72 public static int REF_JOURNAL_VOLUME = 57;
73
74
75
76 //NameStatus
77 public static int NAME_ST_NOM_INVAL = 1;
78 public static int NAME_ST_NOM_ILLEG = 2;
79 public static int NAME_ST_NOM_NUD = 3;
80 public static int NAME_ST_NOM_REJ = 4;
81 public static int NAME_ST_NOM_REJ_PROP = 5;
82 public static int NAME_ST_NOM_UTIQUE_REJ = 6;
83 public static int NAME_ST_NOM_UTIQUE_REJ_PROP = 7;
84 public static int NAME_ST_NOM_CONS = 8;
85 public static int NAME_ST_NOM_CONS_PROP = 9;
86 public static int NAME_ST_ORTH_CONS = 10;
87 public static int NAME_ST_ORTH_CONS_PROP = 11;
88 public static int NAME_ST_NOM_SUPERFL = 12;
89 public static int NAME_ST_NOM_AMBIG = 13;
90 public static int NAME_ST_NOM_PROVIS = 14;
91 public static int NAME_ST_NOM_DUB = 15;
92 public static int NAME_ST_NOM_NOV = 16;
93 public static int NAME_ST_NOM_CONFUS = 17;
94 public static int NAME_ST_NOM_ALTERN = 18;
95 public static int NAME_ST_COMB_INVAL = 19;
96
97
98 //NameRelationShip
99 public static int NAME_REL_IS_BASIONYM_FOR = 1;
100 public static int NAME_REL_IS_LATER_HOMONYM_OF = 2;
101 public static int NAME_REL_IS_REPLACED_SYNONYM_FOR = 3;
102 public static int NAME_REL_IS_VALIDATION_OF = 4;
103 public static int NAME_REL_IS_LATER_VALIDATION_OF = 5;
104 public static int NAME_REL_IS_TYPE_OF = 6;
105 public static int NAME_REL_IS_CONSERVED_TYPE_OF =7;
106 public static int NAME_REL_IS_REJECTED_TYPE_OF = 8;
107 public static int NAME_REL_IS_FIRST_PARENT_OF = 9;
108 public static int NAME_REL_IS_SECOND_PARENT_OF = 10;
109 public static int NAME_REL_IS_FEMALE_PARENT_OF = 11;
110 public static int NAME_REL_IS_MALE_PARENT_OF = 12;
111 public static int NAME_REL_IS_CONSERVED_AGAINST =13;
112 public static int NAME_REL_IS_REJECTED_IN_FAVOUR_OF = 14;
113 public static int NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF = 15;
114 public static int NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF = 16;
115 public static int NAME_REL_HAS_SAME_TYPE_AS = 18;
116 public static int NAME_REL_IS_LECTOTYPE_OF = 61;
117 public static int NAME_REL_TYPE_NOT_DESIGNATED = 62;
118
119 //NameFacts
120 public static String NAME_FACT_PROTOLOGUE = "Protologue";
121 public static String NAME_FACT_ALSO_PUBLISHED_IN = "Also published in";
122
123 //TaxonRelationShip
124 public static int TAX_REL_IS_INCLUDED_IN = 1;
125 public static int TAX_REL_IS_SYNONYM_OF = 2;
126 public static int TAX_REL_IS_MISAPPLIED_NAME_OF = 3;
127 public static int TAX_REL_IS_PROPARTE_SYN_OF = 4;
128 public static int TAX_REL_IS_PARTIAL_SYN_OF = 5;
129 public static int TAX_REL_IS_HETEROTYPIC_SYNONYM_OF = 6;
130 public static int TAX_REL_IS_HOMOTYPIC_SYNONYM_OF = 7;
131 public static int TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF = 101;
132 public static int TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF = 102;
133 public static int TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF = 103;
134 public static int TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF = 104;
135
136
137
138 //TaxonStatus
139 public static int T_STATUS_ACCEPTED = 1;
140 public static int T_STATUS_SYNONYM = 2;
141 public static int T_STATUS_PARTIAL_SYN = 3;
142 public static int T_STATUS_PRO_PARTE_SYN = 4;
143 public static int T_STATUS_UNRESOLVED = 5;
144 public static int T_STATUS_ORPHANED = 6;
145
146
147 //Facts
148 public static int FACT_DESCRIPTION = 1;
149 public static int FACT_GROWTH_FORM = 2;
150 public static int FACT_HARDINESS = 3;
151 public static int FACT_ECOLOGY = 4;
152 public static int FACT_PHENOLOGY = 5;
153 public static int FACT_KARYOLOGY = 6;
154 public static int FACT_ILLUSTRATION = 7;
155 public static int FACT_IDENTIFICATION = 8;
156 public static int FACT_OBSERVATION = 9;
157 public static int FACT_DISTRIBUTION_EM = 10;
158 public static int FACT_DISTRIBUTION_WORLD = 11;
159
160
161 public static NomenclaturalStatus nomStatusFkToNomStatus(int nomStatusFk) throws UnknownCdmTypeException{
162 if (nomStatusFk == NAME_ST_NOM_INVAL){
163 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.INVALID());
164 }else if (nomStatusFk == NAME_ST_NOM_ILLEG){
165 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
166 }else if (nomStatusFk == NAME_ST_NOM_NUD){
167 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.NUDUM());
168 }else if (nomStatusFk == NAME_ST_NOM_REJ){
169 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.REJECTED());
170 }else if (nomStatusFk == NAME_ST_NOM_REJ_PROP){
171 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.REJECTED_PROP());
172 }else if (nomStatusFk == NAME_ST_NOM_UTIQUE_REJ){
173 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.UTIQUE_REJECTED());
174 }else if (nomStatusFk == NAME_ST_NOM_UTIQUE_REJ_PROP){
175 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.UTIQUE_REJECTED_PROP());
176 }else if (nomStatusFk == NAME_ST_NOM_CONS){
177 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.CONSERVED());
178 }else if (nomStatusFk == NAME_ST_NOM_CONS_PROP){
179 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.CONSERVED_PROP());
180 }else if (nomStatusFk == NAME_ST_ORTH_CONS){
181 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ORTHOGRAPHY_CONSERVED());
182 }else if (nomStatusFk == NAME_ST_ORTH_CONS_PROP){
183 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ORTHOGRAPHY_CONSERVED_PROP());
184 }else if (nomStatusFk == NAME_ST_NOM_SUPERFL){
185 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.SUPERFLUOUS());
186 }else if (nomStatusFk == NAME_ST_NOM_AMBIG){
187 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.AMBIGUOUS());
188 }else if (nomStatusFk == NAME_ST_NOM_PROVIS){
189 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.PROVISIONAL());
190 }else if (nomStatusFk == NAME_ST_NOM_DUB){
191 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.DOUBTFUL());
192 }else if (nomStatusFk == NAME_ST_NOM_NOV){
193 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.NOVUM());
194 }else if (nomStatusFk == NAME_ST_NOM_CONFUS){
195 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.CONFUSUM());
196 }else if (nomStatusFk == NAME_ST_NOM_ALTERN){
197 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ALTERNATIVE());
198 }else if (nomStatusFk == NAME_ST_COMB_INVAL){
199 return NomenclaturalStatus.NewInstance(NomenclaturalStatusType.COMBINATION_INVALID());
200 }else {
201 throw new UnknownCdmTypeException("Unknown NomenclaturalStatus (id=" + Integer.valueOf(nomStatusFk).toString() + ")");
202 }
203 }
204
205
206 //TypeDesignation
207 public static SpecimenTypeDesignationStatus typeStatusId2TypeStatus (int typeStatusId) throws UnknownCdmTypeException{
208 switch (typeStatusId){
209 case 0: return null;
210 case 1: return SpecimenTypeDesignationStatus.HOLOTYPE();
211 case 2: return SpecimenTypeDesignationStatus.LECTOTYPE();
212 case 3: return SpecimenTypeDesignationStatus.NEOTYPE();
213 case 4: return SpecimenTypeDesignationStatus.EPITYPE();
214 case 5: return SpecimenTypeDesignationStatus.ISOLECTOTYPE();
215 case 6: return SpecimenTypeDesignationStatus.ISONEOTYPE();
216 case 7: return SpecimenTypeDesignationStatus.ISOTYPE();
217 case 8: return SpecimenTypeDesignationStatus.PARANEOTYPE();
218 case 9: return SpecimenTypeDesignationStatus.PARATYPE();
219 case 10: return SpecimenTypeDesignationStatus.SECOND_STEP_LECTOTYPE();
220 case 11: return SpecimenTypeDesignationStatus.SECOND_STEP_NEOTYPE();
221 case 12: return SpecimenTypeDesignationStatus.SYNTYPE();
222 case 21: return SpecimenTypeDesignationStatus.ICONOTYPE();
223 case 22: return SpecimenTypeDesignationStatus.PHOTOTYPE();
224 default: {
225 throw new UnknownCdmTypeException("Unknown TypeDesignationStatus (id=" + Integer.valueOf(typeStatusId).toString() + ")");
226 }
227 }
228 }
229
230 //TypeDesignation
231 public static TaxonRelationshipType taxonRelId2TaxonRelType (int relTaxonTypeId, ResultWrapper<Boolean> isInverse) throws UnknownCdmTypeException{
232 isInverse.setValue(false);
233 switch (relTaxonTypeId){
234 case 0: return null;
235 case 11: return TaxonRelationshipType.CONGRUENT_TO();
236 case 12: isInverse.setValue(true); return TaxonRelationshipType.INCLUDES();
237 case 13: isInverse.setValue(true); return TaxonRelationshipType.CONGRUENT_OR_INCLUDES();
238 case 14: return TaxonRelationshipType.INCLUDES();
239 case 15: return TaxonRelationshipType.CONGRUENT_OR_INCLUDES();
240 case 16: return TaxonRelationshipType.INCLUDED_OR_INCLUDES();
241 case 17: return TaxonRelationshipType.CONGRUENT_OR_INCLUDED_OR_INCLUDES();
242 case 18: return TaxonRelationshipType.OVERLAPS();
243 case 19: return TaxonRelationshipType.CONGRUENT_OR_OVERLAPS();
244 case 20: isInverse.setValue(true); return TaxonRelationshipType.INCLUDES_OR_OVERLAPS();
245 case 21: isInverse.setValue(true); return TaxonRelationshipType.CONGRUENT_OR_INCLUDES_OR_OVERLAPS();
246 case 22: return TaxonRelationshipType.INCLUDES_OR_OVERLAPS();
247 case 23: return TaxonRelationshipType.CONGRUENT_OR_INCLUDES_OR_OVERLAPS();
248 case 24: return TaxonRelationshipType.INCLUDED_OR_INCLUDES_OR_OVERLAPS();
249
250 case 26: return TaxonRelationshipType.OVERLAPS();
251 //TODO other relationshipTypes
252
253 //FIXME doubtful
254 case 43: return TaxonRelationshipType.CONGRUENT_TO();
255 default: {
256 throw new UnknownCdmTypeException("Unknown TypeDesignationStatus (id=" + Integer.valueOf(relTaxonTypeId).toString() + ")");
257 }
258 }
259 }
260
261 //TypeDesignation
262 public static HybridRelationshipType relNameId2HybridRel (int relNameId) throws UnknownCdmTypeException{
263 switch (relNameId){
264 case 0: return null;
265 case 9: return HybridRelationshipType.FIRST_PARENT();
266 case 10: return HybridRelationshipType.SECOND_PARENT();
267 case 11: return HybridRelationshipType.FEMALE_PARENT();
268 case 12: return HybridRelationshipType.MALE_PARENT();
269 default: {
270 throw new UnknownCdmTypeException("Unknown HybridRelationshipType (id=" + Integer.valueOf(relNameId).toString() + ")");
271 }
272 }
273 }
274
275 //OccStatus
276 public static PresenceAbsenceTermBase<?> occStatus2PresenceAbsence (int occStatusId) throws UnknownCdmTypeException{
277 switch (occStatusId){
278 case 0: return null;
279 case 110: return PresenceTerm.CULTIVATED_REPORTED_IN_ERROR();
280 case 120: return PresenceTerm.CULTIVATED();
281 case 210: return PresenceTerm.INTRODUCED_REPORTED_IN_ERROR();
282 case 220: return PresenceTerm.INTRODUCED_PRESENCE_QUESTIONABLE();
283 case 230: return PresenceTerm.INTRODUCED_FORMERLY_INTRODUCED();
284 case 240: return PresenceTerm.INTRODUCED_DOUBTFULLY_INTRODUCED();
285 case 250: return PresenceTerm.INTRODUCED();
286 case 260: return PresenceTerm.INTRODUCED_UNCERTAIN_DEGREE_OF_NATURALISATION();
287 case 270: return PresenceTerm.INTRODUCED_ADVENTITIOUS();
288 case 280: return PresenceTerm.INTRODUCED_NATURALIZED();
289 case 310: return PresenceTerm.NATIVE_REPORTED_IN_ERROR();
290 case 320: return PresenceTerm.NATIVE_PRESENCE_QUESTIONABLE();
291 case 330: return PresenceTerm.NATIVE_FORMERLY_NATIVE();
292 case 340: return PresenceTerm.NATIVE_DOUBTFULLY_NATIVE();
293 case 350: return PresenceTerm.NATIVE();
294 case 999: {
295 logger.info("endemic for EM can not be transformed in legal status. Used 'PRESENT' instead");
296 //TODO preliminary
297 return PresenceTerm.PRESENT();
298 }
299 default: {
300 throw new UnknownCdmTypeException("Unknown occurrence status (id=" + Integer.valueOf(occStatusId).toString() + ")");
301 }
302 }
303 }
304
305
306 //FactCategory
307 public static Feature factCategory2Feature (int factCategoryId) throws UnknownCdmTypeException{
308 switch (factCategoryId){
309 case 0: return null;
310 case 1: return Feature.DESCRIPTION();
311 case 4: return Feature.ECOLOGY();
312 case 5: return Feature.PHENOLOGY();
313 case 12: return Feature.COMMON_NAME();
314 case 13: return Feature.OCCURRENCE();
315 case 99: return Feature.CITATION();
316 default: {
317 throw new UnknownCdmTypeException("Unknown FactCategory (id=" + Integer.valueOf(factCategoryId).toString() + ")");
318 }
319 }
320 }
321
322
323
324 public static Rank rankId2Rank (ResultSet rs, boolean useUnknown) throws UnknownCdmTypeException{
325 Rank result;
326 try {
327 int rankId = rs.getInt("rankFk");
328
329 String abbrev = rs.getString("rankAbbrev");
330 String rankName = rs.getString("rank");
331 if (logger.isDebugEnabled()){logger.debug(rankId);}
332 if (logger.isDebugEnabled()){logger.debug(abbrev);}
333 if (logger.isDebugEnabled()){logger.debug(rankName);}
334
335 try {
336 result = Rank.getRankByNameOrAbbreviation(abbrev);
337 } catch (UnknownCdmTypeException e) {
338 try {
339 result = Rank.getRankByNameOrAbbreviation(rankName);
340 } catch (UnknownCdmTypeException e1) {
341 switch (rankId){
342 case 0: return null;
343 case 1: return Rank.KINGDOM();
344 case 3: return Rank.SUBKINGDOM();
345 case 5: return Rank.PHYLUM();
346 case 7: return Rank.SUBPHYLUM();
347 case 8: return Rank.DIVISION();
348 case 9: return Rank.SUBDIVISION();
349 case 10: return Rank.CLASS();
350 case 13: return Rank.SUBCLASS();
351 case 16: return Rank.SUPERORDER();
352 case 18: return Rank.ORDER();
353 case 19: return Rank.SUBORDER();
354 case 20: return Rank.FAMILY();
355 case 25: return Rank.SUBFAMILY();
356 case 30: return Rank.TRIBE();
357 case 35: return Rank.SUBTRIBE();
358 case 40: return Rank.GENUS();
359 case 42: return Rank.SUBGENUS();
360 case 45: return Rank.SECTION_BOTANY();
361 case 47: return Rank.SUBSECTION_BOTANY();
362 case 50: return Rank.SERIES();
363 case 52: return Rank.SUBSERIES();
364 case 58: return Rank.SPECIESAGGREGATE();
365 case 59: return Rank.SPECIESGROUP();
366 case 60: return Rank.SPECIES();
367 case 65: return Rank.SUBSPECIES();
368 case 68: return Rank.CONVAR();
369 case 70: return Rank.VARIETY();
370 case 73: return Rank.SUBVARIETY();
371 case 80: return Rank.FORM();
372 case 82: return Rank.SUBFORM();
373 case 84: return Rank.SPECIALFORM();
374 case 98: return Rank.INFRAGENERICTAXON();
375 case 99: return Rank.INFRASPECIFICTAXON();
376
377 case 750: return Rank.SUPERCLASS();
378 case 780: return Rank.INFRACLASS();
379 case 820: return Rank.INFRAORDER();
380
381 case 830: return Rank.SUPERFAMILY();
382
383 default: {
384 if (useUnknown){
385 logger.error("Rank unknown. Created UNKNOWN_RANK");
386 return Rank.UNKNOWN_RANK();
387 }
388 throw new UnknownCdmTypeException("Unknown Rank id" + Integer.valueOf(rankId).toString());
389 }
390 }
391 }
392 }
393 return result;
394 } catch (SQLException e) {
395 e.printStackTrace();
396 logger.warn("Exception occurred. Created UNKNOWN_RANK instead");
397 return Rank.UNKNOWN_RANK();
398 }
399 }
400
401
402 public static Integer rank2RankId (Rank rank){
403 if (rank == null){
404 return null;
405 }
406 else if (rank.equals(Rank.KINGDOM())){ return 1;}
407 else if (rank.equals(Rank.SUBKINGDOM())){ return 3;}
408 else if (rank.equals(Rank.PHYLUM())){ return 5;}
409 else if (rank.equals(Rank.SUBPHYLUM())){ return 7;}
410 else if (rank.equals(Rank.DIVISION())){ return 8;}
411 else if (rank.equals(Rank.SUBDIVISION())){ return 9;}
412
413 else if (rank.equals(Rank.CLASS())){ return 10;}
414 else if (rank.equals(Rank.SUBCLASS())){ return 13;}
415 else if (rank.equals(Rank.SUPERORDER())){ return 16;}
416 else if (rank.equals(Rank.ORDER())){ return 18;}
417 else if (rank.equals(Rank.SUBORDER())){ return 19;}
418 else if (rank.equals(Rank.FAMILY())){ return 20;}
419 else if (rank.equals(Rank.SUBFAMILY())){ return 25;}
420 else if (rank.equals(Rank.TRIBE())){ return 30;}
421 else if (rank.equals(Rank.SUBTRIBE())){ return 35;}
422 else if (rank.equals(Rank.GENUS())){ return 40;}
423 else if (rank.equals(Rank.SUBGENUS())){ return 42;}
424 else if (rank.equals(Rank.SECTION_BOTANY())){ return 45;}
425 else if (rank.equals(Rank.SUBSECTION_BOTANY())){ return 47;}
426 else if (rank.equals(Rank.SERIES())){ return 50;}
427 else if (rank.equals(Rank.SUBSERIES())){ return 52;}
428 else if (rank.equals(Rank.SPECIESAGGREGATE())){ return 58;}
429 //TODO
430 // else if (rank.equals(Rank.XXX())){ return 59;}
431 else if (rank.equals(Rank.SPECIES())){ return 60;}
432 else if (rank.equals(Rank.SUBSPECIES())){ return 65;}
433 else if (rank.equals(Rank.CONVAR())){ return 68;}
434 else if (rank.equals(Rank.VARIETY())){ return 70;}
435 else if (rank.equals(Rank.SUBVARIETY())){ return 73;}
436 else if (rank.equals(Rank.FORM())){ return 80;}
437 else if (rank.equals(Rank.SUBFORM())){ return 82;}
438 else if (rank.equals(Rank.SPECIALFORM())){ return 84;}
439 else if (rank.equals(Rank.INFRAGENERICTAXON())){ return 98;}
440 else if (rank.equals(Rank.INFRASPECIFICTAXON())){ return 99;}
441
442 else if (rank.equals(Rank.SUPERCLASS())){ return 750;}
443 else if (rank.equals(Rank.INFRACLASS())){ return 780;}
444 else if (rank.equals(Rank.INFRAORDER())){ return 820;}
445 else if (rank.equals(Rank.SUPERFAMILY())){ return 830;}
446
447 else {
448 //TODO Exception
449 logger.warn("Rank not yet supported in Berlin Model: "+ rank.getLabel());
450 return null;
451 }
452 }
453
454 public static Integer textData2FactCategoryFk (Feature feature){
455 if (feature == null){return null;}
456 if (feature.equals(Feature.DESCRIPTION())){
457 return 1;
458 }else if (feature.equals(Feature.ECOLOGY())){
459 return 4;
460 }else if (feature.equals(Feature.PHENOLOGY())){
461 return 5;
462 }else if (feature.equals(Feature.COMMON_NAME())){
463 return 12;
464 }else if (feature.equals(Feature.OCCURRENCE())){
465 return 13;
466 }else if (feature.equals(Feature.CITATION())){
467 return 99;
468 }else{
469 logger.debug("Unknown Feature.");
470 return null;
471 }
472 }
473
474
475 public static Integer taxonBase2statusFk (TaxonBase<?> taxonBase){
476 if (taxonBase == null){return null;}
477 if (taxonBase.isInstanceOf(Taxon.class)){
478 return T_STATUS_ACCEPTED;
479 }else if (taxonBase.isInstanceOf(Synonym.class)){
480 return T_STATUS_SYNONYM;
481 }else{
482 logger.warn("Unknown ");
483 return T_STATUS_UNRESOLVED;
484 }
485 //TODO
486 // public static int T_STATUS_PARTIAL_SYN = 3;
487 // public static int T_STATUS_PRO_PARTE_SYN = 4;
488 // public static int T_STATUS_UNRESOLVED = 5;
489 // public static int T_STATUS_ORPHANED = 6;
490 }
491
492 public static Integer ref2refCategoryId (ReferenceBase<?> ref){
493 if (ref == null){
494 return null;
495 }
496 else if (ref instanceof Article){ return REF_ARTICLE;}
497 else if (ref instanceof SectionBase){ return REF_PART_OF_OTHER_TITLE;}
498 else if (ref instanceof Book){ return REF_BOOK;}
499 else if (ref instanceof Database){ return REF_DATABASE;}
500 // else if (ref instanceof SectionBas){ return REF_INFORMAL;}
501 // else if (ref instanceof SectionBas){ return REF_NOT_APPLICABLE;}
502 else if (ref instanceof WebPage){ return REF_WEBSITE;}
503 else if (ref instanceof CdDvd){ return REF_CD;}
504 else if (ref instanceof Journal){ return REF_JOURNAL;}
505 else if (ref instanceof Generic){ return REF_UNKNOWN;}
506 else if (ref instanceof PrintSeries){
507 logger.warn("Print Series is not a standard Berlin Model category");
508 return REF_PRINT_SERIES;
509 }
510 else if (ref instanceof Proceedings){
511 logger.warn("Proceedings is not a standard Berlin Model category");
512 return REF_CONFERENCE_PROCEEDINGS;
513 }
514 // else if (ref instanceof ){ return REF_JOURNAL_VOLUME;}
515 else if (ref instanceof Patent){ return REF_NOT_APPLICABLE;}
516 else if (ref instanceof PersonalCommunication){ return REF_INFORMAL;}
517 else if (ref instanceof Report){ return REF_NOT_APPLICABLE;}
518 else if (ref instanceof Thesis){ return REF_NOT_APPLICABLE;}
519 else if (ref instanceof Report){ return REF_NOT_APPLICABLE;}
520
521 else {
522 //TODO Exception
523 logger.warn("Reference type not yet supported in Berlin Model: "+ ref.getClass().getSimpleName());
524 return null;
525 }
526 }
527
528
529 public static Integer taxRelation2relPtQualifierFk (RelationshipBase<?,?,?> rel){
530 if (rel == null){
531 return null;
532 }
533 // else if (rel instanceof SynonymRelationship){
534 // return ;
535 // }else if (rel instanceof TaxonRelationship){
536 RelationshipTermBase<?> type = rel.getType();
537 if (type.equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) {return TAX_REL_IS_INCLUDED_IN;
538 }else if (type.equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR())) {return TAX_REL_IS_MISAPPLIED_NAME_OF;
539 }else if (type.equals(SynonymRelationshipType.SYNONYM_OF())) {return TAX_REL_IS_SYNONYM_OF;
540 }else if (type.equals(SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF())) {return TAX_REL_IS_HOMOTYPIC_SYNONYM_OF;
541 }else if (type.equals(SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF())) {return TAX_REL_IS_HETEROTYPIC_SYNONYM_OF;
542 }else if (type.equals(TaxonRelationshipType.CONGRUENT_TO())) {return 11;
543 // public static int TAX_REL_IS_PROPARTE_SYN_OF = 4;
544 // public static int TAX_REL_IS_PARTIAL_SYN_OF = 5;
545 // public static int TAX_REL_IS_PROPARTE_HOMOTYPIC_SYNONYM_OF = 101;
546 // public static int TAX_REL_IS_PROPARTE_HETEROTYPIC_SYNONYM_OF = 102;
547 // public static int TAX_REL_IS_PARTIAL_HOMOTYPIC_SYNONYM_OF = 103;
548 // public static int TAX_REL_IS_PARTIAL_HETEROTYPIC_SYNONYM_OF = 104;
549
550 }else {
551 //TODO Exception
552 logger.warn("Relationship type not yet supported by Berlin Model export: "+ rel.getType());
553 return null;
554 }
555 }
556
557 public static Integer nomStatus2nomStatusFk (NomenclaturalStatusType status){
558 if (status == null){
559 return null;
560 }
561 if (status.equals(NomenclaturalStatusType.INVALID())) {return NAME_ST_NOM_INVAL;
562 }else if (status.equals(NomenclaturalStatusType.ILLEGITIMATE())) {return NAME_ST_NOM_ILLEG;
563 }else if (status.equals(NomenclaturalStatusType.NUDUM())) {return NAME_ST_NOM_NUD;
564 }else if (status.equals(NomenclaturalStatusType.REJECTED())) {return NAME_ST_NOM_REJ;
565 }else if (status.equals(NomenclaturalStatusType.REJECTED_PROP())) {return NAME_ST_NOM_REJ_PROP;
566 }else if (status.equals(NomenclaturalStatusType.UTIQUE_REJECTED())) {return NAME_ST_NOM_UTIQUE_REJ;
567 }else if (status.equals(NomenclaturalStatusType.UTIQUE_REJECTED_PROP())) {return NAME_ST_NOM_UTIQUE_REJ_PROP;
568 }else if (status.equals(NomenclaturalStatusType.CONSERVED())) {return NAME_ST_NOM_CONS;
569
570 }else if (status.equals(NomenclaturalStatusType.CONSERVED_PROP())) {return NAME_ST_NOM_CONS_PROP;
571 }else if (status.equals(NomenclaturalStatusType.ORTHOGRAPHY_CONSERVED())) {return NAME_ST_ORTH_CONS;
572 }else if (status.equals(NomenclaturalStatusType.ORTHOGRAPHY_CONSERVED_PROP())) {return NAME_ST_ORTH_CONS_PROP;
573 }else if (status.equals(NomenclaturalStatusType.SUPERFLUOUS())) {return NAME_ST_NOM_SUPERFL;
574 }else if (status.equals(NomenclaturalStatusType.AMBIGUOUS())) {return NAME_ST_NOM_AMBIG;
575 }else if (status.equals(NomenclaturalStatusType.PROVISIONAL())) {return NAME_ST_NOM_PROVIS;
576 }else if (status.equals(NomenclaturalStatusType.DOUBTFUL())) {return NAME_ST_NOM_DUB;
577 }else if (status.equals(NomenclaturalStatusType.NOVUM())) {return NAME_ST_NOM_NOV;
578
579 }else if (status.equals(NomenclaturalStatusType.CONFUSUM())) {return NAME_ST_NOM_CONFUS;
580 }else if (status.equals(NomenclaturalStatusType.ALTERNATIVE())) {return NAME_ST_NOM_ALTERN;
581 }else if (status.equals(NomenclaturalStatusType.COMBINATION_INVALID())) {return NAME_ST_COMB_INVAL;
582 //TODO
583 }else {
584 //TODO Exception
585 logger.warn("NomStatus type not yet supported by Berlin Model export: "+ status);
586 return null;
587 }
588 }
589
590
591
592 public static Integer nameRel2RelNameQualifierFk (RelationshipBase<?,?,?> rel){
593 if (rel == null){
594 return null;
595 }
596 RelationshipTermBase<?> type = rel.getType();
597 if (type.equals(NameRelationshipType.BASIONYM())) {return NAME_REL_IS_BASIONYM_FOR;
598 }else if (type.equals(NameRelationshipType.LATER_HOMONYM())) {return NAME_REL_IS_LATER_HOMONYM_OF;
599 }else if (type.equals(NameRelationshipType.REPLACED_SYNONYM())) {return NAME_REL_IS_REPLACED_SYNONYM_FOR;
600 //TODO
601 }else if (type.equals(NameRelationshipType.VALIDATED_BY_NAME())) {return NAME_REL_IS_VALIDATION_OF;
602 }else if (type.equals(NameRelationshipType.LATER_VALIDATED_BY_NAME())) {return NAME_REL_IS_LATER_VALIDATION_OF;
603 }else if (type.equals(NameRelationshipType.CONSERVED_AGAINST())) {return NAME_REL_IS_CONSERVED_AGAINST;
604
605
606 }else if (type.equals(NameRelationshipType.TREATED_AS_LATER_HOMONYM())) {return NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF;
607 }else if (type.equals(NameRelationshipType.ORTHOGRAPHIC_VARIANT())) {return NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF;
608 }else {
609 //TODO Exception
610 logger.warn("Relationship type not yet supported by Berlin Model export: "+ rel.getType());
611 return null;
612 }
613
614 //NameRelationShip
615
616 // }else if (type.equals(NameRelationshipType.())) {return NAME_REL_IS_REJECTED_IN_FAVOUR_OF;
617
618 // public static int NAME_REL_IS_FIRST_PARENT_OF = 9;
619 // public static int NAME_REL_IS_SECOND_PARENT_OF = 10;
620 // public static int NAME_REL_IS_FEMALE_PARENT_OF = 11;
621 // public static int NAME_REL_IS_MALE_PARENT_OF = 12;
622 //
623 // public static int NAME_REL_IS_REJECTED_IN_FAVOUR_OF = 14;
624 // }else if (type.equals(NameRelationshipType.)) {return NAME_REL_IS_REJECTED_TYPE_OF;
625 //
626 // public static int NAME_REL_HAS_SAME_TYPE_AS = 18;
627 // public static int NAME_REL_IS_LECTOTYPE_OF = 61;
628 // public static int NAME_REL_TYPE_NOT_DESIGNATED = 62;
629
630 // }else if (type.equals(NameRelationshipType.LATER_VALIDATED_BY_NAME())) {return NAME_REL_IS_TYPE_OF;
631
632
633 }
634
635 }