ref #10273, ref #10446 add subsection and ipni ID to content export and doc for backb...
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / wfo / out / WfoContentExport.java
index e365d552d4ba37283641839533ef9489dfbe7eb0..9101a8d51bc9f23273eeefc2de82e1248eeca744 100644 (file)
@@ -37,6 +37,7 @@ import eu.etaxonomy.cdm.io.common.CdmExportBase;
 import eu.etaxonomy.cdm.io.common.ExportResult.ExportResultState;
 import eu.etaxonomy.cdm.io.common.TaxonNodeOutStreamPartitioner;
 import eu.etaxonomy.cdm.io.common.XmlExportState;
+import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;
 import eu.etaxonomy.cdm.io.common.mapping.out.IExportTransformer;
 import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
 import eu.etaxonomy.cdm.model.common.Annotation;
@@ -206,6 +207,7 @@ public class WfoContentExport
                 allowedRanks.add(Rank.GENUS());
                 allowedRanks.add(Rank.SUBGENUS());
                 allowedRanks.add(Rank.SECTION_BOTANY());
+                allowedRanks.add(Rank.SUBSECTION_BOTANY());
                 allowedRanks.add(Rank.SPECIES());
                 allowedRanks.add(Rank.SUBSPECIES());
                 allowedRanks.add(Rank.VARIETY());
@@ -309,63 +311,79 @@ public class WfoContentExport
     }
 
     private void handleDescription(WfoContentExportState state, DescriptionElementBase deb, Taxon taxon) {
-        WfoContentExportTable table = WfoContentExportTable.DESCRIPTION;
-        //TODO i18n
-        List<Language> languages = new ArrayList<>();
-        languages.add(Language.ENGLISH());
-        languages.add(Language.FRENCH());
-        languages.add(Language.SPANISH_CASTILIAN());
-        languages.add(Language.GERMAN());
-
-        String[] csvLine = new String[table.getSize()];
 
-        //type
-        //TODO 1 description type
+        try {
+            WfoContentExportTable table = WfoContentExportTable.DESCRIPTION;
+            //TODO i18n
+            List<Language> languages = new ArrayList<>();
+            languages.add(Language.ENGLISH());
+            languages.add(Language.FRENCH());
+            languages.add(Language.SPANISH_CASTILIAN());
+            languages.add(Language.GERMAN());
 
-        //description
-        String text = null;
-        if (deb instanceof TextData) {
-            TextData td = (TextData)deb;
+            String[] csvLine = new String[table.getSize()];
 
-            //TODO i18n
-            LanguageString ls = td.getPreferredLanguageString(languages, INCLUDE_UNPUBLISHED);
-            if (ls != null) {
-                text = ls.getText();
-                //language TODO
+            //TODO 3 description types still need fine-tuning
+            String type = getDescriptionTpe(state, deb);
+            if (type == null) {
+                return;
             }
-        } else if (deb instanceof CategoricalData) {
+
+            //description
+            String text = null;
+            if (deb instanceof TextData) {
+                TextData td = (TextData)deb;
+
+                //TODO i18n
+                LanguageString ls = td.getPreferredLanguageString(languages, INCLUDE_UNPUBLISHED);
+                if (ls != null) {
+                    text = ls.getText();
+                    //language TODO
+                }
+            } else if (deb instanceof CategoricalData) {
 //            DefaultCategoricalDescriptionBuilder builder = new DefaultCategoricalDescriptionBuilder();
 //            text = builder.build((CategoricalData)deb, languages);
-            //TODO which formatter to use
-            CategoricalDataFormatter formatter = CategoricalDataFormatter.NewInstance(null);
-            text = formatter.format(deb);
-        } else {
-            //TODO other types or only message?
-        }
-        csvLine[table.getIndex(WfoContentExportTable.DESC_DESCRIPTION)] = text;
-
-        //audience TODO
-        csvLine[table.getIndex(WfoContentExportTable.AUDIENCE)] = null;
+                //TODO which formatter to use
+                CategoricalDataFormatter formatter = CategoricalDataFormatter.NewInstance(null);
+                text = formatter.format(deb);
+            } else {
+                //TODO other types or only message?
+            }
+            csvLine[table.getIndex(WfoContentExportTable.DESC_DESCRIPTION)] = text;
 
-        //rights holder
-        handleRightsHolder(state, deb, csvLine, table, taxon);
+            //audience TODO
+            csvLine[table.getIndex(WfoContentExportTable.AUDIENCE)] = null;
 
-        //created TODO
-        handleCreated(state, deb, csvLine, table, taxon);
+            //rights holder
+            handleRightsHolder(state, deb, csvLine, table, taxon);
 
-        //creator
-        handleCreator(state, deb, csvLine, table, taxon);
+            //created TODO
+            handleCreated(state, deb, csvLine, table, taxon);
 
-        //source
-        handleSource(state, deb, table);
+            //creator
+            handleCreator(state, deb, csvLine, table, taxon);
 
-        //rights
-        handleRights(state, null, csvLine, table, taxon);
+            //source
+            handleSource(state, deb, table);
 
-        //license
-        handleLicense(state, null, csvLine, table, taxon);
+            //rights
+            handleRights(state, null, csvLine, table, taxon);
 
+            //license
+            handleLicense(state, null, csvLine, table, taxon);
+        } catch (Exception e) {
+            state.getResult().addException(e, "An unexpected error occurred when handling single description "
+                    + cdmBaseStr(deb) + ": " + e.getMessage());
+        }
+    }
 
+    private String getDescriptionTpe(WfoContentExportState state, DescriptionElementBase deb) {
+        try {
+            return state.getTransformer().getCacheByFeature(deb.getFeature());
+        } catch (UndefinedTransformerMethodException e) {
+//            e.printStackTrace();
+            return null; //should not happen
+        }
     }
 
     private void handleCreator(WfoContentExportState state, DescriptionElementBase deb, String[] csvLine,
@@ -690,7 +708,8 @@ public class WfoContentExport
 
             //scientificNameID
             //TODO 9 add IPNI ID if exists
-            csvLine[table.getIndex(WfoContentExportTable.NAME_SCIENTIFIC_NAME_ID)] = null;
+            boolean warnIfNotExists = false;
+            csvLine[table.getIndex(WfoContentExportTable.NAME_SCIENTIFIC_NAME_ID)] = getIpniId(state, name, warnIfNotExists);
 
             //scientificName
             if (name.isProtectedTitleCache()) {
@@ -747,6 +766,15 @@ public class WfoContentExport
         return wfoId;
     }
 
+    private String getIpniId(WfoContentExportState state, TaxonName name, boolean warnIfNotExists) {
+        Identifier ipniId = name.getIdentifier(IdentifierType.uuidIpniNameIdentifier);
+        if (ipniId == null && warnIfNotExists) {
+            String message = "No ipni-id given for name: " + name.getTitleCache()+"/"+ name.getUuid();
+            state.getResult().addWarning(message);  //TODO 5 data location
+        }
+        return ipniId == null ? null : ipniId.getIdentifier();
+    }
+
     private String getWfoId(WfoContentExportState state, TaxonName name, boolean warnIfNotExists) {
         Identifier wfoId = name.getIdentifier(IdentifierType.uuidWfoNameIdentifier);
         if (wfoId == null && warnIfNotExists) {