diff --git a/src/main/java/gov/loc/repository/bagit/conformance/profile/BagInfoRequirement.java b/src/main/java/gov/loc/repository/bagit/conformance/profile/BagInfoRequirement.java index 155c2ab03..25da68ca6 100644 --- a/src/main/java/gov/loc/repository/bagit/conformance/profile/BagInfoRequirement.java +++ b/src/main/java/gov/loc/repository/bagit/conformance/profile/BagInfoRequirement.java @@ -10,7 +10,7 @@ public class BagInfoRequirement { private boolean required; private List acceptableValues = new ArrayList<>(); - private boolean repeatable; + private boolean repeatable = true; @Override public boolean equals(final Object other) { @@ -31,12 +31,28 @@ public int hashCode() { public BagInfoRequirement(){ //intentionally left empty } - + /** + * Constructs a new BagInfoRequirement setting {@link #repeatable} to true (default). + * @param required Indicates whether or not the tag is required. + * @param acceptableValues List of acceptable values. + */ public BagInfoRequirement(final boolean required, final List acceptableValues){ this.required = required; this.acceptableValues = acceptableValues; } + /** + * Constructs a new BagInfoRequirement. + * @param required Indicates whether or not the tag is required. + * @param acceptableValues List of acceptable values. + * @param repeatable Indicates whether or not the tag is repeatable. + */ + public BagInfoRequirement(final boolean required, final List acceptableValues, final boolean repeatable){ + this.required = required; + this.acceptableValues = acceptableValues; + this.repeatable = repeatable; + } + @Override public String toString() { return "[required=" + required + ", acceptableValues=" + acceptableValues + ", repeatable=" + repeatable + "]"; diff --git a/src/main/java/gov/loc/repository/bagit/conformance/profile/BagitProfile.java b/src/main/java/gov/loc/repository/bagit/conformance/profile/BagitProfile.java index 1ed5158a9..d7eb29933 100644 --- a/src/main/java/gov/loc/repository/bagit/conformance/profile/BagitProfile.java +++ b/src/main/java/gov/loc/repository/bagit/conformance/profile/BagitProfile.java @@ -16,6 +16,7 @@ public class BagitProfile { private String externalDescription = ""; private String contactName = ""; private String contactEmail = ""; + private String contactPhone = ""; private String version = ""; private Map bagInfoRequirements = new HashMap<>(); @@ -38,6 +39,7 @@ public boolean equals(final Object other) { && Objects.equals(sourceOrganization, castOther.sourceOrganization) && Objects.equals(externalDescription, castOther.externalDescription) && Objects.equals(contactName, castOther.contactName) && Objects.equals(contactEmail, castOther.contactEmail) + && Objects.equals(contactPhone, castOther.contactPhone) && Objects.equals(version, castOther.version) && Objects.equals(bagInfoRequirements, castOther.bagInfoRequirements) && Objects.equals(manifestTypesRequired, castOther.manifestTypesRequired) @@ -50,15 +52,14 @@ public boolean equals(final Object other) { } @Override public int hashCode() { - return Objects.hash(bagitProfileIdentifier, sourceOrganization, externalDescription, contactName, contactEmail, - version, bagInfoRequirements, manifestTypesRequired, fetchFileAllowed, serialization, + return Objects.hash(bagitProfileIdentifier, sourceOrganization, externalDescription, contactName, contactEmail, contactPhone, version, bagInfoRequirements, manifestTypesRequired, fetchFileAllowed, serialization, acceptableMIMESerializationTypes, acceptableBagitVersions, tagManifestTypesRequired, tagFilesRequired); } @Override public String toString() { return "BagitProfile [bagitProfileIdentifier=" + bagitProfileIdentifier + ", sourceOrganization=" + sourceOrganization + ", externalDescription=" + externalDescription + ", contactName=" + contactName - + ", contactEmail=" + contactEmail + ", version=" + version + ", bagInfoRequirements=" + bagInfoRequirements + + ", contactEmail=" + contactEmail + ", contactPhone=" + contactPhone + ", version=" + version + ", bagInfoRequirements=" + bagInfoRequirements + ", manifestTypesRequired=" + manifestTypesRequired + ", fetchFileAllowed=" + fetchFileAllowed + ", serialization=" + serialization + ", acceptableMIMESerializationTypes=" + acceptableMIMESerializationTypes + ", acceptableBagitVersions=" + acceptableBagitVersions + ", tagManifestTypesRequired=" @@ -143,6 +144,12 @@ public String getContactEmail() { public void setContactEmail(final String contactEmail) { this.contactEmail = contactEmail; } + public String getContactPhone() { + return contactPhone; + } + public void setContactPhone(final String contactPhone) { + this.contactPhone = contactPhone; + } public String getVersion() { return version; } diff --git a/src/main/java/gov/loc/repository/bagit/conformance/profile/BagitProfileDeserializer.java b/src/main/java/gov/loc/repository/bagit/conformance/profile/BagitProfileDeserializer.java index 4684d02bc..3d48bec68 100644 --- a/src/main/java/gov/loc/repository/bagit/conformance/profile/BagitProfileDeserializer.java +++ b/src/main/java/gov/loc/repository/bagit/conformance/profile/BagitProfileDeserializer.java @@ -19,9 +19,10 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer; /** - * Deserialize bagit profile json to a {@link BagitProfile} + * Deserialize bagit profile json to a {@link BagitProfile} */ public class BagitProfileDeserializer extends StdDeserializer { + private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(BagitProfileDeserializer.class); private static final ResourceBundle messages = ResourceBundle.getBundle("MessageBundle"); @@ -36,149 +37,200 @@ public BagitProfileDeserializer(final Class vc) { @Override public BagitProfile deserialize(final JsonParser p, final DeserializationContext ctxt) - throws IOException, JsonProcessingException { + throws IOException, JsonProcessingException { final BagitProfile profile = new BagitProfile(); final JsonNode node = p.getCodec().readTree(p); - + parseBagitProfileInfo(node, profile); - + profile.setBagInfoRequirements(parseBagInfo(node)); - + profile.getManifestTypesRequired().addAll(parseManifestTypesRequired(node)); - + profile.setFetchFileAllowed(node.get("Allow-Fetch.txt").asBoolean()); logger.debug(messages.getString("fetch_allowed"), profile.isFetchFileAllowed()); - + profile.setSerialization(Serialization.valueOf(node.get("Serialization").asText())); - logger.debug(messages.getString("serialization_allowed"),profile.getSerialization()); - + logger.debug(messages.getString("serialization_allowed"), profile.getSerialization()); + profile.getAcceptableMIMESerializationTypes().addAll(parseAcceptableSerializationFormats(node)); - + profile.getTagManifestTypesRequired().addAll(parseRequiredTagmanifestTypes(node)); - + profile.getTagFilesRequired().addAll(parseRequiredTagFiles(node)); - + profile.getAcceptableBagitVersions().addAll(parseAcceptableVersions(node)); - + return profile; } - - private static void parseBagitProfileInfo(final JsonNode node, final BagitProfile profile){ - final JsonNode bagitProfileInfoNode = node.get("BagIt-Profile-Info"); + + private static void parseBagitProfileInfo(final JsonNode node, final BagitProfile profile) { logger.debug(messages.getString("parsing_bagit_profile_info_section")); + final JsonNode bagitProfileInfoNode = node.get("BagIt-Profile-Info"); + parseMandatoryTagsOfBagitProfileInfo(bagitProfileInfoNode, profile); + parseOptionalTagsOfBagitProfileInfo(bagitProfileInfoNode, profile); + } + + /** + * Parse required tags due to specification defined at + * {@link https://github.com/bagit-profiles/bagit-profiles} + * Note: If one of the tags is missing, a NullPointerException is thrown. + * + * @param bagitProfileInfoNode Root node of the bagit profile info section. + * @param profile Representation of bagit profile. + */ + private static void parseMandatoryTagsOfBagitProfileInfo(final JsonNode bagitProfileInfoNode, final BagitProfile profile) { + logger.debug(messages.getString("parsing_mandatory_tags_of_bagit_profile_info_section")); + final String profileIdentifier = bagitProfileInfoNode.get("BagIt-Profile-Identifier").asText(); logger.debug(messages.getString("identifier"), profileIdentifier); profile.setBagitProfileIdentifier(profileIdentifier); - + final String sourceOrg = bagitProfileInfoNode.get("Source-Organization").asText(); logger.debug(messages.getString("source_organization"), sourceOrg); profile.setSourceOrganization(sourceOrg); - - final String contactName = bagitProfileInfoNode.get("Contact-Name").asText(); - logger.debug(messages.getString("contact_name"), contactName); - profile.setContactName(contactName); - - final String contactEmail = bagitProfileInfoNode.get("Contact-Email").asText(); - logger.debug(messages.getString("contact_email"), contactEmail); - profile.setContactEmail(contactEmail); - + final String extDescript = bagitProfileInfoNode.get("External-Description").asText(); logger.debug(messages.getString("external_description"), extDescript); profile.setExternalDescription(extDescript); - + final String version = bagitProfileInfoNode.get("Version").asText(); logger.debug(messages.getString("version"), version); profile.setVersion(version); } - + + /** + * Parse optional tags due to specification defined at + * {@link https://github.com/bagit-profiles/bagit-profiles} + * + * @param bagitProfileInfoNode Root node of the bagit profile info section. + * @param profile Representation of bagit profile . + */ + private static void parseOptionalTagsOfBagitProfileInfo(final JsonNode bagitProfileInfoNode, final BagitProfile profile) { + logger.debug(messages.getString("parsing_optional_tags_of_bagit_profile_info_section")); + + final JsonNode contactNameNode = bagitProfileInfoNode.get("Contact-Name"); + if (contactNameNode != null) { + final String contactName = contactNameNode.asText(); + logger.debug(messages.getString("contact_name"), contactName); + profile.setContactName(contactName); + } + + final JsonNode contactEmailNode = bagitProfileInfoNode.get("Contact-Email"); + if (contactEmailNode != null) { + final String contactEmail = contactEmailNode.asText(); + logger.debug(messages.getString("contact_email"), contactEmail); + profile.setContactEmail(contactEmail); + } + + final JsonNode contactPhoneNode = bagitProfileInfoNode.get("Contact-Phone"); + if (contactPhoneNode != null) { + final String contactPhone = contactPhoneNode.asText(); + logger.debug(messages.getString("contact_phone"), contactPhone); + profile.setContactPhone(contactPhone); + } + } + @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") - private static Map parseBagInfo(final JsonNode rootNode){ + private static Map parseBagInfo(final JsonNode rootNode) { final JsonNode bagInfoNode = rootNode.get("Bag-Info"); logger.debug(messages.getString("parsing_bag_info")); - final Map bagInfo = new HashMap<>(); - + final Map bagInfo = new HashMap<>(); + final Iterator> nodes = bagInfoNode.fields(); //stuck in java 6... - - while(nodes.hasNext()){ + + while (nodes.hasNext()) { final Entry node = nodes.next(); - + final BagInfoRequirement entry = new BagInfoRequirement(); - entry.setRequired(node.getValue().get("required").asBoolean()); - + // due to specification required is false by default. + final JsonNode requiredNode = node.getValue().get("required"); + if (requiredNode != null) { + entry.setRequired(requiredNode.asBoolean()); + } + final JsonNode valuesNode = node.getValue().get("values"); - if(valuesNode != null){ - for(final JsonNode value : valuesNode){ + if (valuesNode != null) { + for (final JsonNode value : valuesNode) { entry.getAcceptableValues().add(value.asText()); } } - + + final JsonNode repeatableNode = node.getValue().get("repeatable"); + if (repeatableNode != null) { + entry.setRepeatable(repeatableNode.asBoolean()); + } + logger.debug("{}: {}", node.getKey(), entry); bagInfo.put(node.getKey(), entry); } - + return bagInfo; } - - private static List parseManifestTypesRequired(final JsonNode node){ + + private static List parseManifestTypesRequired(final JsonNode node) { final JsonNode manifests = node.get("Manifests-Required"); - + final List manifestTypes = new ArrayList<>(); - + for (final JsonNode manifestName : manifests) { manifestTypes.add(manifestName.asText()); } - + logger.debug(messages.getString("required_manifest_types"), manifestTypes); - + return manifestTypes; } - - private static List parseAcceptableSerializationFormats(final JsonNode node){ + + private static List parseAcceptableSerializationFormats(final JsonNode node) { final JsonNode serialiationFormats = node.get("Accept-Serialization"); final List serialTypes = new ArrayList<>(); - + for (final JsonNode serialiationFormat : serialiationFormats) { serialTypes.add(serialiationFormat.asText()); } logger.debug(messages.getString("acceptable_serialization_mime_types"), serialTypes); - + return serialTypes; } - - private static List parseRequiredTagmanifestTypes(final JsonNode node){ + + private static List parseRequiredTagmanifestTypes(final JsonNode node) { final JsonNode tagManifestsRequiredNodes = node.get("Tag-Manifests-Required"); final List requiredTagmanifestTypes = new ArrayList<>(); - - for(final JsonNode tagManifestsRequiredNode : tagManifestsRequiredNodes){ - requiredTagmanifestTypes.add(tagManifestsRequiredNode.asText()); + if (tagManifestsRequiredNodes != null) { + for (final JsonNode tagManifestsRequiredNode : tagManifestsRequiredNodes) { + requiredTagmanifestTypes.add(tagManifestsRequiredNode.asText()); + } } logger.debug(messages.getString("required_tagmanifest_types"), requiredTagmanifestTypes); - + return requiredTagmanifestTypes; } - - private static List parseRequiredTagFiles(final JsonNode node){ + + private static List parseRequiredTagFiles(final JsonNode node) { final JsonNode tagFilesRequiredNodes = node.get("Tag-Files-Required"); final List requiredTagFiles = new ArrayList<>(); - - for(final JsonNode tagFilesRequiredNode : tagFilesRequiredNodes){ - requiredTagFiles.add(tagFilesRequiredNode.asText()); + + if (tagFilesRequiredNodes != null) { + for (final JsonNode tagFilesRequiredNode : tagFilesRequiredNodes) { + requiredTagFiles.add(tagFilesRequiredNode.asText()); + } } logger.debug(messages.getString("tag_files_required"), requiredTagFiles); - + return requiredTagFiles; } - - private static List parseAcceptableVersions(final JsonNode node){ + + private static List parseAcceptableVersions(final JsonNode node) { final JsonNode acceptableVersionsNodes = node.get("Accept-BagIt-Version"); final List acceptableVersions = new ArrayList<>(); - - for(final JsonNode acceptableVersionsNode : acceptableVersionsNodes){ + + for (final JsonNode acceptableVersionsNode : acceptableVersionsNodes) { acceptableVersions.add(acceptableVersionsNode.asText()); } logger.debug(messages.getString("acceptable_bagit_versions"), acceptableVersions); - + return acceptableVersions; } } diff --git a/src/main/resources/MessageBundle.properties b/src/main/resources/MessageBundle.properties index 4973bd2e8..e8e1a3701 100644 --- a/src/main/resources/MessageBundle.properties +++ b/src/main/resources/MessageBundle.properties @@ -4,10 +4,13 @@ fetch_allowed=Are fetch files allowed? [{}] serialization_allowed=Serialization is: [{}] parsing_bagit_profile_info_section=Parsing the BagIt-Profile-Info section +parsing_mandatory_tags_of_bagit_profile_info_section=Parsing mandatory tags of the BagIt-Profile-Info section +parsing_optional_tags_of_bagit_profile_info_section=Parsing optional tags of the BagIt-Profile-Info section identifier=Identifier is [{}] source_organization=Source-Organization is [{}] contact_name=Contact-Name is [{}] contact_email=Contact-Email is [{}] +contact_phone=Contact-Phone is [{}] external_description=External-Description is [{}] version=Version is [{}] parsing_bag_info=Parsing the Bag-Info section diff --git a/src/main/resources/MessageBundle_ar.properties b/src/main/resources/MessageBundle_ar.properties index 34868ae7f..81353903e 100644 --- a/src/main/resources/MessageBundle_ar.properties +++ b/src/main/resources/MessageBundle_ar.properties @@ -5,10 +5,13 @@ fetch_allowed=Are fetch files allowed? [{}] serialization_allowed=Serialization is\: [{}] parsing_bagit_profile_info_section=Parsing the BagIt-Profile-Info section +parsing_mandatory_tags_of_bagit_profile_info_section=Parsing mandatory tags of the BagIt-Profile-Info section +parsing_optional_tags_of_bagit_profile_info_section=Parsing optional tags of the BagIt-Profile-Info section identifier=Identifier is [{}] source_organization=Source-Organization is [{}] contact_name=Contact-Name is [{}] contact_email=Contact-Email is [{}] +contact_phone=Contact-Phone is [{}] external_description=External-Description is [{}] version=Version is [{}] parsing_bag_info=Parsing the Bag-Info section diff --git a/src/main/resources/MessageBundle_de_DE.properties b/src/main/resources/MessageBundle_de_DE.properties index e7488a22d..7386be7f6 100644 --- a/src/main/resources/MessageBundle_de_DE.properties +++ b/src/main/resources/MessageBundle_de_DE.properties @@ -4,10 +4,13 @@ fetch_allowed=Sind Fetch Dateien erlaubt? [{}] serialization_allowed=Serialisierung ist: [{}] parsing_bagit_profile_info_section=Lese Abschnitt BagIt-Profile-Info +parsing_mandatory_tags_of_bagit_profile_info_section=Parse die ben\u00f6tigten Tags im Abschnitt BagIt-Profile-Info +parsing_optional_tags_of_bagit_profile_info_section=Parse die optionalen Tags im Abschnitt BagIt-Profile-Info identifier=Identifier hat den Wert [{}] source_organization=Source-Organization hat den Wert [{}] contact_name=Contact-Name hat den Wert [{}] contact_email=Contact-Email hat den Wert [{}] +contact_phone=Contact-Phone hat den Wert [{}] external_description=External-Description hat den Wert [{}] version=Version hat den Wert [{}] parsing_bag_info=Lese Abschnitt Bag-Info diff --git a/src/main/resources/MessageBundle_es_ES.properties b/src/main/resources/MessageBundle_es_ES.properties index c63efd1d3..38af9cee7 100644 --- a/src/main/resources/MessageBundle_es_ES.properties +++ b/src/main/resources/MessageBundle_es_ES.properties @@ -5,10 +5,13 @@ fetch_allowed=\u00bfSe permiten archivos de recuperaci\u00f3n? [{}] serialization_allowed=Serializaci\u00f3n es\: [{}] parsing_bagit_profile_info_section=An\u00e1lisis de la secci\u00f3n de informaci\u00f3n de perfil BagIt +parsing_mandatory_tags_of_bagit_profile_info_section=An\u00e1lisis de las etiquetas obligatorias de la secci\u00f3n de informaci\u00f3n de perfil BagIt +parsing_optional_tags_of_bagit_profile_info_section=An\u00e1lisis de las etiquetas opcionales de la secci\u00f3n de informaci\u00f3n de perfil BagIt identifier=Identificador es [{}] source_organization=Organizaci\u00f3n de la fuente es [{}] contact_name=Nombre del contacto es [{}] contact_email=Email del contacto es [{}] +contact_phone=Tel\u00e9fono de contacto es [{}] external_description=Descripci\u00f3n externa es [{}] version=La versi\u00f3n es [{}] parsing_bag_info=An\u00e1lisis de la secci\u00f3n de la bag-info diff --git a/src/main/resources/MessageBundle_zh.properties b/src/main/resources/MessageBundle_zh.properties index 34868ae7f..81353903e 100644 --- a/src/main/resources/MessageBundle_zh.properties +++ b/src/main/resources/MessageBundle_zh.properties @@ -5,10 +5,13 @@ fetch_allowed=Are fetch files allowed? [{}] serialization_allowed=Serialization is\: [{}] parsing_bagit_profile_info_section=Parsing the BagIt-Profile-Info section +parsing_mandatory_tags_of_bagit_profile_info_section=Parsing mandatory tags of the BagIt-Profile-Info section +parsing_optional_tags_of_bagit_profile_info_section=Parsing optional tags of the BagIt-Profile-Info section identifier=Identifier is [{}] source_organization=Source-Organization is [{}] contact_name=Contact-Name is [{}] contact_email=Contact-Email is [{}] +contact_phone=Contact-Phone is [{}] external_description=External-Description is [{}] version=Version is [{}] parsing_bag_info=Parsing the Bag-Info section diff --git a/src/test/java/gov/loc/repository/bagit/conformance/profile/AbstractBagitProfileTest.java b/src/test/java/gov/loc/repository/bagit/conformance/profile/AbstractBagitProfileTest.java index 3bba614eb..59d91c460 100644 --- a/src/test/java/gov/loc/repository/bagit/conformance/profile/AbstractBagitProfileTest.java +++ b/src/test/java/gov/loc/repository/bagit/conformance/profile/AbstractBagitProfileTest.java @@ -26,6 +26,7 @@ protected BagitProfile createExpectedProfile(){ expectedProfile.setBagitProfileIdentifier("http://canadiana.org/standards/bagit/tdr_ingest.json"); expectedProfile.setContactEmail("tdr@canadiana.com"); expectedProfile.setContactName("William Wueppelmann"); + expectedProfile.setContactPhone("+1 613 907 7040"); expectedProfile.setExternalDescription("BagIt profile for ingesting content into the C.O. TDR loading dock."); expectedProfile.setSourceOrganization("Candiana.org"); expectedProfile.setVersion("1.2"); @@ -42,24 +43,42 @@ protected BagitProfile createExpectedProfile(){ return expectedProfile; } + protected BagitProfile createMinimalProfile(){ + BagitProfile expectedProfile = new BagitProfile(); + + expectedProfile.setBagitProfileIdentifier("http://canadiana.org/standards/bagit/tdr_ingest.json"); + expectedProfile.setExternalDescription("BagIt profile for ingesting content into the C.O. TDR loading dock."); + expectedProfile.setSourceOrganization("Candiana.org"); + expectedProfile.setVersion("1.2"); + + expectedProfile.setBagInfoRequirements(createBagInfo()); + expectedProfile.setManifestTypesRequired(Arrays.asList("md5")); + expectedProfile.setFetchFileAllowed(false); + expectedProfile.setSerialization(Serialization.forbidden); + expectedProfile.setAcceptableMIMESerializationTypes(Arrays.asList("application/zip")); + expectedProfile.setAcceptableBagitVersions(Arrays.asList("0.96")); + + return expectedProfile; + } + protected Map createBagInfo(){ Map info = new HashMap<>(); - info.put("Source-Organization", new BagInfoRequirement(true, Arrays.asList("Simon Fraser University", "York University"))); + info.put("Source-Organization", new BagInfoRequirement(true, Arrays.asList("Simon Fraser University", "York University"), false)); info.put("Organization-Address", new BagInfoRequirement(true, - Arrays.asList("8888 University Drive Burnaby, B.C. V5A 1S6 Canada", "4700 Keele Street Toronto, Ontario M3J 1P3 Canada"))); - info.put("Contact-Name", new BagInfoRequirement(true, Arrays.asList("Mark Jordan", "Nick Ruest"))); - info.put("Contact-Phone", new BagInfoRequirement(false, Arrays.asList())); - info.put("Contact-Email", new BagInfoRequirement(true, Arrays.asList())); - info.put("External-Description", new BagInfoRequirement(true, Arrays.asList())); - info.put("External-Identifier", new BagInfoRequirement(false, Arrays.asList())); - info.put("Bag-Size", new BagInfoRequirement(true, Arrays.asList())); - info.put("Bag-Group-Identifier", new BagInfoRequirement(false, Arrays.asList())); - info.put("Bag-Count", new BagInfoRequirement(true, Arrays.asList())); - info.put("Internal-Sender-Identifier", new BagInfoRequirement(false, Arrays.asList())); - info.put("Internal-Sender-Description", new BagInfoRequirement(false, Arrays.asList())); - info.put("Bagging-Date", new BagInfoRequirement(true, Arrays.asList())); - info.put("Payload-Oxum", new BagInfoRequirement(true, Arrays.asList())); + Arrays.asList("8888 University Drive Burnaby, B.C. V5A 1S6 Canada", "4700 Keele Street Toronto, Ontario M3J 1P3 Canada"), false)); + info.put("Contact-Name", new BagInfoRequirement(true, Arrays.asList("Mark Jordan", "Nick Ruest"), false)); + info.put("Contact-Phone", new BagInfoRequirement(false, Arrays.asList(), false)); + info.put("Contact-Email", new BagInfoRequirement(true, Arrays.asList(), false)); + info.put("External-Description", new BagInfoRequirement(true, Arrays.asList(), false)); + info.put("External-Identifier", new BagInfoRequirement(false, Arrays.asList(), false)); + info.put("Bag-Size", new BagInfoRequirement(true, Arrays.asList(), false)); + info.put("Bag-Group-Identifier", new BagInfoRequirement(false, Arrays.asList(), false)); + info.put("Bag-Count", new BagInfoRequirement(true, Arrays.asList(), false)); + info.put("Internal-Sender-Identifier", new BagInfoRequirement(false, Arrays.asList(), false)); + info.put("Internal-Sender-Description", new BagInfoRequirement(false, Arrays.asList(), false)); + info.put("Bagging-Date", new BagInfoRequirement(true, Arrays.asList(), false)); + info.put("Payload-Oxum", new BagInfoRequirement(true, Arrays.asList(), false)); return info; } diff --git a/src/test/java/gov/loc/repository/bagit/conformance/profile/BagitProfileDeserializerTest.java b/src/test/java/gov/loc/repository/bagit/conformance/profile/BagitProfileDeserializerTest.java index 1073a2f68..30a6b3031 100644 --- a/src/test/java/gov/loc/repository/bagit/conformance/profile/BagitProfileDeserializerTest.java +++ b/src/test/java/gov/loc/repository/bagit/conformance/profile/BagitProfileDeserializerTest.java @@ -20,6 +20,7 @@ public void testDeserialize() throws Exception{ Assertions.assertEquals(expectedProfile.getBagitProfileIdentifier(), profile.getBagitProfileIdentifier()); Assertions.assertEquals(expectedProfile.getContactEmail(), profile.getContactEmail()); Assertions.assertEquals(expectedProfile.getContactName(), profile.getContactName()); + Assertions.assertEquals(expectedProfile.getContactPhone(), profile.getContactPhone()); Assertions.assertEquals(expectedProfile.getExternalDescription(), profile.getExternalDescription()); Assertions.assertEquals(expectedProfile.getManifestTypesRequired(), profile.getManifestTypesRequired()); Assertions.assertEquals(expectedProfile.getSerialization(), profile.getSerialization()); @@ -30,5 +31,28 @@ public void testDeserialize() throws Exception{ Assertions.assertEquals(expectedProfile.hashCode(), profile.hashCode()); } + @Test + public void testDeserializeWithoutOptionalTags() throws Exception{ + BagitProfile minimalProfile = createMinimalProfile(); + + BagitProfile profile = mapper.readValue(new File("src/test/resources/bagitProfiles/exampleProfileOnlyRequiredFields.json"), BagitProfile.class); + Assertions.assertEquals(minimalProfile, profile); + Assertions.assertEquals(minimalProfile.getAcceptableBagitVersions(), profile.getAcceptableBagitVersions()); + Assertions.assertEquals(minimalProfile.getAcceptableMIMESerializationTypes(), profile.getAcceptableMIMESerializationTypes()); + Assertions.assertEquals(minimalProfile.getBagInfoRequirements(), profile.getBagInfoRequirements()); + Assertions.assertEquals(minimalProfile.getBagitProfileIdentifier(), profile.getBagitProfileIdentifier()); + Assertions.assertEquals(minimalProfile.getContactEmail(), profile.getContactEmail()); + Assertions.assertEquals(minimalProfile.getContactName(), profile.getContactName()); + Assertions.assertEquals(minimalProfile.getContactPhone(), profile.getContactPhone()); + Assertions.assertEquals(minimalProfile.getExternalDescription(), profile.getExternalDescription()); + Assertions.assertEquals(minimalProfile.getManifestTypesRequired(), profile.getManifestTypesRequired()); + Assertions.assertEquals(minimalProfile.getSerialization(), profile.getSerialization()); + Assertions.assertEquals(minimalProfile.getSourceOrganization(), profile.getSourceOrganization()); + Assertions.assertEquals(minimalProfile.getTagFilesRequired(), profile.getTagFilesRequired()); + Assertions.assertEquals(minimalProfile.getTagManifestTypesRequired(), profile.getTagManifestTypesRequired()); + Assertions.assertEquals(minimalProfile.getVersion(), profile.getVersion()); + Assertions.assertEquals(minimalProfile.hashCode(), profile.hashCode()); + } + } diff --git a/src/test/java/gov/loc/repository/bagit/conformance/profile/BagitProfileTest.java b/src/test/java/gov/loc/repository/bagit/conformance/profile/BagitProfileTest.java index f9f844ce0..958da1fe3 100644 --- a/src/test/java/gov/loc/repository/bagit/conformance/profile/BagitProfileTest.java +++ b/src/test/java/gov/loc/repository/bagit/conformance/profile/BagitProfileTest.java @@ -16,6 +16,7 @@ public void testToString() throws Exception{ + "externalDescription=BagIt profile for ingesting content into the C.O. TDR loading dock., " + "contactName=William Wueppelmann, " + "contactEmail=tdr@canadiana.com, " + + "contactPhone=+1 613 907 7040, " + "version=1.2, " + "bagInfoRequirements={" + "Payload-Oxum=[required=true, acceptableValues=[], repeatable=false], " @@ -71,6 +72,10 @@ public void testEquals(){ differentContactEmail.setContactEmail("foo"); Assertions.assertFalse(profile.equals(differentContactEmail)); + BagitProfile differentContactPhone = createExpectedProfile(); + differentContactPhone.setContactPhone("foo"); + Assertions.assertFalse(profile.equals(differentContactPhone)); + BagitProfile differentVersion = createExpectedProfile(); differentVersion.setVersion("foo"); Assertions.assertFalse(profile.equals(differentVersion)); diff --git a/src/test/resources/bagitProfiles/exampleProfile.json b/src/test/resources/bagitProfiles/exampleProfile.json index a86d1a74e..6a7db5135 100644 --- a/src/test/resources/bagitProfiles/exampleProfile.json +++ b/src/test/resources/bagitProfiles/exampleProfile.json @@ -1,85 +1,99 @@ { - "BagIt-Profile-Info":{ - "BagIt-Profile-Identifier":"http://canadiana.org/standards/bagit/tdr_ingest.json", - "Source-Organization":"Candiana.org", - "Contact-Name":"William Wueppelmann", - "Contact-Email":"tdr@canadiana.com", - "External-Description":"BagIt profile for ingesting content into the C.O. TDR loading dock.", - "Version":"1.2" - }, - "Bag-Info":{ - "Source-Organization":{ - "required":true, - "values":[ - "Simon Fraser University", - "York University" - ] - }, - "Organization-Address":{ - "required":true, - "values":[ - "8888 University Drive Burnaby, B.C. V5A 1S6 Canada", - "4700 Keele Street Toronto, Ontario M3J 1P3 Canada" - ] - }, - "Contact-Name":{ - "required":true, - "values":[ - "Mark Jordan", - "Nick Ruest" - ] - }, - "Contact-Phone":{ - "required":false - }, - "Contact-Email":{ - "required":true - }, - "External-Description":{ - "required":true - }, - "External-Identifier":{ - "required":false - }, - "Bag-Size":{ - "required":true - }, - "Bag-Group-Identifier":{ - "required":false - }, - "Bag-Count":{ - "required":true - }, - "Internal-Sender-Identifier":{ - "required":false - }, - "Internal-Sender-Description":{ - "required":false - }, - "Bagging-Date":{ - "required":true, - "repeatable": false - }, - "Payload-Oxum":{ - "required":true - } - }, - "Manifests-Required":[ - "md5" - ], - "Allow-Fetch.txt":false, - "Serialization":"forbidden", - "Accept-Serialization":[ - "application/zip" - ], - "Tag-Manifests-Required":[ - "md5" - ], - "Tag-Files-Required":[ - "DPN/dpnFirstNode.txt", - "DPN/dpnRegistry" - ], - "Accept-BagIt-Version":[ - "0.96" - ] + "BagIt-Profile-Info": { + "BagIt-Profile-Identifier": "http://canadiana.org/standards/bagit/tdr_ingest.json", + "Source-Organization": "Candiana.org", + "Contact-Name": "William Wueppelmann", + "Contact-Email": "tdr@canadiana.com", + "Contact-Phone": "+1 613 907 7040", + "External-Description": "BagIt profile for ingesting content into the C.O. TDR loading dock.", + "Version": "1.2" + }, + "Bag-Info": { + "Source-Organization": { + "required": true, + "values": [ + "Simon Fraser University", + "York University" + ], + "repeatable": false + }, + "Organization-Address": { + "required": true, + "values": [ + "8888 University Drive Burnaby, B.C. V5A 1S6 Canada", + "4700 Keele Street Toronto, Ontario M3J 1P3 Canada" + ], + "repeatable": false + }, + "Contact-Name": { + "required": true, + "values": [ + "Mark Jordan", + "Nick Ruest" + ], + "repeatable": false + }, + "Contact-Phone": { + "required": false, + "repeatable": false + }, + "Contact-Email": { + "required": true, + "repeatable": false + }, + "External-Description": { + "required": true, + "repeatable": false + }, + "External-Identifier": { + "required": false, + "repeatable": false + }, + "Bag-Size": { + "required": true, + "repeatable": false + }, + "Bag-Group-Identifier": { + "required": false, + "repeatable": false + }, + "Bag-Count": { + "required": true, + "repeatable": false + }, + "Internal-Sender-Identifier": { + "required": false, + "repeatable": false + }, + "Internal-Sender-Description": { + "required": false, + "repeatable": false + }, + "Bagging-Date": { + "required": true, + "repeatable": false + }, + "Payload-Oxum": { + "required": true, + "repeatable": false + } + }, + "Manifests-Required": [ + "md5" + ], + "Allow-Fetch.txt": false, + "Serialization": "forbidden", + "Accept-Serialization": [ + "application/zip" + ], + "Tag-Manifests-Required": [ + "md5" + ], + "Tag-Files-Required": [ + "DPN/dpnFirstNode.txt", + "DPN/dpnRegistry" + ], + "Accept-BagIt-Version": [ + "0.96" + ] } \ No newline at end of file diff --git a/src/test/resources/bagitProfiles/exampleProfileOnlyRequiredFields.json b/src/test/resources/bagitProfiles/exampleProfileOnlyRequiredFields.json new file mode 100644 index 000000000..dead840fb --- /dev/null +++ b/src/test/resources/bagitProfiles/exampleProfileOnlyRequiredFields.json @@ -0,0 +1,84 @@ +{ + "BagIt-Profile-Info": { + "BagIt-Profile-Identifier": "http://canadiana.org/standards/bagit/tdr_ingest.json", + "Source-Organization": "Candiana.org", + "External-Description": "BagIt profile for ingesting content into the C.O. TDR loading dock.", + "Version": "1.2" + }, + "Bag-Info": { + "Source-Organization": { + "required": true, + "values": [ + "Simon Fraser University", + "York University" + ], + "repeatable": false + }, + "Organization-Address": { + "required": true, + "values": [ + "8888 University Drive Burnaby, B.C. V5A 1S6 Canada", + "4700 Keele Street Toronto, Ontario M3J 1P3 Canada" + ], + "repeatable": false + }, + "Contact-Name": { + "required": true, + "values": [ + "Mark Jordan", + "Nick Ruest" + ], + "repeatable": false + }, + "Contact-Phone": { + "repeatable": false + }, + "Contact-Email": { + "required": true, + "repeatable": false + }, + "External-Description": { + "required": true, + "repeatable": false + }, + "External-Identifier": { + "repeatable": false + }, + "Bag-Size": { + "required": true, + "repeatable": false + }, + "Bag-Group-Identifier": { + "repeatable": false + }, + "Bag-Count": { + "required": true, + "repeatable": false + }, + "Internal-Sender-Identifier": { + "repeatable": false + }, + "Internal-Sender-Description": { + "repeatable": false + }, + "Bagging-Date": { + "required": true, + "repeatable": false + }, + "Payload-Oxum": { + "required": true, + "repeatable": false + } + }, + "Manifests-Required": [ + "md5" + ], + "Allow-Fetch.txt": false, + "Serialization": "forbidden", + "Accept-Serialization": [ + "application/zip" + ], + "Accept-BagIt-Version": [ + "0.96" + ] +} \ No newline at end of file