From ad72e3c14ab223abbb54bec2b944d4aa57dfbae6 Mon Sep 17 00:00:00 2001 From: Pinal Shah <60691793+pinal-shah@users.noreply.github.com> Date: Tue, 28 Jan 2025 08:32:06 +0700 Subject: [PATCH] ATLAS-4863: NPE while deleting BusinessMetadata (#276) --- .../v2/AtlasBusinessMetadataDefStoreV2.java | 2 +- .../AtlasBusinessMetadataDefStoreV2Test.java | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasBusinessMetadataDefStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasBusinessMetadataDefStoreV2.java index ece1a231e2..2aa9652bb9 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasBusinessMetadataDefStoreV2.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasBusinessMetadataDefStoreV2.java @@ -404,7 +404,7 @@ private void checkBusinessMetadataRef(String typeName) throws AtlasBaseException String vertexPropertyName = AtlasStructType.AtlasAttribute.generateVertexPropertyName(businessMetadataDef, attributeDef, qualifiedName); Set applicableTypes = AtlasJson.fromJson(attributeDef.getOption(AtlasBusinessMetadataDef.ATTR_OPTION_APPLICABLE_ENTITY_TYPES), Set.class); - if (isBusinessAttributePresent(vertexPropertyName, applicableTypes)) { + if (CollectionUtils.isNotEmpty(applicableTypes) && isBusinessAttributePresent(vertexPropertyName, applicableTypes)) { throw new AtlasBaseException(AtlasErrorCode.TYPE_HAS_REFERENCES, typeName); } } diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v2/AtlasBusinessMetadataDefStoreV2Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v2/AtlasBusinessMetadataDefStoreV2Test.java index eaffac1b1c..51ac56757b 100644 --- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v2/AtlasBusinessMetadataDefStoreV2Test.java +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v2/AtlasBusinessMetadataDefStoreV2Test.java @@ -262,6 +262,23 @@ public void deleteBusinessMetadataDefs() throws AtlasBaseException { } } + @Test + public void deleteBusinessMetadataDefWithNoAssignedTypes() throws AtlasBaseException { + createBusinessMetadataTypesWithoutAssignedTypes(businessMetadataName); + for (AtlasBusinessMetadataDef atlasBusinessMetaDataDef : typesDefs.getBusinessMetadataDefs()) { + if (atlasBusinessMetaDataDef.getName().equals(businessMetadataName)) { + typesDefs = new AtlasTypesDef(Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), + Collections.emptyList()); + typesDefs.setBusinessMetadataDefs(Arrays.asList(atlasBusinessMetaDataDef)); + typeDefStore.deleteTypesDef(typesDefs); + } + } + + for (AtlasBusinessMetadataDef businessMetadataDef : typeRegistry.getAllBusinessMetadataDefs()) { + Assert.assertNotEquals(businessMetadataDef.getName(), businessMetadataName); + } + } + @Test public void updateBusinessMetadataDefs() throws AtlasBaseException { createBusinessMetadataTypes(businessMetadataName); @@ -413,6 +430,23 @@ private AtlasBusinessMetadataDef createBusinessMetadataDef(String businessMetada return businessMetadataDef1; } + private void createBusinessMetadataTypesWithoutAssignedTypes(String businessMetadataName) throws AtlasBaseException { + List businessMetadataDefs = new ArrayList(typesDefs.getBusinessMetadataDefs()); + businessMetadataDefs.add(createBusinessMetadataDefWithoutAssignedTypes(businessMetadataName)); + typesDefs.setBusinessMetadataDefs(businessMetadataDefs); + AtlasTypesDef createdTypesDef = typeDefStore.createTypesDef(typesDefs); + + Assert.assertEquals(createdTypesDef.getBusinessMetadataDefs(), businessMetadataDefs, "Data integrity issue while persisting"); + } + + private AtlasBusinessMetadataDef createBusinessMetadataDefWithoutAssignedTypes(String businessMetadataName) { + AtlasBusinessMetadataDef businessMetadataDef1 = new AtlasBusinessMetadataDef(businessMetadataName, "test_no_attributes", null); + addBusinessAttribute(businessMetadataDef1, "test_businessMetadata_attribute1", Collections.emptySet(), "int", + AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE); + TestUtilsV2.populateSystemAttributes(businessMetadataDef1); + return businessMetadataDef1; + } + private AtlasBusinessMetadataDef createBusinessMetadataDef2(String businessMetadataName) { AtlasBusinessMetadataDef businessMetadataDef1 = new AtlasBusinessMetadataDef(businessMetadataName, "test_description", null); addBusinessAttribute(businessMetadataDef1, "test_businessMetadata_attribute1", Collections.emptySet(), "int",