diff --git a/preston-cmd/src/main/java/bio/guoda/preston/cmd/ZenodoMetaUtil.java b/preston-cmd/src/main/java/bio/guoda/preston/cmd/ZenodoMetaUtil.java index 08592716..c3d1226a 100644 --- a/preston-cmd/src/main/java/bio/guoda/preston/cmd/ZenodoMetaUtil.java +++ b/preston-cmd/src/main/java/bio/guoda/preston/cmd/ZenodoMetaUtil.java @@ -13,6 +13,7 @@ public class ZenodoMetaUtil { public static final String IS_DERIVED_FROM = "isDerivedFrom"; + public static final String IS_DOCUMENTED_BY = "isDocumentedBy"; public static final String IS_PART_OF = "isPartOf"; public static final String REFERENCES = "references"; public static final String RELATED_IDENTIFIERS = "related_identifiers"; @@ -42,7 +43,8 @@ public class ZenodoMetaUtil { public static final String FIELD_CUSTOM_DWC_CLASS = "dwc:class"; public static final String FIELD_CUSTOM_DWC_ORDER = "dwc:order"; public static final String FIELD_CUSTOM_AC_RESOURCE_CREATION_TECHNIQUE = "ac:resourceCreationTechnique"; - public static final String FIELD_CUSTOM_AC_RESOURCE_CAPTURE_DEVICE = "ac:captureDevice"; + public static final String FIELD_CUSTOM_AC_CAPTURE_DEVICE = "ac:captureDevice"; + public static final String FIELD_CUSTOM_AC_SUBJECT_PART = "ac:subjectPart"; public static final String DOI = "doi"; public static final String IS_ALTERNATE_IDENTIFIER = "isAlternateIdentifier"; public static final String UPLOAD_TYPE = "upload_type"; diff --git a/preston-taxodros/src/main/java/bio/guoda/preston/cmd/DarkTaxonFileStreamHandler.java b/preston-taxodros/src/main/java/bio/guoda/preston/cmd/DarkTaxonFileStreamHandler.java index ba421a4f..78a0b2f1 100644 --- a/preston-taxodros/src/main/java/bio/guoda/preston/cmd/DarkTaxonFileStreamHandler.java +++ b/preston-taxodros/src/main/java/bio/guoda/preston/cmd/DarkTaxonFileStreamHandler.java @@ -172,7 +172,7 @@ private void populateFileObject(ObjectNode objectNode, objectNode.put(IMAGE_CONTENT_ID, imageContentId); String imageStackId = plateId + "_" + specimenId + "_stacked_" + imageStackNumber; - ZenodoMetaUtil.addCustomField(objectNode, ZenodoMetaUtil.FIELD_CUSTOM_AC_RESOURCE_CAPTURE_DEVICE, "digital camera"); + ZenodoMetaUtil.addCustomField(objectNode, ZenodoMetaUtil.FIELD_CUSTOM_AC_CAPTURE_DEVICE, "digital camera"); if (StringUtils.equals("stacked", matcher.group("imageAcquisitionMethod"))) { idForStack.put(imageStackId, imageContentId); ZenodoMetaUtil.addCustomField(objectNode, ZenodoMetaUtil.FIELD_CUSTOM_AC_RESOURCE_CREATION_TECHNIQUE, "focus stacking"); @@ -180,7 +180,8 @@ private void populateFileObject(ObjectNode objectNode, String mimeType = "image/tiff"; - DarkTaxonUtil.populatePhotoDepositMetadata(objectNode, imageFilename, specimenId, imageContentId, mimeType, publicationDateFactory, communities, "Photo of Specimen " + specimenId, "Uploaded by Plazi for the Museum für Naturkunde Berlin."); + List creators = Arrays.asList("Museum für Naturkunde Berlin"); + DarkTaxonUtil.populatePhotoDepositMetadata(objectNode, imageFilename, specimenId, imageContentId, mimeType, publicationDateFactory, communities, "Photo of Specimen " + specimenId, "Uploaded by Plazi for the Museum für Naturkunde Berlin.", creators); if (StringUtils.equals("RAW", acquisitionMethod)) { String imageNumber = matcher.group("imageNumber"); diff --git a/preston-taxodros/src/main/java/bio/guoda/preston/cmd/DarkTaxonUtil.java b/preston-taxodros/src/main/java/bio/guoda/preston/cmd/DarkTaxonUtil.java index 700741f7..07aba4cd 100644 --- a/preston-taxodros/src/main/java/bio/guoda/preston/cmd/DarkTaxonUtil.java +++ b/preston-taxodros/src/main/java/bio/guoda/preston/cmd/DarkTaxonUtil.java @@ -13,6 +13,7 @@ import java.util.Arrays; import java.util.List; +import java.util.stream.Stream; import static bio.guoda.preston.cmd.ZenodoMetaUtil.PUBLICATION_DATE; @@ -24,7 +25,7 @@ static void appendAlternateIdentifiers(ObjectNode linkRecords, String imageConte ZenodoMetaUtil.appendIdentifier(linkRecords, ZenodoMetaUtil.HAS_VERSION, imageContentId); } - public static void populatePhotoDepositMetadata(ObjectNode objectNode, String imageFilename, String specimenId, String imageContentId, String mimeType, PublicationDateFactory publicationDateFactory, List communities, String title, String description) { + public static void populatePhotoDepositMetadata(ObjectNode objectNode, String imageFilename, String specimenId, String imageContentId, String mimeType, PublicationDateFactory publicationDateFactory, List communities, String title, String description, List creators) { ZenodoMetaUtil.addCustomField(objectNode, ZenodoMetaUtil.FIELD_CUSTOM_DWC_CATALOG_NUMBER, specimenId); ZenodoMetaUtil.addCustomField(objectNode, ZenodoMetaUtil.FIELD_CUSTOM_DWC_INSTITUTION_CODE, "MfN"); ZenodoMetaUtil.addCustomField(objectNode, ZenodoMetaUtil.FIELD_CUSTOM_DWC_MATERIAL_SAMPLE_ID, specimenId); @@ -33,11 +34,13 @@ public static void populatePhotoDepositMetadata(ObjectNode objectNode, String im setDescription(objectNode, description); ZenodoMetaUtil.setFilename(objectNode, imageFilename); appendAlternateIdentifiers(objectNode, imageContentId); - ZenodoMetaUtil.appendIdentifier(objectNode, ZenodoMetaUtil.IS_DERIVED_FROM, StringUtils.startsWith(specimenId, "urn:lsid:") ? specimenId : LSID_PREFIX + specimenId); + String specimenLSID = StringUtils.startsWith(specimenId, "urn:lsid:") ? specimenId : LSID_PREFIX + specimenId; + ZenodoMetaUtil.appendIdentifier(objectNode, ZenodoMetaUtil.IS_ALTERNATE_IDENTIFIER, specimenLSID + ":" + imageFilename); + ZenodoMetaUtil.appendIdentifier(objectNode, ZenodoMetaUtil.IS_DERIVED_FROM, specimenLSID); ZenodoMetaUtil.setType(objectNode, mimeType); ZenodoMetaUtil.setValue(objectNode, ZenodoMetaUtil.UPLOAD_TYPE, ZenodoMetaUtil.UPLOAD_TYPE_IMAGE); ZenodoMetaUtil.setValue(objectNode, ZenodoMetaUtil.IMAGE_TYPE, ZenodoMetaUtil.IMAGE_TYPE_PHOTO); - ZenodoMetaUtil.setCreators(objectNode, Arrays.asList("Museum für Naturkunde Berlin")); + ZenodoMetaUtil.setCreators(objectNode, creators); ZenodoMetaUtil.setValue(objectNode, PUBLICATION_DATE, publicationDateFactory.getPublicationDate()); ZenodoMetaUtil.setCommunities(objectNode, communities.stream()); } @@ -47,8 +50,13 @@ public static void setDescription(ObjectNode objectNode, String description) { } public static ObjectNode toPhotoDeposit(JsonNode multimediaRecord, PublicationDateFactory publicationDateFactory, List communities) { + JsonNode format = multimediaRecord.get("http://purl.org/dc/elements/1.1/format"); JsonNode jsonNode = multimediaRecord.get("http://purl.org/dc/terms/identifier"); String filename = jsonNode.asText(); + if (!filename.contains(".")) { + filename = filename + "." + StringUtils.lowerCase(format.asText()); + } + JsonNode specimenReference = multimediaRecord.get("http://rs.tdwg.org/ac/terms/associatedSpecimenReference"); String specimenId = specimenReference.asText(); JsonNode hashValue = multimediaRecord.get("http://rs.tdwg.org/ac/terms/hashValue"); @@ -59,13 +67,18 @@ public static ObjectNode toPhotoDeposit(JsonNode multimediaRecord, PublicationDa throw new IllegalArgumentException("unsupported content id [" + imageContentId + "]"); } - JsonNode format = multimediaRecord.get("http://purl.org/dc/elements/1.1/format"); - - ObjectNode zenodoMetadata = new ObjectMapper().createObjectNode(); + JsonNode tagNode = multimediaRecord.get("http://rs.tdwg.org/ac/terms/tag"); + if (tagNode != null) { + String[] tags = StringUtils.split(tagNode.asText(), "|"); + Stream.of(tags).forEach(tag -> ZenodoMetaUtil.addKeyword(zenodoMetadata, StringUtils.trim(tag))); + } + String title = multimediaRecord.get("http://purl.org/dc/terms/title").asText(); String description = multimediaRecord.get("http://purl.org/dc/terms/description").asText(); + JsonNode creatorNode = multimediaRecord.get("http://purl.org/dc/elements/1.1/creator"); + List creators = Arrays.asList(creatorNode == null ? "Museum für Naturkunde Berlin" : creatorNode.asText()); populatePhotoDepositMetadata( zenodoMetadata, filename, @@ -75,12 +88,14 @@ public static ObjectNode toPhotoDeposit(JsonNode multimediaRecord, PublicationDa publicationDateFactory, communities, title, - description + description, creators ); - ZenodoMetaUtil.addCustomField(zenodoMetadata, ZenodoMetaUtil.FIELD_CUSTOM_AC_RESOURCE_CAPTURE_DEVICE, multimediaRecord.get("http://rs.tdwg.org/ac/terms/captureDevice").asText()); + ZenodoMetaUtil.appendIdentifier(zenodoMetadata, ZenodoMetaUtil.IS_DOCUMENTED_BY, multimediaRecord.get("http://rs.tdwg.org/ac/terms/hasServiceAccessPoint").asText()); + ZenodoMetaUtil.addCustomField(zenodoMetadata, ZenodoMetaUtil.FIELD_CUSTOM_AC_SUBJECT_PART, multimediaRecord.get("http://rs.tdwg.org/ac/terms/subjectPart").asText()); + ZenodoMetaUtil.addCustomField(zenodoMetadata, ZenodoMetaUtil.FIELD_CUSTOM_AC_CAPTURE_DEVICE, multimediaRecord.get("http://rs.tdwg.org/ac/terms/captureDevice").asText()); ZenodoMetaUtil.addCustomField(zenodoMetadata, ZenodoMetaUtil.FIELD_CUSTOM_AC_RESOURCE_CREATION_TECHNIQUE, multimediaRecord.get("http://rs.tdwg.org/ac/terms/resourceCreationTechnique").asText()); String[] split = StringUtils.split(specimenId, ":"); - String catalogNumber = split.length > 0 ? split[split.length-1] : specimenId; + String catalogNumber = split.length > 0 ? split[split.length - 1] : specimenId; ZenodoMetaUtil.addCustomField(zenodoMetadata, ZenodoMetaUtil.FIELD_CUSTOM_DWC_CATALOG_NUMBER, catalogNumber); return ZenodoMetaUtil.wrap(zenodoMetadata); diff --git a/preston-taxodros/src/test/java/bio/guoda/preston/cmd/DarkTaxonRecordTranslatorTest.java b/preston-taxodros/src/test/java/bio/guoda/preston/cmd/DarkTaxonUtilTest.java similarity index 98% rename from preston-taxodros/src/test/java/bio/guoda/preston/cmd/DarkTaxonRecordTranslatorTest.java rename to preston-taxodros/src/test/java/bio/guoda/preston/cmd/DarkTaxonUtilTest.java index f77bdc53..80e95168 100644 --- a/preston-taxodros/src/test/java/bio/guoda/preston/cmd/DarkTaxonRecordTranslatorTest.java +++ b/preston-taxodros/src/test/java/bio/guoda/preston/cmd/DarkTaxonUtilTest.java @@ -16,7 +16,7 @@ import static junit.framework.TestCase.assertNotNull; import static org.hamcrest.MatcherAssert.assertThat; -public class DarkTaxonRecordTranslatorTest { +public class DarkTaxonUtilTest { @Test public void photoDeposit() throws IOException { diff --git a/preston-taxodros/src/test/resources/bio/guoda/preston/cmd/darktaxon/multimedia-zenodo.json b/preston-taxodros/src/test/resources/bio/guoda/preston/cmd/darktaxon/multimedia-zenodo.json index 9811368a..73109309 100644 --- a/preston-taxodros/src/test/resources/bio/guoda/preston/cmd/darktaxon/multimedia-zenodo.json +++ b/preston-taxodros/src/test/resources/bio/guoda/preston/cmd/darktaxon/multimedia-zenodo.json @@ -1,10 +1,12 @@ { "metadata" : { + "keywords" : [ "MfN", "DarkTaxon" ], "custom" : { "dwc:catalogNumber" : [ "BMT0009388" ], "dwc:institutionCode" : [ "MfN" ], "dwc:materialSampleID" : [ "urn:lsid:MfN:Ento:BMT0009388" ], "ac:associatedSpecimenReference" : [ "urn:lsid:MfN:Ento:BMT0009388" ], + "ac:subjectPart" : [ "whole specimen" ], "ac:captureDevice" : [ "CAMERA MAKE AND MODEL" ], "ac:resourceCreationTechnique" : [ "Focal Stacking" ] }, @@ -17,15 +19,21 @@ }, { "relation" : "hasVersion", "identifier" : "hash://md5/f052cbac398bf340a620c421bfefa16d" + }, { + "relation" : "isAlternateIdentifier", + "identifier" : "urn:lsid:MfN:Ento:BMT0009388:BMT121_BMT0009388_stacked_01.tiff" }, { "relation" : "isDerivedFrom", "identifier" : "urn:lsid:MfN:Ento:BMT0009388" + }, { + "relation" : "isDocumentedBy", + "identifier" : "https://zenodo.org/search?q=_files.checksum%3A%22md5%3Af052cbac398bf340a620c421bfefa16d%22&f=allversions%3Atrue" } ], "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" : "image/tiff", "upload_type" : "image", "image_type" : "photo", "creators" : [ { - "name" : "Museum für Naturkunde Berlin" + "name" : "null" } ], "publication_date" : "1999-12-31", "communities" : [ {