ref #10322 add wfoIdentifier to webservice
authorAndreas Müller <a.mueller@bgbm.org>
Fri, 31 May 2024 14:31:29 +0000 (16:31 +0200)
committerAndreas Müller <a.mueller@bgbm.org>
Fri, 31 May 2024 14:31:29 +0000 (16:31 +0200)
14 files changed:
cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/dto/portal/IdentifiableDto.java
cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/dto/portal/IdentifierDto.java [new file with mode: 0644]
cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/dto/portal/TaxonBaseDto.java
cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/dto/portal/config/DistributionInfoConfiguration.java
cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/dto/portal/config/ISourceableLoaderConfiguration.java
cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/dto/portal/config/TaxonPageDtoConfiguration.java
cdmlib-io/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml
cdmlib-model/src/main/resources/terms/IdentifierType.csv
cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/portal/TaxonPageDtoLoaderBase.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/geo/DistributionInfoBuilderTest.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/portal/TaxonPageDtoLoaderTest.java
cdmlib-services/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml
cdmlib-test/src/main/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml

index e7e9d68a637c7fc575dbad57551d4510af93a532..d6f58d8484fb3c324a4d6fed9ae61006bdb92c9c 100644 (file)
@@ -16,10 +16,22 @@ public class IdentifiableDto extends SourcedDto {
 
     private String label;
 
+    private ContainerDto<IdentifierDto> identifiers;
+
     public String getLabel() {
         return label;
     }
     public void setLabel(String label) {
         this.label = label;
     }
-}
+
+    public ContainerDto<IdentifierDto> getIdentifiers() {
+        return identifiers;
+    }
+    public void addIdentifier(IdentifierDto identifierDto) {
+        if (identifiers == null) {
+            identifiers = new ContainerDto<>();
+        }
+        identifiers.addItem(identifierDto);
+    }
+}
\ No newline at end of file
diff --git a/cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/dto/portal/IdentifierDto.java b/cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/dto/portal/IdentifierDto.java
new file mode 100644 (file)
index 0000000..1f9306f
--- /dev/null
@@ -0,0 +1,67 @@
+/**
+* Copyright (C) 2024 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.api.dto.portal;
+
+import java.time.LocalDateTime;
+import java.util.UUID;
+
+/**
+ * @author muellera
+ * @since 31.05.2024
+ */
+public class IdentifierDto extends CdmBaseDto {
+
+    private String type;
+
+    private String identifier;
+
+    private String link;
+
+    private UUID typeUuid;
+
+// ************ CONSTRUCTOR ***********************************/
+
+    public IdentifierDto() {
+        super(null, null, null);
+    }
+
+    public IdentifierDto(UUID uuid, Integer id, LocalDateTime lastUpdated) {
+        super(uuid, id, lastUpdated);
+    }
+
+// ****************** GETTER / SETTER ************************/
+
+    public String getType() {
+        return type;
+    }
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getIdentifier() {
+        return identifier;
+    }
+    public void setIdentifier(String identifier) {
+        this.identifier = identifier;
+    }
+
+    public String getLink() {
+        return link;
+    }
+    public void setLink(String link) {
+        this.link = link;
+    }
+
+    public UUID getTypeUuid() {
+        return typeUuid;
+    }
+    public void setTypeUuid(UUID typeUuid) {
+        this.typeUuid = typeUuid;
+    }
+}
\ No newline at end of file
index 4619cb7ae135e3e68168e9bb912ae632e4814274..a4aed0c27dbaab3743d7da45bb0a8dc7d90d1efa 100644 (file)
@@ -227,6 +227,11 @@ public class TaxonBaseDto extends IdentifiableDto {
         this.name = name;
     }
 
+    @Override
+    public ContainerDto<IdentifierDto> getIdentifiers() {
+        //TODO we also need to support taxon identifiers
+        return getName().getIdentifiers();
+    }
 
     //TaxonBase info
     //appendedPhras, useNameCache, doubtful, name, publish
index ce93bfdc094980e664f081b08752322947410d1f..662235cd36d51c5c4ac433864a3ccd6ec5a3308d 100644 (file)
@@ -188,6 +188,11 @@ public class DistributionInfoConfiguration implements ISourceableLoaderConfigura
         this.annotationTypes = annotationTypes;
     }
 
