From 68d8d4aa490f1dc7c015f56dbada38f072ef1e46 Mon Sep 17 00:00:00 2001 From: aditya-gupta36 Date: Wed, 15 Jul 2026 17:22:58 +0530 Subject: [PATCH] ATLAS-4667: Cannot create subclassification using subTypes field --- .../java/org/apache/atlas/AtlasErrorCode.java | 1 + .../store/graph/AtlasTypeDefGraphStore.java | 14 +++++++++++++- repository/src/test/resources/tag-prop-2.zip | Bin 18133 -> 17287 bytes 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java index a5aa58a1ba4..43eb1a1b412 100644 --- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java +++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java @@ -184,6 +184,7 @@ public enum AtlasErrorCode { BLANK_VALUE_ATTRIBUTE(400, "ATLAS-400-00-105", "Value Attribute can't be empty!"), INVALID_RELATIONSHIP_LABEL(400, "ATLAS-400-00-106", "Invalid relationship label {0}. The referenced entity type {1} could not be resolved from the type registry."), NON_INDEXABLE_BM_DELETE_NOT_ALLOWED(400, "ATLAS-400-00-107", "Deletion not allowed for non-indexable Business Metadata ''{0}'' without force=true. Non-indexable attributes cannot be validated efficiently for references; use force=true to skip validation and delete (warning: orphaned references may remain)."), + CLASSIFICATIONDEF_SUBTYPES_NOT_ALLOWED(400, "ATLAS-400-00-107", "ClassificationDef {0}: subTypes is a derived field and cannot be specified during create/update. To establish a parent-child relationship, set superTypes on the child classification instead."), UNAUTHORIZED_ACCESS(403, "ATLAS-403-00-001", "{0} is not authorized to perform {1}"), diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStore.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStore.java index 0913466c909..225dcb34fc5 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStore.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStore.java @@ -423,6 +423,7 @@ public AtlasTypesDef createTypesDef(AtlasTypesDef typesDef) throws AtlasBaseExce } AtlasTransientTypeRegistry ttr = lockTypeRegistryAndReleasePostCommit(); + validateClassificationDefsHaveNoSubTypes(typesDef); tryTypeCreation(typesDef, ttr); AtlasTypesDef ret = addToGraphStore(typesDef, ttr); @@ -460,7 +461,7 @@ public AtlasTypesDef updateTypesDef(AtlasTypesDef typesDef) throws AtlasBaseExce } AtlasTransientTypeRegistry ttr = lockTypeRegistryAndReleasePostCommit(); - + validateClassificationDefsHaveNoSubTypes(typesDef); // Translate any NOT FOUND errors to BAD REQUEST try { ttr.updateTypes(typesDef); @@ -493,6 +494,17 @@ public AtlasTypesDef updateTypesDef(AtlasTypesDef typesDef) throws AtlasBaseExce return ret; } + private void validateClassificationDefsHaveNoSubTypes(AtlasTypesDef typesDef) throws AtlasBaseException { + if (CollectionUtils.isNotEmpty(typesDef.getClassificationDefs())) { + for (AtlasClassificationDef classificationDef : typesDef.getClassificationDefs()) { + if (CollectionUtils.isNotEmpty(classificationDef.getSubTypes())) { + LOG.info("ClassificationDef {}: subTypes is a derived field and cannot be specified during create/update. To establish a parent-child relationship, set superTypes on the child instead.", classificationDef.getName()); + throw new AtlasBaseException(AtlasErrorCode.CLASSIFICATIONDEF_SUBTYPES_NOT_ALLOWED, classificationDef.getName()); + } + } + } + } + @Override @GraphTransaction public AtlasTypesDef createUpdateTypesDef(AtlasTypesDef typesDef) throws AtlasBaseException { diff --git a/repository/src/test/resources/tag-prop-2.zip b/repository/src/test/resources/tag-prop-2.zip index f9657706a48c1e9f22826356d074f84468eed279..580ca8dc6be4b845a3361ffc5cf55b6036ad2b92 100644 GIT binary patch delta 3377 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 delta 4242 zcma)|`_jUCi{|{j?4~I2)Ss6Q769VP{fE;EMOG>!@2FeUh z9*$*YWWa+`9cImi)tXh%4U{9$eJeHP<37PK5CHJwTB%9jsHQjHamaE_!c0jp>ztwn z8`OjduFmOyCwPpT*=;%7O3l;o4U`nP;7YgddfPw9GiSu`tthL0*+4n+iz++pE^{|g zb*C#jnS1pIbJnG`l`>paYXA3k7TZb;fR^XH?gDWVVXDxaE6M{>8`Sidl3iJ$_Zq|fp`~RXBXFhK=*ikeO3CtEyd9Hse54d8{BkR&f46{(X>f z3MN`JTgZ&x{8rLmg7(d(Z_B&nAf*?APAFwuN`BF6liZ#Ez_o8r%G2R(6Yk&q(zz`^ z5YFBmR&@?cc;++jEI{?F9oC!WDfJMd%bCCa^oaC5{=$hqBcCFK(rCS|Z?3++5?nNn z1eL|bZ(@?j@YNtCX8rEZn8Q(`H zUezOZ7qto4ok_PW#5LbhXy8U6j!7AUql$Hegw6J8Ihvclw~euvfR^fPKdW>qdR8&r z*!3KVhbG|HWh-bZG*T3@3!*5LzqqHr+l2AaqY$!v>!m{wOX- z(3rKu3ZIXf;`Ot{4(bUsx8LY)!p_=d51363k@TOxoH}xQOf^(o<)RWJfg1;onlq^w z}{+O17ci%T$#u~7PKFiz_atrqZ|foKU>s8 z8LHRATYdC*n}`L|gkwt2_gq;Bn=hxr3`ymrOshXsYDKGgnVzMTia7@H6cGW;#)B1z|8(As(Hq5XS9IBx?F8z=igW zDEIMObin136DN_Rr}OGq`od+B>r@H-4TXbi+~QdfY$wP_`lGN{4Ua>FSjw)G$}bzJ z9a(zreL79!ikE6GqBXSpQ;OZ1LsT0Wda16_zYh-$D?c~d`m1K3_vkTigZVLYvw)n; zcNxN=`D~Am2M}9MhYKHa&x<>jAlWQ$oD#UhOyqv+5sp9AeFG9R7qAg$tVzjtL?6N& zwH{ks?3zA0z9@0*+nERAvsAQ*rA@vXzKTAsn(`jeQQn|;Ikkhav-6H~u9gp~7|BzR zw)K?Vmi#`4Eg)pHTkJNXpNbnBfB25@=npAzvAIv-<#{l4-ReeChY#(6NR_~)BnK~<(kQOT`Eq(kXs}{zWGHZ?c5-S! zNBT2FRa{OabH7H7<;&>r8YXt2?%&+7`3D2d`kc`T}?V;(#B(doGT^FEH zltO$&zRk?GL0zmZA6EDWoHljD`GBqF!Pothp*MFTaj&excFIuH7&!Y+RZx!^tqc9A z;^BhFy#nGKwj)Tf7Ky_jUEgGm+DKm!;|lMzh7R7N(oXLj-0w{E*Dvu-W@K-dd<%lt z?LWkaf%A}m%;73miF{;3zRiQyh5=U4enGN`!RD7}Z8l&9eJB5J zu=yogn-o|%uEJ#6FPm%V=itB!`bw5CTy1D6L~OA4Yhwf}M{y_FQfl){y*5>_f^uca z1u{EGn>md?hYVKGyd1E8xOlz9)S3p{;v$eByZx(uDyy_!FkF6 z;G{u5ynENCK7gNZCstUEI{Ayy>aHwZRqM{XGVa>TiWNlGAunhvpw{0Nc4p)U0AA*= Mg!yl)!P49R0Lv`qT>t<8