package org.gbif.api.model.occurrence;
import org.gbif.api.util.IsoDateParsingUtils.IsoDateFormat;
import org.gbif.api.vocabulary.Extension;
import org.gbif.dwc.terms.DcTerm;
import org.gbif.dwc.terms.DwcTerm;
import org.gbif.dwc.terms.GbifTerm;
import org.gbif.dwc.terms.IucnTerm;
import org.gbif.dwc.terms.Term;
import org.gbif.dwc.terms.TermFactory;
import org.gbif.dwc.terms.UnknownTerm;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.RandomStringUtils;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class VerbatimOccurrenceTest {
@Test
public void testFieldUpdate() {
VerbatimOccurrence occ = new VerbatimOccurrence();
String catNum = "abc123";
occ.setVerbatimField(DwcTerm.catalogNumber, catNum);
assertEquals(catNum, occ.getVerbatimField(DwcTerm.catalogNumber));
String catNum2 = "qwer";
occ.setVerbatimField(DwcTerm.catalogNumber, catNum2);
assertEquals(catNum2, occ.getVerbatimField(DwcTerm.catalogNumber));
}
@Test
public void testHasField() {
VerbatimOccurrence occ = new VerbatimOccurrence();
occ.setVerbatimField(DwcTerm.catalogNumber, "abc123");
assertTrue(occ.hasVerbatimField(DwcTerm.catalogNumber));
assertFalse(occ.hasVerbatimField(DwcTerm.institutionCode));
occ.setVerbatimField(DwcTerm.catalogNumber, " ");
assertTrue(occ.hasVerbatimField(DwcTerm.catalogNumber));
occ.setVerbatimField(DwcTerm.catalogNumber, "");
assertFalse(occ.hasVerbatimField(DwcTerm.catalogNumber));
occ.setVerbatimField(DwcTerm.catalogNumber, null);
assertFalse(occ.hasVerbatimField(DwcTerm.catalogNumber));
}
@Test
public void testFieldFromTermFactory() {
VerbatimOccurrence occ = new VerbatimOccurrence();
String prefix = "t_";
String colName = "t_dwc:basisOfRecord";
Term term = TermFactory.instance().findTerm(colName.substring(prefix.length()));
occ.setVerbatimField(term, "PreservedSpecimen");
assertEquals(1, occ.getVerbatimFields().size());
assertTrue(occ.hasVerbatimField(DwcTerm.basisOfRecord));
assertEquals("PreservedSpecimen", occ.getVerbatimField(DwcTerm.basisOfRecord));
}
@Test
public void testJsonSerde() throws IOException {
ObjectMapper mapper = new ObjectMapper();
VerbatimOccurrence verb = new VerbatimOccurrence();
verb.setVerbatimField(DwcTerm.institutionCode, "IC");
verb.setVerbatimField(DwcTerm.collectionCode, "BUGS");
verb.setVerbatimField(DwcTerm.catalogNumber, "MD10782");
String json = mapper.writeValueAsString(verb);
VerbatimOccurrence deser = mapper.readValue(json, VerbatimOccurrence.class);
assertEquals(verb, deser);
for (DwcTerm term : DwcTerm.values()) {
assertEquals(verb.getVerbatimField(term), deser.getVerbatimField(term));
}
}
@Test
public void testJsonSerdeAllFields() throws IOException {
ObjectMapper mapper = new ObjectMapper();
VerbatimOccurrence verb = new VerbatimOccurrence();
verb.setKey(123);
String termPrefix = "I am Jack's ";
for (Term term : DwcTerm.values()) {
verb.setVerbatimField(term, termPrefix + term);
}
for (Term term : DcTerm.values()) {
verb.setVerbatimField(term, termPrefix + term);
}
for (Term term : GbifTerm.values()) {
verb.setVerbatimField(term, termPrefix + term);
}
for (Term term : IucnTerm.values()) {
verb.setVerbatimField(term, termPrefix + term);
}
String json = mapper.writeValueAsString(verb);
VerbatimOccurrence deser = mapper.readValue(json, VerbatimOccurrence.class);
assertEquals(verb, deser);
for (Term term : DwcTerm.values()) {
assertTrue(deser.hasVerbatimField(term));
assertEquals(termPrefix + term, deser.getVerbatimField(term));
}
for (Term term : DcTerm.values()) {
assertTrue(deser.hasVerbatimField(term));
assertEquals(termPrefix + term, deser.getVerbatimField(term));
}
for (Term term : GbifTerm.values()) {
assertTrue(deser.hasVerbatimField(term));
assertEquals(termPrefix + term, deser.getVerbatimField(term));
}
for (Term term : IucnTerm.values()) {
assertTrue(deser.hasVerbatimField(term));
assertEquals(termPrefix + term, deser.getVerbatimField(term));
}
}
@Test
public void testVerbatimMapSerde() throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
mapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
mapper.disable(SerializationConfig.Feature.WRITE_NULL_PROPERTIES);
VerbatimOccurrence v = new VerbatimOccurrence();
v.setKey(7);
v.setLastParsed(new Date());
v.setDatasetKey(UUID.randomUUID());
for (Term term : DwcTerm.values()) {
v.setVerbatimField(term, RandomStringUtils.randomAlphabetic(20));
}
final int numDwcTerms = v.getVerbatimFields().size();
for (Term term : DcTerm.values()) {
v.setVerbatimField(term, RandomStringUtils.randomAlphabetic(20));
}
final int numDcTerms = v.getVerbatimFields().size() - numDwcTerms;
for (Term term : GbifTerm.values()) {
v.setVerbatimField(term, RandomStringUtils.randomAlphabetic(20));
}
final int numGbifTerms = v.getVerbatimFields().size() - numDwcTerms - numDcTerms;
for (Term term : IucnTerm.values()) {
v.setVerbatimField(term, RandomStringUtils.randomAlphanumeric(20));
}
final int numIucnTerms = v.getVerbatimFields().size() - numDwcTerms - numDcTerms - numGbifTerms;
v.setVerbatimField(DwcTerm.scientificName, "Abies alba");
v.setVerbatimField(DwcTerm.collectionCode, "BUGS");
v.setVerbatimField(DwcTerm.catalogNumber, "MD10782");
v.setVerbatimField(UnknownTerm.build("http://rs.un.org/terms/temperatur"), RandomStringUtils.randomAlphabetic(30));
v.setVerbatimField(UnknownTerm.build("http://rs.un.org/terms/co2"), RandomStringUtils.randomAlphabetic(30));
v.setVerbatimField(UnknownTerm.build("http://rs.un.org/terms/modified"), new Date().toString());
v.setVerbatimField(UnknownTerm.build("http://rs.un.org/terms/scientificName"),
RandomStringUtils.randomAlphabetic(30));
final int numOtherTerms = v.getVerbatimFields().size() - numDwcTerms - numDcTerms - numGbifTerms - numIucnTerms;
final int numTerms = v.getVerbatimFields().size();
assertEquals(numTerms, numDwcTerms + numDcTerms + numGbifTerms + numIucnTerms + numOtherTerms);
String json = mapper.writeValueAsString(v);
System.out.println(json);
VerbatimOccurrence v2 = mapper.readValue(json, VerbatimOccurrence.class);
// 5 terms
assertEquals(numTerms, v2.getVerbatimFields().size());
}
@Test
public void testVerbatimExtensionsMapSerde() throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
mapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
mapper.disable(SerializationConfig.Feature.WRITE_NULL_PROPERTIES);
Map<Term, String> verbatimRecord = new HashMap<Term, String>();
Date today = new Date();
verbatimRecord.put(DcTerm.created, IsoDateFormat.FULL.getDateFormat().format(today));
verbatimRecord.put(DcTerm.creator, "fede");
verbatimRecord.put(DcTerm.description, "testDescription");
verbatimRecord.put(DcTerm.format, "jpg");
verbatimRecord.put(DcTerm.license, "licenseTest");
verbatimRecord.put(DcTerm.publisher, "publisherTest");
verbatimRecord.put(DcTerm.title, "titleTest");
verbatimRecord.put(DcTerm.references, "http://www.gbif.org/");
verbatimRecord.put(DcTerm.identifier, "http://www.gbif.org/");
VerbatimOccurrence v = new VerbatimOccurrence();
v.setKey(7);
v.setLastParsed(new Date());
v.setDatasetKey(UUID.randomUUID());
Map<Extension, List<Map<Term, String>>> extensions = new HashMap<Extension, List<Map<Term, String>>>();
List<Map<Term, String>> verbatimRecords = Lists.newArrayList();
verbatimRecords.add(verbatimRecord);
extensions.put(Extension.MULTIMEDIA, verbatimRecords);
v.setExtensions(extensions);
String json = mapper.writeValueAsString(v);
System.out.println(json);
VerbatimOccurrence v2 = mapper.readValue(json, VerbatimOccurrence.class);
assertNotNull(v2.getExtensions());
assertTrue(!v2.getExtensions().get(Extension.MULTIMEDIA).isEmpty());
assertEquals(v2.getExtensions().get(Extension.MULTIMEDIA).get(0), verbatimRecord);
}
}