diff --git a/metadata-io/src/main/java/com/linkedin/metadata/structuredproperties/validation/PropertyDefinitionValidator.java b/metadata-io/src/main/java/com/linkedin/metadata/structuredproperties/validation/PropertyDefinitionValidator.java index ae5472af62..6e047c12da 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/structuredproperties/validation/PropertyDefinitionValidator.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/structuredproperties/validation/PropertyDefinitionValidator.java @@ -89,6 +89,9 @@ public class PropertyDefinitionValidator extends AspectPayloadValidator { item.getAspect(StructuredPropertyDefinition.class); versionFormatCheck(item, newDefinition.getVersion()).ifPresent(exceptions::addException); + urnIdCheck(item).ifPresent(exceptions::addException); + qualifiedNameCheck(item, newDefinition.getQualifiedName()) + .ifPresent(exceptions::addException); if (item.getPreviousSystemAspect() != null) { @@ -192,4 +195,20 @@ public class PropertyDefinitionValidator extends AspectPayloadValidator { } return Optional.empty(); } + + private static Optional urnIdCheck(MCPItem item) { + if (item.getUrn().getId().contains(" ")) { + return Optional.of(AspectValidationException.forItem(item, "Urn ID cannot have spaces")); + } + return Optional.empty(); + } + + private static Optional qualifiedNameCheck( + MCPItem item, @Nonnull String qualifiedName) { + if (qualifiedName.contains(" ")) { + return Optional.of( + AspectValidationException.forItem(item, "Qualified names cannot have spaces")); + } + return Optional.empty(); + } } diff --git a/metadata-io/src/test/java/com/linkedin/metadata/structuredproperties/validators/PropertyDefinitionValidatorTest.java b/metadata-io/src/test/java/com/linkedin/metadata/structuredproperties/validators/PropertyDefinitionValidatorTest.java index 2af731a511..18949f0566 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/structuredproperties/validators/PropertyDefinitionValidatorTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/structuredproperties/validators/PropertyDefinitionValidatorTest.java @@ -397,4 +397,40 @@ public class PropertyDefinitionValidatorTest { .count(), 0); } + + @Test + public void testUrnIdWithSpace() + throws URISyntaxException, CloneNotSupportedException, AspectValidationException { + Urn propertyUrn = UrnUtils.getUrn("urn:li:structuredProperty:test me out.foo.bar"); + StructuredPropertyDefinition newProperty = new StructuredPropertyDefinition(); + newProperty.setEntityTypes(new UrnArray(Urn.createFromString("urn:li:logicalEntity:dataset"))); + newProperty.setDisplayName("oldProp"); + newProperty.setQualifiedName("foo.bar"); + newProperty.setCardinality(PropertyCardinality.MULTIPLE); + newProperty.setValueType(Urn.createFromString("urn:li:logicalType:STRING")); + assertEquals( + PropertyDefinitionValidator.validateDefinitionUpserts( + TestMCP.ofOneMCP(propertyUrn, null, newProperty, entityRegistry), + mockRetrieverContext) + .count(), + 1); + } + + @Test + public void testQualifiedNameWithSpace() + throws URISyntaxException, CloneNotSupportedException, AspectValidationException { + Urn propertyUrn = UrnUtils.getUrn("urn:li:structuredProperty:foo.bar"); + StructuredPropertyDefinition newProperty = new StructuredPropertyDefinition(); + newProperty.setEntityTypes(new UrnArray(Urn.createFromString("urn:li:logicalEntity:dataset"))); + newProperty.setDisplayName("oldProp"); + newProperty.setQualifiedName("foo.bar with spaces"); + newProperty.setCardinality(PropertyCardinality.MULTIPLE); + newProperty.setValueType(Urn.createFromString("urn:li:logicalType:STRING")); + assertEquals( + PropertyDefinitionValidator.validateDefinitionUpserts( + TestMCP.ofOneMCP(propertyUrn, null, newProperty, entityRegistry), + mockRetrieverContext) + .count(), + 1); + } }