+    @Override
+    public Set<UUID> getIdentifierTypes() {
+        return null;  //we do not expect identifiers for distributions
+    }
+
     @Override
     public EnumSet<OriginalSourceType> getSourceTypes() {
         return sourceTypes;
index d4a48f77d4270fc7832aa49502bc9509717e26ca..dc2d611af54d4d3fd34bd63dd41e04485fa403bf 100644 (file)
@@ -27,5 +27,7 @@ public interface ISourceableLoaderConfiguration {
 
     public Set<UUID> getAnnotationTypes();
 
+    public Set<UUID> getIdentifierTypes();
+
     public EnumSet<OriginalSourceType> getSourceTypes();
 }
index 0e74ad279967126efc9cfded68fa60894e937074..529a7352b8ab67519104d6e63056bd122c532c36 100644 (file)
@@ -23,6 +23,7 @@ import java.util.UUID;
 import eu.etaxonomy.cdm.api.filter.TaxonOccurrenceRelationType;
 import eu.etaxonomy.cdm.model.common.AnnotationType;
 import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
+import eu.etaxonomy.cdm.model.term.IdentifierType;
 
 /**
  * @author a.mueller
@@ -52,6 +53,7 @@ public class TaxonPageDtoConfiguration implements ISourceableLoaderConfiguration
     private Set<UUID> annotationTypes = new HashSet<>(
             Arrays.asList(new UUID[] {AnnotationType.uuidEditorial}));
     private Set<UUID> markerTypes = new HashSet<>();
+    private Set<UUID> identifierTypes = new HashSet<>(Arrays.asList(new UUID[] {IdentifierType.uuidWfoNameIdentifier}));
 
     private Set<UUID> directNameRelTyes = null;
     private Set<UUID> inverseNameRelTyes = null;
@@ -239,6 +241,11 @@ public class TaxonPageDtoConfiguration implements ISourceableLoaderConfiguration
         this.distributionInfoConfiguration.addAnnotationType(annotationType);
     }
 
+    @Override
+    public Set<UUID> getIdentifierTypes() {
+        return identifierTypes;
+    }
+
     //name relationship types
     public Set<UUID> getDirectNameRelTyes() {
         return directNameRelTyes;
index c68091dc4dd2826e6048b711c3b0c039545f97ba..b18590c451d893771b632b7ed50213a349df1076 100644 (file)
Binary files a/cdmlib-io/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml and b/cdmlib-io/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml differ
index 357add83b1726ea11a33869dbd815ff13e7ab2b2..9aa7470e767a36d3e64250ea6b34cb68705cb4a5 100644 (file)
@@ -9,6 +9,6 @@
 "054fd3d1-1961-42f8-b024-b91184ac9e0c",,"Alternative Field Number","Alternative field number","AFN",""\r
 "6205e531-75b0-4f2a-9a9c-b1247fb080ab",,"Tropicos Name Identifier","Tropicos Name Identifier","TNI",""\r
 "009a602f-0ff6-4231-93db-f458e8229aca",,"IPNI Name Identifier","IPNI Name Identifier (not LSID)","INI",""\r
-"048e0cf9-f59c-42dd-bfeb-3a5cba0191c7",,"WFO Name Identifier","World Flora Online Name Identifier","WNI",""\r
+"048e0cf9-f59c-42dd-bfeb-3a5cba0191c7",,"WFO Name Identifier","World Flora Online Name Identifier","WNI","https://wfoplantlist.org/taxon/{@ID}"\r
 "fb1764f5-843b-414c-b9e7-d3802e408823",,"ORCID-iD", "Open Researcher and Contributor Identifier","ORCID-iD",""\r
 "f405be9f-359a-49ba-b09b-4a7920386190",,"IF Name Identifier","Index Fungorum Name Identifier","IF ID","https://www.indexfungorum.org/names/NamesRecord.asp?RecordID={@ID}"
\ No newline at end of file
index f68803e566477fd81d931b7fdbaf3f39d4ef1b62..8d4e5410c38f0a3df52c48f6408519053fcd4bb0 100644 (file)
Binary files a/cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml and b/cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml differ
index 4a95a05cbc87a7ae662b28128de6ef83b1b273b8..dd38dc31e55b9b17773bad54192bff32bb5f9812 100644 (file)
@@ -9,6 +9,7 @@
 package eu.etaxonomy.cdm.api.service.portal;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.UUID;
@@ -21,6 +22,8 @@ import eu.etaxonomy.cdm.api.dto.portal.AnnotatableDto;
 import eu.etaxonomy.cdm.api.dto.portal.AnnotationDto;
 import eu.etaxonomy.cdm.api.dto.portal.CdmBaseDto;
 import eu.etaxonomy.cdm.api.dto.portal.ContainerDto;
+import eu.etaxonomy.cdm.api.dto.portal.IdentifiableDto;
+import eu.etaxonomy.cdm.api.dto.portal.IdentifierDto;
 import eu.etaxonomy.cdm.api.dto.portal.MarkerDto;
 import eu.etaxonomy.cdm.api.dto.portal.MediaDto2;
 import eu.etaxonomy.cdm.api.dto.portal.SingleSourcedDto;
@@ -37,6 +40,8 @@ import eu.etaxonomy.cdm.model.common.AnnotationType;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.common.IPublishable;
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
+import eu.etaxonomy.cdm.model.common.Identifier;
 import eu.etaxonomy.cdm.model.common.Language;
 import eu.etaxonomy.cdm.model.common.LanguageString;
 import eu.etaxonomy.cdm.model.common.Marker;
@@ -57,6 +62,7 @@ import eu.etaxonomy.cdm.model.reference.NamedSourceBase;
 import eu.etaxonomy.cdm.model.reference.OriginalSourceBase;
 import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
 import eu.etaxonomy.cdm.model.reference.Reference;
+import eu.etaxonomy.cdm.model.term.IdentifierType;
 import eu.etaxonomy.cdm.model.term.Representation;
 import eu.etaxonomy.cdm.model.term.TermBase;
 import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;
@@ -109,7 +115,38 @@ public abstract class TaxonPageDtoLoaderBase {
 
         loadAnnotatable(config, cdmBase, dto);
         loadSources(config, cdmBase, dto);
-        //loadIdentifiable(cdmBase, dto);
+        loadIdentifiable(config, cdmBase, dto);
+    }
+
+    private static void loadIdentifiable(ISourceableLoaderConfiguration config, CdmBase cdmBase, CdmBaseDto dto) {
+        Set<UUID> identifierTypes = new HashSet<>();
+        identifierTypes.add(IdentifierType.uuidWfoNameIdentifier);
+
+        if (dto instanceof IdentifiableDto && cdmBase.isInstanceOf(IdentifiableEntity.class)) {
+            IdentifiableEntity<?> identifiable = CdmBase.deproxy(cdmBase, IdentifiableEntity.class);
+            IdentifiableDto identifiableDto = (IdentifiableDto)dto;
+            //annotation
+            for (Identifier identifier : identifiable.getIdentifiers()) {
+                UUID typeUuid = identifier.getType() == null ? null : identifier.getType().getUuid();
+                if (config.getIdentifierTypes() == null || config.getIdentifierTypes().contains(typeUuid)) {
+
+                    IdentifierDto identifierDto = new IdentifierDto();
+                    identifiableDto.addIdentifier(identifierDto);
+                    //TODO id needed? but need to adapt dto and container then
+                    loadBaseData(config, identifier, identifierDto);
+                    identifierDto.setIdentifier(identifier.getIdentifier());
+                    if (typeUuid != null) { //not sure, if null is allowed at all here
+                        //TODO i18n
+                        List<Language> languages = new ArrayList<>();
+                        identifierDto.setType(identifier.getType().getPreferredLabel(languages));
+                        identifierDto.setTypeUuid(typeUuid);
+                        if (identifier.getType().getUrlPattern() != null) {
+                            identifierDto.setLink(identifier.getUrl());
+                        }
+                    }
+                }
+            }
+        }
     }
 
     static void loadAnnotatable(ISourceableLoaderConfiguration config, CdmBase cdmBase, CdmBaseDto dto) {
index cbeb37c96401f7c8999fbc7b8528b72f18422aea..4eff5ea7c8cf9b176da9b915ff72bca00dda0c9f 100644 (file)
@@ -239,6 +239,11 @@ public class DistributionInfoBuilderTest extends CdmTransactionalIntegrationTest
             public EnumSet<OriginalSourceType> getSourceTypes() {
                 return OriginalSourceType.allPublicTypes();
             }
+
+            @Override
+            public Set<UUID> getIdentifierTypes() {
+                return new HashSet<>();
+            }
         };
         distributionDtos.clear();
         distributionDtos.add(dist2Dto(europeDist, config));
index c4d74a360696d99ebe25479edd3cbbb3c86f2cf2..440c9aa83c7ef8e29aa2ac381af4749c239bbac2 100644 (file)
@@ -28,6 +28,7 @@ import eu.etaxonomy.cdm.api.dto.portal.DistributionTreeDto;
 import eu.etaxonomy.cdm.api.dto.portal.FactDto;
 import eu.etaxonomy.cdm.api.dto.portal.FeatureDto;
 import eu.etaxonomy.cdm.api.dto.portal.IFactDto;
+import eu.etaxonomy.cdm.api.dto.portal.IdentifierDto;
 import eu.etaxonomy.cdm.api.dto.portal.IndividualsAssociationDto;
 import eu.etaxonomy.cdm.api.dto.portal.MediaDto2;
 import eu.etaxonomy.cdm.api.dto.portal.NamedAreaDto;
@@ -57,6 +58,7 @@ import eu.etaxonomy.cdm.model.agent.Person;
 import eu.etaxonomy.cdm.model.common.Annotation;
 import eu.etaxonomy.cdm.model.common.AnnotationType;
 import eu.etaxonomy.cdm.model.common.ExtendedTimePeriod;
+import eu.etaxonomy.cdm.model.common.Identifier;
 import eu.etaxonomy.cdm.model.common.Language;
 import eu.etaxonomy.cdm.model.common.MarkerType;
 import eu.etaxonomy.cdm.model.common.TimePeriod;
@@ -90,6 +92,7 @@ import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.term.IdentifierType;
 import eu.etaxonomy.cdm.model.term.TermTree;
 import eu.etaxonomy.cdm.model.term.TermType;
 import eu.etaxonomy.cdm.strategy.cache.TaggedText;
@@ -140,8 +143,16 @@ public class TaxonPageDtoLoaderTest extends CdmTransactionalIntegrationTest {
         @DataSet(value="/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml")
     })
     public void testSynonymy() {
+
         createTestData();
+        //for some reason the urlpattern is not loaded in testdata
+        IdentifierType wfoIdType = (IdentifierType)termService.find(IdentifierType.uuidWfoNameIdentifier);
+        String urlPattern = wfoIdType.getUrlPattern();
+        if (urlPattern == null) {
+            wfoIdType.setUrlPattern("https://wfoplantlist.org/taxon/{@ID}");
+        }
         commitAndStartNewTransaction();
+
         TaxonPageDtoConfiguration config = new TaxonPageDtoConfiguration();
         CondensedDistributionConfiguration cc = config.getDistributionInfoConfiguration().getCondensedDistributionConfiguration();
         cc.showAreaOfScopeLabel = true;
@@ -157,6 +168,13 @@ public class TaxonPageDtoLoaderTest extends CdmTransactionalIntegrationTest {
         //TODO check if there is not some duplication between nameDto and dto
         TaxonNameDto nameDto = dto.getName();
         Assert.assertEquals("Basionym relations are not necessary", null, dto.getName().getRelatedNames());
+        Assert.assertNotNull(nameDto.getIdentifiers());
+        IdentifierDto wfoIdentifier = nameDto.getIdentifiers().getItems().get(0);
+        Assert.assertEquals("wfo-12345", wfoIdentifier.getIdentifier());
+        Assert.assertEquals(IdentifierType.uuidWfoNameIdentifier, wfoIdentifier.getTypeUuid());
+        Assert.assertEquals("WFO Name Identifier", wfoIdentifier.getType());
+        Assert.assertEquals("https://wfoplantlist.org/taxon/wfo-12345", wfoIdentifier.getLink());
+        Assert.assertNotNull(dto.getIdentifiers());
 
         //homotypic synonyms
         HomotypicGroupDTO homoSyns = dto.getHomotypicSynonyms();
@@ -556,6 +574,7 @@ public class TaxonPageDtoLoaderTest extends CdmTransactionalIntegrationTest {
     }
 
     private Taxon createSynonymy() {
+
         Person author = Person.NewInstance("Mill.", "Miller", "M.M.", "Michael");
         Reference nomRef = ReferenceFactory.newBook();
         nomRef.setTitle("My book");
@@ -565,6 +584,7 @@ public class TaxonPageDtoLoaderTest extends CdmTransactionalIntegrationTest {
                 "Genus", null, "species", null, author, nomRef, "55", null);
         Reference secRef = ReferenceFactory.newBook();
         secRef.setTitle("My secbook");
+        accName.addIdentifier(Identifier.NewInstance("wfo-12345", IdentifierType.IDENTIFIER_NAME_WFO()));
         Taxon taxon = Taxon.NewInstance(accName, secRef);
         taxon.setUuid(taxonUuid);
         taxonService.save(taxon);
index c68091dc4dd2826e6048b711c3b0c039545f97ba..b18590c451d893771b632b7ed50213a349df1076 100644 (file)
Binary files a/cdmlib-services/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml and b/cdmlib-services/src/test/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml differ
index c68091dc4dd2826e6048b711c3b0c039545f97ba..b18590c451d893771b632b7ed50213a349df1076 100644 (file)
Binary files a/cdmlib-test/src/main/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml and b/cdmlib-test/src/main/resources/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml differ