Skip to content

Commit

Permalink
Merge pull request #8 from VolkerHartmann/issue606_MultipleRelatedDat…
Browse files Browse the repository at this point in the history
…aResourcesShouldBeAllowed

Allow multiple data resources as related identifier.
Closes #606
  • Loading branch information
VolkerHartmann authored Nov 20, 2024
2 parents eaeae8d + 7d829f1 commit f82fa36
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -683,9 +683,9 @@ public static Specification<DataResource> findBySchemaId(Specification<DataResou

public static final Specification<DataResource> findByMimetypes(List<String> mimeTypes) {
// Search for both mimetypes (xml & json)
ResourceType resourceType = null;
ResourceType resourceType;
final int JSON = 1; // bit 0
final int XML = 2; // bit 1
final int XML = 2; // bit 1
//
int searchFor = 0; // 1 - JSON, 2 - XML, 3 - both
if (mimeTypes != null) {
Expand Down Expand Up @@ -936,42 +936,38 @@ public static void validateRelatedResources4MetadataDocuments(DataResource dataR
if (dataResource != null) {
Set<RelatedIdentifier> relatedResources = dataResource.getRelatedIdentifiers();

// Check if related resource already exists (only one related resource of type isMetadataFor allowed)
// Check if related resource already exists (only one related resource of type hasMetadata is allowed)
for (RelatedIdentifier item : relatedResources) {
switch (item.getRelationType()) {
case IS_METADATA_FOR:
noOfRelatedData++;
break;
case HAS_METADATA:
noOfRelatedSchemas++;
break;
default:
if (item.getRelationType() == RelatedIdentifier.RELATION_TYPES.HAS_METADATA) {
noOfRelatedSchemas++;
}
if (item.getRelationType() == RelatedIdentifier.RELATION_TYPES.IS_METADATA_FOR) {
noOfRelatedData++;
}
}
}
checkNoOfRelatedIdentifiers(noOfRelatedData, noOfRelatedSchemas);
}

/** Validate related identifiers.
* There has to be exactly one schema (hasMetadata)
* and at *least* one related data resource.
* @param noOfRelatedData No of related data resources.
* @param noOfRelatedSchemas No of related schemas.
*/
private static void checkNoOfRelatedIdentifiers(int noOfRelatedData, int noOfRelatedSchemas) {
String message;
message = "Invalid related resources! Expected '1' related resource found '%d'. Expected '1' related schema found '%d'!";

if (noOfRelatedData != 1 || noOfRelatedSchemas != 1) {
if ((noOfRelatedSchemas != 1) || (noOfRelatedData == 0)) {
String errorMessage = "";
if (noOfRelatedData == 0) {
errorMessage = "Mandatory attribute relatedIdentifier of type 'isMetadataFor' was not found in record. \n";
}
if (noOfRelatedData > 1) {
errorMessage = "Mandatory attribute relatedIdentifier of type 'isMetadataFor' was provided more than once in record. \n";
}
if (noOfRelatedSchemas == 0) {
errorMessage = errorMessage + "Mandatory attribute relatedIdentifier of type 'hasMetadata' was not found in record. \n";
}
errorMessage = "Mandatory attribute relatedIdentifier of type 'hasMetadata' was not found in record. \n";
}
if (noOfRelatedSchemas > 1) {
errorMessage = errorMessage + "Mandatory attribute relatedIdentifier of type 'hasMetadata' was provided more than once in record. \n";
errorMessage = "Mandatory attribute relatedIdentifier of type 'hasMetadata' was provided more than once in record. \n";
}
if (noOfRelatedData == 0) {
errorMessage = errorMessage + "Mandatory attribute relatedIdentifier of type 'isMetadataFor' was not found in record. \n";
}
errorMessage = errorMessage + "Returning HTTP BAD_REQUEST.";
LOG.error(message);
LOG.error(errorMessage);
throw new BadArgumentException(errorMessage);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,28 +229,81 @@ public void testvalidateRelatedResources4MetadataDocuments() {
System.out.println("testvalidateRelatedResources4MetadataDocuments");
try {
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(null);
assertTrue(true);
assertTrue(false);
} catch (BadArgumentException bae) {
assertTrue("Error should contain 'isMetadataFor'", bae.getMessage().contains("isMetadataFor"));
assertTrue("Error should contain 'hasMetadata'", bae.getMessage().contains("hasMetadata"));
}
try {
DataResource hasNoRelatedIdentifier = DataResource.factoryNewDataResource();
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(hasNoRelatedIdentifier);
assertTrue(false);
} catch (BadArgumentException bae) {
assertTrue("Error should contain 'isMetadataFor'", bae.getMessage().contains("isMetadataFor"));
assertTrue("Error should contain 'hasMetadata'", bae.getMessage().contains("hasMetadata"));
}
try {
DataResource isMetadataFor = DataResource.factoryNewDataResource();
isMetadataFor.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_METADATA_FOR, "first", null, null));
isMetadataFor.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_METADATA_FOR, "second", null, null));
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(isMetadataFor);
DataResource hasNeitherSchemaNorDataResource = DataResource.factoryNewDataResource();
hasNeitherSchemaNorDataResource.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_CITED_BY, "citation", null, null));
hasNeitherSchemaNorDataResource.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_DOCUMENTED_BY, "documentation", null, null));
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(hasNeitherSchemaNorDataResource);
assertTrue(false);
} catch (BadArgumentException bae) {
assertTrue("Error should contain 'isMetadataFor'", bae.getMessage().contains("isMetadataFor"));
assertTrue("Error should contain 'hasMetadata'", bae.getMessage().contains("hasMetadata"));
}
try {
DataResource hasTwoDataResourcesButNoSchema = DataResource.factoryNewDataResource();
hasTwoDataResourcesButNoSchema.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_METADATA_FOR, "first data", null, null));
hasTwoDataResourcesButNoSchema.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_METADATA_FOR, "second data", null, null));
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(hasTwoDataResourcesButNoSchema);
assertTrue(false);
} catch (BadArgumentException bae) {
assertFalse("Multiple 'isMetadataFor' should be allowed!", bae.getMessage().contains("isMetadataFor"));
assertTrue("Error should contain 'hasMetadata'", bae.getMessage().contains("hasMetadata"));
}
try {
DataResource hasTwoSchemasAndNoDataResource = DataResource.factoryNewDataResource();
hasTwoSchemasAndNoDataResource.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.HAS_METADATA, "first schema", null, null));
hasTwoSchemasAndNoDataResource.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.HAS_METADATA, "second schema", null, null));
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(hasTwoSchemasAndNoDataResource);
assertTrue(false);
} catch (BadArgumentException bae) {
assertTrue("Error should contain 'hasMetadata'", bae.getMessage().contains("hasMetadata"));
assertTrue("Error should contain 'isMetadataFor'", bae.getMessage().contains("isMetadataFor"));
}
try {
DataResource hasMetadata = DataResource.factoryNewDataResource();
hasMetadata.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.HAS_METADATA, "first", null, null));
hasMetadata.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.HAS_METADATA, "second", null, null));
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(hasMetadata);
DataResource hasOneSchemaAndNoDataResource = DataResource.factoryNewDataResource();
hasOneSchemaAndNoDataResource.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.HAS_METADATA, "first schema", null, null));
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(hasOneSchemaAndNoDataResource);
assertTrue(false);
} catch (BadArgumentException bae) {
assertFalse("Error should not contain 'hasMetadata'", bae.getMessage().contains("hasMetadata"));
assertTrue("Error should contain 'isMetadataFor'", bae.getMessage().contains("isMetadataFor"));
}
try {
DataResource hasSchemaAndTwoDataResources = DataResource.factoryNewDataResource();
hasSchemaAndTwoDataResources.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.HAS_METADATA, "first schema", null, null));
hasSchemaAndTwoDataResources.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_METADATA_FOR, "first data", null, null));
hasSchemaAndTwoDataResources.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_METADATA_FOR, "second data", null, null));
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(hasSchemaAndTwoDataResources);
assertTrue(true);
} catch (BadArgumentException bae) {
assertFalse("Error should not contain 'hasMetadata'", bae.getMessage().contains("hasMetadata"));
assertFalse("Multiple 'isMetadataFor' should be allowed!", bae.getMessage().contains("isMetadataFor"));
assertTrue(false);
}
try {
DataResource hasTwoSchemasAndTwoDataResources = DataResource.factoryNewDataResource();
hasTwoSchemasAndTwoDataResources.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.HAS_METADATA, "first schema", null, null));
hasTwoSchemasAndTwoDataResources.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.HAS_METADATA, "second schema", null, null));
hasTwoSchemasAndTwoDataResources.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_METADATA_FOR, "first data", null, null));
hasTwoSchemasAndTwoDataResources.getRelatedIdentifiers().add(RelatedIdentifier.factoryRelatedIdentifier(RelatedIdentifier.RELATION_TYPES.IS_METADATA_FOR, "second data", null, null));
DataResourceRecordUtil.validateRelatedResources4MetadataDocuments(hasTwoSchemasAndTwoDataResources);
assertTrue(false);
} catch (BadArgumentException bae) {
assertTrue("Error should contain 'hasMetadata'", bae.getMessage().contains("hasMetadata"));
assertFalse("Multiple 'isMetadataFor' should be allowed!", bae.getMessage().contains("isMetadataFor"));
}
}

Expand Down

0 comments on commit f82fa36

Please sign in to comment.