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
--- /dev/null
+/**
+* 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
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
this.annotationTypes = annotationTypes;
}
+ @Override
+ public Set<UUID> getIdentifierTypes() {
+ return null; //we do not expect identifiers for distributions
+ }
+
@Override
public EnumSet<OriginalSourceType> getSourceTypes() {
return sourceTypes;
public Set<UUID> getAnnotationTypes();
+ public Set<UUID> getIdentifierTypes();
+
public EnumSet<OriginalSourceType> getSourceTypes();
}
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
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;
this.distributionInfoConfiguration.addAnnotationType(annotationType);
}
+ @Override
+ public Set<UUID> getIdentifierTypes() {
+ return identifierTypes;
+ }
+
//name relationship types
public Set<UUID> getDirectNameRelTyes() {
return directNameRelTyes;
"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
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;
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;
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;
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;
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) {
public EnumSet<OriginalSourceType> getSourceTypes() {
return OriginalSourceType.allPublicTypes();
}
+
+ @Override
+ public Set<UUID> getIdentifierTypes() {
+ return new HashSet<>();
+ }
};
distributionDtos.clear();
distributionDtos.add(dist2Dto(europeDist, config));
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;
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;
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;
@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;
//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();
}
private Taxon createSynonymy() {
+
Person author = Person.NewInstance("Mill.", "Miller", "M.M.", "Michael");
Reference nomRef = ReferenceFactory.newBook();
nomRef.setTitle("My book");
"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);