/***************************************************************************
* Copyright 2010 Global Biodiversity Information Facility Secretariat
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
***************************************************************************/
package org.gbif.ipt.model;
import org.gbif.api.model.common.DOI;
import org.gbif.ipt.config.Constants;
import org.gbif.ipt.model.voc.IdentifierStatus;
import org.gbif.ipt.model.voc.PublicationStatus;
import org.gbif.ipt.service.AlreadyExistingException;
import org.gbif.metadata.eml.Agent;
import org.gbif.metadata.eml.Citation;
import java.math.BigDecimal;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import com.google.common.collect.Lists;
import org.apache.log4j.Logger;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
public class ResourceTest {
private static final Logger LOG = Logger.getLogger(ResourceTest.class);
private static final BigDecimal LATEST_RESOURCE_VERSION = new BigDecimal("3.0");
private static final BigDecimal RESOURCE_VERSION_TWO = new BigDecimal("2.0");
private static final BigDecimal RESOURCE_VERSION_ONE = new BigDecimal("1.0");
private final Extension OCC;
private final Extension EXT;
private final Extension TAX;
private static User USER;
public ResourceTest() {
OCC = new Extension();
OCC.setInstalled(true);
OCC.setName("Occurrence Core");
OCC.setTitle("Occurrence Core");
OCC.setRowType(Constants.DWC_ROWTYPE_OCCURRENCE);
TAX = new Extension();
TAX.setInstalled(true);
TAX.setName("Taxon Core");
TAX.setTitle("Taxon Core");
TAX.setRowType(Constants.DWC_ROWTYPE_TAXON);
EXT = new Extension();
EXT.setInstalled(true);
EXT.setName("Occurrence Extension");
EXT.setTitle("Occurrence Extension");
EXT.setRowType("http://rs.gbif.org/my/extension/test");
USER = new User();
USER.setEmail("jc@gbif.org");
USER.setLastname("Costa");
USER.setFirstname("Jose");
}
private ExtensionMapping getExtExtensionMapping() {
ExtensionMapping mapping = new ExtensionMapping();
mapping.setExtension(EXT);
return mapping;
}
private ExtensionMapping getOccExtensionMapping() {
ExtensionMapping mapping = new ExtensionMapping();
mapping.setExtension(OCC);
return mapping;
}
private ExtensionMapping getTaxExtensionMapping() {
ExtensionMapping mapping = new ExtensionMapping();
mapping.setExtension(TAX);
return mapping;
}
private Resource getResource() {
Resource res = new Resource();
res.setTitle("Test Resource");
res.setShortname("test");
res.setStatus(PublicationStatus.PRIVATE);
// add three published versions to version history, all published by user, some private, other public
VersionHistory v1 = new VersionHistory(RESOURCE_VERSION_ONE, new Date(), PublicationStatus.PRIVATE);
res.addVersionHistory(v1);
VersionHistory v2 = new VersionHistory(RESOURCE_VERSION_TWO, new Date(), PublicationStatus.PUBLIC);
res.addVersionHistory(v2);
VersionHistory v3 = new VersionHistory(LATEST_RESOURCE_VERSION, new Date(), PublicationStatus.PRIVATE);
res.addVersionHistory(v3);
return res;
}
@Test
public void testAddMapping() {
Resource res = getResource();
boolean failed = false;
try {
res.addMapping(getExtExtensionMapping());
} catch (IllegalArgumentException e) {
failed = true;
}
// cant add an extension without having a core
assertTrue(failed);
res.addMapping(getTaxExtensionMapping());
res.addMapping(getExtExtensionMapping());
res.addMapping(getTaxExtensionMapping());
res.addMapping(getExtExtensionMapping());
// Occurrence mapped as an extension to Taxon core, which is allowed
res.addMapping(getOccExtensionMapping());
assertEquals(5, res.getMappings().size());
// there are 2 mappings to Taxon core, 1 extension mapping to the Occurrence core which is excluded
assertEquals(2, res.getCoreMappings().size());
}
@Test
public void testDeleteMapping() {
Resource res = getResource();
ExtensionMapping em1 = getOccExtensionMapping();
ExtensionMapping em2 = getOccExtensionMapping();
ExtensionMapping em3 = getExtExtensionMapping();
ExtensionMapping em4 = getExtExtensionMapping();
ExtensionMapping em5 = getExtExtensionMapping();
res.addMapping(em1);
res.addMapping(em2);
res.addMapping(em3);
res.addMapping(em4);
res.addMapping(em5);
assertEquals(5, res.getMappings().size());
assertEquals(2, res.getCoreMappings().size());
// delete first core
assertTrue(res.deleteMapping(em1));
assertEquals(4, res.getMappings().size());
assertEquals(1, res.getCoreMappings().size());
// try again to remove the same ext - should not work
assertFalse(res.deleteMapping(em1));
assertEquals(4, res.getMappings().size());
assertEquals(1, res.getCoreMappings().size());
// remove an extension
assertTrue(res.deleteMapping(em5));
assertEquals(3, res.getMappings().size());
assertEquals(1, res.getCoreMappings().size());
// remove the last core, should remove all
assertTrue(res.deleteMapping(em2));
assertFalse(res.hasCore());
assertEquals(0, res.getMappings().size());
assertEquals(0, res.getCoreMappings().size());
}
/**
* The first mapping determines the core type. This test ensures that if multiple core type mappings exist, and the
* first mapping gets deleted, the core type is properly preserved if the second mapping isn't a core mapping.
*/
@Test
public void testDeleteMapping2() {
Resource res = getResource();
ExtensionMapping em1 = getOccExtensionMapping(); // core
ExtensionMapping em2 = getExtExtensionMapping();
ExtensionMapping em3 = getExtExtensionMapping();
ExtensionMapping em4 = getOccExtensionMapping(); // core
res.addMapping(em1); // core
res.addMapping(em2);
res.addMapping(em3);
res.addMapping(em4); // core
assertEquals(4, res.getMappings().size());
assertEquals(2, res.getCoreMappings().size());
// delete first core
assertTrue(res.deleteMapping(em1));
assertEquals(3, res.getMappings().size());
assertEquals(1, res.getCoreMappings().size());
assertEquals(Constants.DWC_ROWTYPE_OCCURRENCE, res.getCoreRowType());
// remove extension
assertTrue(res.deleteMapping(em2));
assertEquals(2, res.getMappings().size());
assertEquals(1, res.getCoreMappings().size());
// remove the last core, should remove all
assertTrue(res.deleteMapping(em4));
assertFalse(res.hasCore());
assertEquals(0, res.getMappings().size());
assertEquals(0, res.getCoreMappings().size());
}
@Test
public void testDeleteSource() throws AlreadyExistingException {
Resource res = getResource();
Source src1 = new TextFileSource();
src1.setName("Peter");
res.addSource(src1, false);
Source src2 = new TextFileSource();
src2.setName("Carla");
res.addSource(src2, false);
// add 3 mappings
ExtensionMapping emOcc = getOccExtensionMapping();
emOcc.setSource(src1);
ExtensionMapping emE1 = getExtExtensionMapping();
emE1.setSource(src1);
ExtensionMapping emE2 = getExtExtensionMapping();
emE2.setSource(src2);
res.addMapping(emOcc);
res.addMapping(emE1);
res.addMapping(emE2);
assertEquals(3, res.getMappings().size());
assertEquals(1, res.getCoreMappings().size());
// delete source mapped only to 1 extension
assertTrue(res.deleteSource(src2));
assertEquals(2, res.getMappings().size());
assertEquals(1, res.getCoreMappings().size());
// delete other source
assertTrue(res.deleteSource(src1));
assertEquals(0, res.getMappings().size());
assertEquals(0, res.getCoreMappings().size());
}
@Test
public void testHasMappedSource() throws AlreadyExistingException {
Resource res = getResource();
Source src1 = new TextFileSource();
src1.setName("events");
res.addSource(src1, false);
Source src2 = new TextFileSource();
src2.setName("occurrences");
res.addSource(src2, false);
Source src3 = new TextFileSource();
src3.setName("images");
res.addSource(src3, false);
// add 2 mappings to events (core) and occurrences (extension), but don't map the third source images
ExtensionMapping emOcc = getOccExtensionMapping();
emOcc.setSource(src1);
ExtensionMapping emE1 = getExtExtensionMapping();
emE1.setSource(src2);
res.addMapping(emOcc);
res.addMapping(emE1);
assertEquals(2, res.getMappings().size());
assertEquals(1, res.getCoreMappings().size());
// assert sources "events" and "occurrences" are declared mapped
assertTrue(res.hasMappedSource(src1));
assertTrue(res.hasMappedSource(src2));
// and that source "images" is not declared mapped
assertFalse(res.hasMappedSource(src3));
}
@Test
public void testCoreRowTypeSet() {
// create test resource
Resource resource = new Resource();
// add mapping to taxon core
ExtensionMapping mapping = new ExtensionMapping();
Extension ext = new Extension();
ext.setRowType(Constants.DWC_ROWTYPE_TAXON);
mapping.setExtension(ext);
resource.addMapping(mapping);
// assert correct core row type has been determined from core mapping
assertEquals(Constants.DWC_ROWTYPE_TAXON, resource.getCoreRowType());
}
@Test
public void testAddVersionHistory() {
Resource resource = getResource();
VersionHistory vh4 = new VersionHistory(BigDecimal.valueOf(3.4), new Date(), PublicationStatus.PUBLIC);
VersionHistory vh5 = new VersionHistory(BigDecimal.valueOf(3.5), new Date(), PublicationStatus.PUBLIC);
resource.addVersionHistory(vh4);
resource.addVersionHistory(vh5);
assertEquals(5, resource.getVersionHistory().size());
// try and add a version history with same version number - isn't allowed!
VersionHistory vh6 = new VersionHistory(BigDecimal.valueOf(3.5), new Date(), PublicationStatus.PUBLIC);
resource.addVersionHistory(vh6);
assertEquals(5, resource.getVersionHistory().size());
}
@Test
public void testRemoveVersionHistory() {
Resource resource = new Resource();
VersionHistory vh1 = new VersionHistory(BigDecimal.valueOf(1.4), new Date(), PublicationStatus.PUBLIC);
VersionHistory vh2 = new VersionHistory(BigDecimal.valueOf(1.5), new Date(), PublicationStatus.PUBLIC);
resource.addVersionHistory(vh1);
resource.addVersionHistory(vh2);
assertEquals(2, resource.getVersionHistory().size());
// remove the last version (imagining the version had to be rolled back after failed publication)
resource.removeVersionHistory(BigDecimal.valueOf(1.5));
assertEquals(1, resource.getVersionHistory().size());
assertNotNull(resource.getLastPublishedVersionsVersion());
assertEquals(BigDecimal.valueOf(1.4).toPlainString(), resource.getLastPublishedVersionsVersion().toPlainString());
}
@Test
public void testAddVersionHistoryWithTrailingZero() {
Resource resource = new Resource();
VersionHistory vh1 = new VersionHistory(new BigDecimal("1.1"), new Date(), PublicationStatus.PUBLIC);
VersionHistory vh9 = new VersionHistory(new BigDecimal("1.9"), new Date(), PublicationStatus.PUBLIC);
VersionHistory vh10 = new VersionHistory(new BigDecimal("1.10"), new Date(), PublicationStatus.PUBLIC);
resource.addVersionHistory(vh1);
resource.addVersionHistory(vh9);
resource.addVersionHistory(vh10);
assertEquals(3, resource.getVersionHistory().size());
// try and add a version history with same version number - isn't allowed!
VersionHistory vh3 = new VersionHistory(new BigDecimal("1.10"), new Date(), PublicationStatus.PUBLIC);
resource.addVersionHistory(vh3);
assertEquals(3, resource.getVersionHistory().size());
}
@Test
public void testFindVersionHistory() {
Resource resource = new Resource();
VersionHistory vh1 = new VersionHistory(new BigDecimal("1.8"), new Date(), PublicationStatus.PUBLIC);
vh1.setModifiedBy(USER);
VersionHistory vh2 = new VersionHistory(new BigDecimal("1.9"), new Date(), PublicationStatus.PUBLIC);
vh2.setModifiedBy(USER);
VersionHistory vh3 = new VersionHistory(new BigDecimal("1.10"), new Date(), PublicationStatus.PUBLIC);
vh3.setModifiedBy(USER);
resource.addVersionHistory(vh1);
resource.addVersionHistory(vh2);
resource.addVersionHistory(vh3);
VersionHistory foundVh1 = resource.findVersionHistory(new BigDecimal("1.8"));
assertEquals(new BigDecimal("1.8").toPlainString(), foundVh1.getVersion());
assertEquals("jc@gbif.org", foundVh1.getModifiedBy().getEmail());
VersionHistory foundVh2 = resource.findVersionHistory(new BigDecimal("1.9"));
assertEquals(new BigDecimal("1.9").toPlainString(), foundVh2.getVersion());
assertEquals("jc@gbif.org", foundVh2.getModifiedBy().getEmail());
VersionHistory foundVh3 = resource.findVersionHistory(new BigDecimal("1.10"));
assertEquals(new BigDecimal("1.10").toPlainString(), foundVh3.getVersion());
assertEquals("jc@gbif.org", foundVh3.getModifiedBy().getEmail());
}
@Test
public void testGetAuthorName() {
Agent creator = new Agent();
creator.setLastName("Williams");
creator.setFirstName("Brian");
assertEquals("Williams B", getResource().getAuthorName(creator));
creator.setFirstName("Brian Gonzalez");
assertEquals("Williams B G", getResource().getAuthorName(creator));
}
/**
* Check the organisation is only used as the creator name (author name) when the first and last
* names are left blank on purpose.
*/
@Test
public void testGetAuthorNameUsingOrganisation() {
Agent creator = new Agent();
creator.setLastName("");
creator.setFirstName("");
creator.setOrganisation("Natural History Museum of Denmark");
assertEquals("Natural History Museum of Denmark", getResource().getAuthorName(creator));
creator.setFirstName("Brian Gonzalez");
assertEquals("", getResource().getAuthorName(creator));
creator.setFirstName("");
creator.setLastName("Williams");
assertEquals("", getResource().getAuthorName(creator));
}
@Test
public void testGetPublicationYear() {
Date now = new Date();
int year = getResource().getPublicationYear(now);
assertNotNull(year);
assertEquals(4, String.valueOf(year).length());
}
/**
* Tests resource citation generation for a few different scenarios:
* </br>
* Tests that if resource has no citation identifier and no DOI, it uses the resource homepage as the citation
* identifier during generation.
* </br>
* Tests that if resource has a citation identifier and no DOI, it uses the citation identifier as the citation
* identifier during generation.
* </br>
* Tests that if resource has a citation identifier and a DOI, it uses the DOI as the citation identifier during
* generation.
*/
@Test
public void testGenerateResourceCitation() throws URISyntaxException {
Resource resource = new Resource();
resource.setTitle("Birds "); // should get trimmed
resource.setEmlVersion(BigDecimal.valueOf(1.6));
resource.setLastPublished(new Date());
// create hompepage for next resource version (1.7)
URI homepage = new URI("http://ipt.gbif.org/resource?r=birds&v=1.7");
// make resource of type occurrence
List<ExtensionMapping> extensionMappings = Lists.newArrayList();
extensionMappings.add(getOccExtensionMapping());
resource.setMappings(extensionMappings);
Calendar calendar = Calendar.getInstance();
calendar.set(2014, Calendar.JANUARY, 29);
resource.getEml().setDateStamp(calendar.getTime());
Agent creator1 = new Agent();
creator1.setFirstName("John");
creator1.setLastName("Smith");
Agent creator2 = new Agent();
creator2.setFirstName("Paul");
creator2.setLastName("Weir");
List<Agent> creators = Lists.newArrayList();
creators.add(creator1);
creators.add(creator2);
resource.getEml().setCreators(creators);
Organisation publisher = new Organisation();
publisher.setName("NHM");
resource.setOrganisation(publisher);
// resource has no DOI, or citation identifier, therefore should use resource homepage as citation identifier now
String citation = resource.generateResourceCitation(resource.getNextVersion(), homepage);
LOG.info("Resource citation using next minor version: " + citation);
assertEquals("Smith J, Weir P (2014): Birds. v1.7. NHM. Dataset/Occurrence. http://ipt.gbif.org/resource?r=birds&v=1.7", citation);
// mock assigning Citation Identifier to resource
Citation emlCitation = new Citation("Citation text", "http://doi.org/10.5886/cit_id");
resource.getEml().setCitation(emlCitation);
// change resource to type checklist
extensionMappings.clear();
extensionMappings.add(getTaxExtensionMapping());
resource.setMappings(extensionMappings);
// resource has citation identifier, therefore should use that as citation identifier now
citation = resource.generateResourceCitation(resource.getNextVersion(), homepage);
LOG.info("Resource citation using next minor version: " + citation);
assertEquals("Smith J, Weir P (2014): Birds. v1.7. NHM. Dataset/Checklist. http://doi.org/10.5886/cit_id", citation);
// mock assigning DOI to resource
resource.setIdentifierStatus(IdentifierStatus.PUBLIC);
resource.setDoi(new DOI("10.5886/1bft7W5f"));
// resource has DOI, therefore should use that as citation identifier now
citation = resource.generateResourceCitation(resource.getNextVersion(), homepage);
LOG.info("Resource citation with version specified: " + citation);
assertEquals("Smith J, Weir P (2014): Birds. v1.7. NHM. Dataset/Checklist. http://doi.org/10.5886/1bft7w5f", citation);
}
/**
* Ensure trailing zero's don't get cutoff! E.g. we preserve version 1.10.
*/
@Test
public void testTrailingZeros() {
Resource resource = getResource();
resource.getVersionHistory().clear();
// simulate publication of one version
resource.setEmlVersion(new BigDecimal("0.9"));
resource.setLastPublished(new Date());
VersionHistory history = new VersionHistory(new BigDecimal("0.9"), new Date(), PublicationStatus.PRIVATE);
resource.addVersionHistory(history);
// simulate publication of another
resource.setEmlVersion(new BigDecimal("0.10"));
resource.setLastPublished(new Date());
history = new VersionHistory(new BigDecimal("0.10"), new Date(), PublicationStatus.PRIVATE);
resource.addVersionHistory(history);
assertEquals("0.9", resource.getReplacedEmlVersion().toPlainString());
assertEquals("0.10", resource.getEmlVersion().toPlainString());
// ensure next version determined correctly
assertEquals("0.11", resource.getNextVersion().toPlainString());
resource.setEmlVersion(new BigDecimal("0.11"));
resource.setLastPublished(new Date());
history = new VersionHistory(new BigDecimal("0.11"), new Date(), PublicationStatus.PRIVATE);
resource.addVersionHistory(history);
assertEquals("0.10", resource.getReplacedEmlVersion().toPlainString());
assertEquals("0.11", resource.getEmlVersion().toPlainString());
// ensure next version determined correctly
assertEquals("0.12", resource.getNextVersion().toPlainString());
}
/**
* Similar to testTrailingZeros, but using major version numbers also.
*/
@Test
public void testTrailingZerosWithMajorVersionNumber() {
Resource resource = getResource();
resource.getVersionHistory().clear();
// simulate publication of one version
resource.setEmlVersion(new BigDecimal("4.9"));
resource.setLastPublished(new Date());
VersionHistory history = new VersionHistory(new BigDecimal("4.9"), new Date(), PublicationStatus.PRIVATE);
resource.addVersionHistory(history);
// simulate publication of another
resource.setEmlVersion(new BigDecimal("4.10"));
resource.setLastPublished(new Date());
history = new VersionHistory(new BigDecimal("4.10"), new Date(), PublicationStatus.PRIVATE);
resource.addVersionHistory(history);
assertEquals("4.9", resource.getReplacedEmlVersion().toPlainString());
assertEquals("4.10", resource.getEmlVersion().toPlainString());
// ensure next version determined correctly
assertEquals("4.11", resource.getNextVersion().toPlainString());
resource.setEmlVersion(new BigDecimal("4.11"));
resource.setLastPublished(new Date());
history = new VersionHistory(new BigDecimal("4.11"), new Date(), PublicationStatus.PRIVATE);
resource.addVersionHistory(history);
assertEquals("4.10", resource.getReplacedEmlVersion().toPlainString());
assertEquals("4.11", resource.getEmlVersion().toPlainString());
// ensure next version determined correctly
assertEquals("4.12", resource.getNextVersion().toPlainString());
}
@Test
public void testSetEmlVersion() {
Resource resource = getResource();
resource.getVersionHistory().clear();
// simulate publication of one verison
BigDecimal v = new BigDecimal("1.19");
resource.setEmlVersion(v);
resource.setLastPublished(new Date());
VersionHistory history = new VersionHistory(BigDecimal.valueOf(1.19), new Date(), PublicationStatus.PUBLIC);
resource.addVersionHistory(history);
// simulate publication of the next
v = resource.getNextVersion();
resource.setEmlVersion(v);
resource.setLastPublished(new Date());
history = new VersionHistory(v, new Date(),PublicationStatus.PUBLIC);
resource.addVersionHistory(history);
assertEquals("1.19", resource.getReplacedEmlVersion().toPlainString());
assertEquals("1.20", resource.getEmlVersion().toPlainString());
// now imaging publishing fails before it gets the chance to finish (e.g. registry update fails)
// simulate restoring version 1.19
resource.setEmlVersion(new BigDecimal("1.19"));
assertEquals("1.19", resource.getReplacedEmlVersion().toPlainString());
assertEquals("1.19", resource.getEmlVersion().toPlainString());
assertEquals("1.19", resource.getEml().getEmlVersion().toPlainString());
}
@Test
public void testGetNextVersion() {
Resource resource = new Resource();
resource.setLastPublished(null);
assertEquals("1.0", resource.getEmlVersion().toPlainString());
// the resource hasn't been published yet, so no new version gets assigned yet
assertEquals("1.0", resource.getNextVersion().toPlainString());
// first published version - no DOI
BigDecimal v1 = new BigDecimal("1.0");
Date v1Published = new Date();
resource.setEmlVersion(v1);
resource.setLastPublished(v1Published);
resource.setDoi(null);
resource.setIdentifierStatus(IdentifierStatus.UNRESERVED);
VersionHistory vh1 = new VersionHistory(v1, v1Published, PublicationStatus.PUBLIC);
vh1.setStatus(IdentifierStatus.UNRESERVED);
resource.addVersionHistory(vh1);
assertEquals("1.0", resource.getEmlVersion().toPlainString());
// the resource has been published, no DOI is assigned, so the next version is a minor version bump
assertEquals("1.1", resource.getNextVersion().toPlainString());
// second published version - DOI reserved
BigDecimal v2 = new BigDecimal("1.1");
Date v2Published = new Date();
resource.setEmlVersion(v2);
resource.setLastPublished(v2Published);
resource.setDoi(new DOI("10.1555/PU75GJ9"));
resource.setIdentifierStatus(IdentifierStatus.PUBLIC_PENDING_PUBLICATION);
VersionHistory vh2 = new VersionHistory(v2, v2Published, PublicationStatus.PUBLIC);
vh2.setDoi(new DOI("10.1555/PU75GJ9"));
vh2.setStatus(IdentifierStatus.PUBLIC_PENDING_PUBLICATION);
resource.addVersionHistory(vh2);
assertEquals("1.1", resource.getEmlVersion().toPlainString());
// the resource has been published, a DOI is only reserved, so the next version is a minor version bump
assertEquals("1.2", resource.getNextVersion().toPlainString());
// third published version - DOI registered (public)
BigDecimal v3 = new BigDecimal("1.2");
Date v3Published = new Date();
resource.setEmlVersion(v3);
resource.setLastPublished(v3Published);
resource.setDoi(new DOI("10.1555/PU75GJ9"));
resource.setIdentifierStatus(IdentifierStatus.PUBLIC);
VersionHistory vh3 = new VersionHistory(v3, v3Published, PublicationStatus.PUBLIC);
vh3.setDoi(new DOI("10.1555/PU75GJ9"));
vh3.setStatus(IdentifierStatus.PUBLIC);
resource.addVersionHistory(vh3);
assertEquals("1.2", resource.getEmlVersion().toPlainString());
// the resource has been published, a DOI is public, but there is no new DOI reserved, so the next version is a minor version bump
assertEquals("1.3", resource.getNextVersion().toPlainString());
// fourth UNpublished version - new DOI reserved
resource.setDoi(new DOI("10.1555/KY75TG"));
resource.setIdentifierStatus(IdentifierStatus.PUBLIC_PENDING_PUBLICATION);
assertEquals("1.2", resource.getEmlVersion().toPlainString());
// the resource has been published, a DOI is public, but there is a new DOI reserved, so the next version is a major version bump
assertEquals("2.0", resource.getNextVersion().toPlainString());
}
/**
* Test adding DOI as alternate identifier, when no alternate identifiers exist yet.
*/
@Test
public void testUpdateAlternateIdentifierForDOICase1() {
Resource r = new Resource();
r.setDoi(new DOI("10.5072/case1"));
r.setIdentifierStatus(IdentifierStatus.PUBLIC);
r.updateAlternateIdentifierForDOI();
assertEquals(1, r.getEml().getAlternateIdentifiers().size());
assertEquals("doi:10.5072/case1", r.getEml().getAlternateIdentifiers().get(0));
}
/**
* Test adding DOI as alternate identifier, when other alternate identifiers do exist.
*/
@Test
public void testUpdateAlternateIdentifierForDOICase2() {
Resource r = new Resource();
r.setDoi(new DOI("10.5072/case2"));
r.setIdentifierStatus(IdentifierStatus.PUBLIC);
r.getEml().getAlternateIdentifiers().add("alt-id-1");
r.getEml().getAlternateIdentifiers().add("alt-id-2");
assertEquals(2, r.getEml().getAlternateIdentifiers().size());
assertEquals("alt-id-1", r.getEml().getAlternateIdentifiers().get(0));
assertEquals("alt-id-2", r.getEml().getAlternateIdentifiers().get(1));
r.updateAlternateIdentifierForDOI();
assertEquals(3, r.getEml().getAlternateIdentifiers().size());
assertEquals("doi:10.5072/case2", r.getEml().getAlternateIdentifiers().get(0));
assertEquals("alt-id-1", r.getEml().getAlternateIdentifiers().get(1));
assertEquals("alt-id-2", r.getEml().getAlternateIdentifiers().get(2));
}
/**
*
* Test adding DOI as alternate identifier, when multiple DOI alternate identifiers exist.
*/
@Test
public void testUpdateAlternateIdentifierForDOICase3() {
Resource r = new Resource();
r.setDoi(new DOI("10.5072/case3"));
r.setIdentifierStatus(IdentifierStatus.PUBLIC);
r.getEml().getAlternateIdentifiers().add("alt-id-1");
r.getEml().getAlternateIdentifiers().add("doi:10.5077/other");
assertEquals(2, r.getEml().getAlternateIdentifiers().size());
assertEquals("alt-id-1", r.getEml().getAlternateIdentifiers().get(0));
assertEquals("doi:10.5077/other", r.getEml().getAlternateIdentifiers().get(1));
r.updateAlternateIdentifierForDOI();
assertEquals(3, r.getEml().getAlternateIdentifiers().size());
assertEquals("doi:10.5072/case3", r.getEml().getAlternateIdentifiers().get(0));
assertEquals("alt-id-1", r.getEml().getAlternateIdentifiers().get(1));
assertEquals("doi:10.5077/other", r.getEml().getAlternateIdentifiers().get(2));
}
/**
* Test adding DOI as alternate identifier, when DOI status is unavailable.
*/
@Test
public void testUpdateAlternateIdentifierForDOICase4() {
Resource r = new Resource();
r.setDoi(new DOI("10.5072/case4"));
r.setIdentifierStatus(IdentifierStatus.UNAVAILABLE);
r.getEml().getAlternateIdentifiers().add("doi:10.5072/case4");
r.getEml().getAlternateIdentifiers().add("doi:10.5077/other");
assertEquals(2, r.getEml().getAlternateIdentifiers().size());
assertEquals("doi:10.5072/case4", r.getEml().getAlternateIdentifiers().get(0));
assertEquals("doi:10.5077/other", r.getEml().getAlternateIdentifiers().get(1));
r.updateAlternateIdentifierForDOI();
assertEquals(1, r.getEml().getAlternateIdentifiers().size());
assertEquals("doi:10.5077/other", r.getEml().getAlternateIdentifiers().get(0));
}
/**
* Test assigning reserved DOI, when no citation exists yet.
*/
@Test
public void testUpdateCitationIdentifierForDOIForDOICase1() {
Resource r = new Resource();
r.setDoi(new DOI("10.5072/case1"));
r.setIdentifierStatus(IdentifierStatus.PUBLIC_PENDING_PUBLICATION);
assertNull(r.getEml().getCitation());
r.updateCitationIdentifierForDOI();
assertNotNull(r.getEml().getCitation());
assertTrue(r.isCitationAutoGenerated());
assertEquals("http://doi.org/10.5072/case1", r.getEml().getCitation().getIdentifier());
assertEquals("Will be replaced by auto-generated citation", r.getEml().getCitation().getCitation());
}
/**
* Test assigning reserved DOI, when citation exists already.
*/
@Test
public void testUpdateCitationIdentifierForDOIForDOICase2() {
Resource r = new Resource();
r.setDoi(new DOI("10.5072/case2"));
r.setIdentifierStatus(IdentifierStatus.PUBLIC_PENDING_PUBLICATION);
Citation existing = new Citation("Citation text", "CitationId");
r.getEml().setCitation(existing);
assertNotNull(r.getEml().getCitation());
r.updateCitationIdentifierForDOI();
assertFalse(r.isCitationAutoGenerated());
assertEquals("http://doi.org/10.5072/case2", r.getEml().getCitation().getIdentifier());
assertEquals("Citation text", r.getEml().getCitation().getCitation());
}
/**
* Test deleting reserved DOI, when citation exists already.
*/
@Test
public void testUpdateCitationIdentifierForDOIForDOICase3() {
Resource r = new Resource();
r.setDoi(new DOI("10.5072/case3"));
r.setIdentifierStatus(IdentifierStatus.UNRESERVED);
Citation existing = new Citation("Citation text", "http://doi.org/10.5072/case3");
r.getEml().setCitation(existing);
assertNotNull(r.getEml().getCitation());
r.updateCitationIdentifierForDOI();
assertFalse(r.isCitationAutoGenerated());
assertNull(r.getEml().getCitation().getIdentifier());
assertEquals("Citation text", r.getEml().getCitation().getCitation());
}
/**
* Test deleting reserved DOI, when no citation exists yet.
*/
@Test
public void testUpdateCitationIdentifierForDOIForDOICase4() {
Resource r = new Resource();
r.setDoi(new DOI("10.5072/case1"));
r.setIdentifierStatus(IdentifierStatus.UNRESERVED);
assertNull(r.getEml().getCitation());
r.updateCitationIdentifierForDOI();
assertNotNull(r.getEml().getCitation());
assertTrue(r.isCitationAutoGenerated());
assertNull(r.getEml().getCitation().getIdentifier());
assertEquals("Will be replaced by auto-generated citation", r.getEml().getCitation().getCitation());
}
/**
* Check: the last published version (3.0) was private.
*/
@Test
public void testIsLastPublishedVersionPublic() {
Resource r = getResource();
assertFalse(r.isLastPublishedVersionPublic());
}
/**
* Check: the last published version (3.0) publication status was PRIVATE.
*/
@Test
public void testGetLastPublishedVersionsPublicationStatus() {
Resource r = getResource();
assertEquals(PublicationStatus.PRIVATE, r.getLastPublishedVersionsPublicationStatus());
}
@Test
public void testIsAssignedGBIFSupportedLicense() {
Resource r = getResource();
// CCO
r.getEml().setIntellectualRights("This work is licensed under <a href=\"http://creativecommons.org/publicdomain/zero/1.0/legalcode\">Creative Commons CCZero (CC0) 1.0 License</a>.");
assertEquals("http://creativecommons.org/publicdomain/zero/1.0/legalcode", r.getEml().parseLicenseUrl());
assertTrue(r.isAssignedGBIFSupportedLicense());
// CC-BY
r.getEml().setIntellectualRights("This work is licensed under a <a href=\"http://creativecommons.org/licenses/by/4.0/legalcode\">Creative Commons Attribution (CC-BY) 4.0 License</a>.");
assertEquals("http://creativecommons.org/licenses/by/4.0/legalcode", r.getEml().parseLicenseUrl());
assertTrue(r.isAssignedGBIFSupportedLicense());
// CC-BY-NC
r.getEml().setIntellectualRights("This work is licensed under a <a href=\"http://creativecommons.org/licenses/by-nc/4.0/legalcode\">Creative Commons Attribution Non Commercial (CC-BY-NC) 4.0 License</a>.");
assertEquals("http://creativecommons.org/licenses/by-nc/4.0/legalcode", r.getEml().parseLicenseUrl());
assertTrue(r.isAssignedGBIFSupportedLicense());
// ODC-PDDL (considered equivalent to CC0)
r.getEml().setIntellectualRights("This work is licensed under a <a href=\"http://www.opendatacommons.org/licenses/pddl/1.0/\">Open Data Commons Public Domain Dedication and Licence (PDDL)</a>.");
assertEquals("http://www.opendatacommons.org/licenses/pddl/1.0/", r.getEml().parseLicenseUrl());
assertTrue(r.isAssignedGBIFSupportedLicense());
// ODC-BY (considered equivalent to CC-BY)
r.getEml().setIntellectualRights("This work is licensed under a <a href=\"http://www.opendatacommons.org/licenses/by/1.0/\">Open Data Commons Attribution License</a>.");
assertEquals("http://www.opendatacommons.org/licenses/by/1.0/", r.getEml().parseLicenseUrl());
assertTrue(r.isAssignedGBIFSupportedLicense());
}
@Test
public void testIsPubliclyAvailable() {
assertFalse(getResource().isPubliclyAvailable());
}
@Test
public void testGetLastPublishedVersionsVersion() {
assertEquals(new BigDecimal("3.0"), getResource().getLastPublishedVersionsVersion());
}
@Test
public void testHasOccurrenceMapping() {
// no extension to start with
Resource r = getResource();
assertFalse(r.hasOccurrenceMapping());
// add core mapping to occurrence core
r.addMapping(getOccExtensionMapping());
assertTrue(r.hasOccurrenceMapping());
// replace core mapping to use taxon core
r.getMappings().clear();
r.addMapping(getTaxExtensionMapping());
assertFalse(r.hasOccurrenceMapping());
// add non-occurrence extension
r.addMapping(getExtExtensionMapping());
assertFalse(r.hasOccurrenceMapping());
// add occurrence extension
r.addMapping(getOccExtensionMapping());
assertTrue(r.hasOccurrenceMapping());
}
}