----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/61526/#review184373 -----------------------------------------------------------
intg/src/main/java/org/apache/atlas/AtlasErrorCode.java Lines 99 (patched) <https://reviews.apache.org/r/61526/#comment260522> I think we should treat classification's empty entity-type to mean 'apply whatever restrictons placed on super-types'. intg/src/main/java/org/apache/atlas/AtlasErrorCode.java Lines 116 (patched) <https://reviews.apache.org/r/61526/#comment260523> Consider replacing the message with the following: "Entity (guid=‘{0}‘,typename=‘{1}‘) cannot be classified as ‘{2}‘, because of the restrictions specified in the classification" intg/src/main/java/org/apache/atlas/model/typedef/AtlasClassificationDef.java Lines 86 (patched) <https://reviews.apache.org/r/61526/#comment260544> "superTypes,null" ==> "superTypes, null" intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java Lines 109 (patched) <https://reviews.apache.org/r/61526/#comment260546> "=new" ==> "= new" intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java Lines 114 (patched) <https://reviews.apache.org/r/61526/#comment260558> Here we should find intersection of entity-types specified in all super-types. Using union of entity-types restrictions in super-types will likely to result in this classification to allow more entity-types than one or more of its super-types. Also, move this to resolveReferencesPhase3(), as typeAndAllSubTypes won't be populated until resolveReferencesPhase2() is complete. void resolveReferencesPhase3(AtlasTypeRegistry typeRegistry) throws AtlasBaseException { ... Set<String> superTypeEntityTypes = null; for (String superType : this.allSuperTypes) { AtlasClassificationDef superTypeDef = typeRegistry.getClassificationDefByName(superType); Set<String> entityTypeNames = superTypeDef.getEntityTypes(); if (CollectionUtils.isEmpty(entityTypeNames)) { // no restrictions specified continue; } // classification is applicable for specified entity-types and their sub-entity-types Set<String> typesAndSubEntityTypes = getEntityTypesAndAllSubTypes(entityTypeNames); if (superTypeEntityTypes == null) { superTypeEntityTypes = new HashSet<String>(typesAndSubEntityTypes); } else { superTypeEntityTypes.retainAll(typesAndSubEntityTypes); } } if (superTypeEntityTypes != null) { // restrictions are specified in super-types if (CollectionUtils.isEmpty(superTypeEntityTypes)) { // restrictions in super-types are disjoint! TODO: need a new error code for this case throw new AtlasBaseException(AtlasErrorCode.CLASSIFICATIONDEF_ENTITYTYPES_NOT_PARENTS_SUBSET, classificationDef.getName(), classificationDef.getEntityTypes()); } if (CollectionUtils.isEmpty(classificationDef.getEntityTypes())) { // no restriction specified; use the restrictions from super-types this.entityTypes = superTypeEntityTypes; } else { this.entityTypes = getEntityTypesAndAllSubTypes(classificationDef.getEntityTypes()); if (!superTypeEntityTypes.containsAll(this.entityTypes)) { throw new AtlasBaseException(AtlasErrorCode.CLASSIFICATIONDEF_ENTITYTYPES_NOT_PARENTS_SUBSET, classificationDef.getName(), classificationDef.getEntityTypes()); } } } else { // no restrictions specified in super-types this.entityTypes = getEntityTypesAndAllSubTypes(classificationDef.getEntityTypes()); } } private Set<String> getEntityTypesAndAllSubTypes(Set<String> entityTypes, AtlasTypeRegistry typeRegistry) { Set<String> ret = new HashSet<>(); for (String typeName : entityTypes) { AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName); ret.addAll(entityType.getTypeAndAllSubTypes()); } return ret; } intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java Lines 393 (patched) <https://reviews.apache.org/r/61526/#comment260559> "typeRegistry,AtlasEntityType" ==> "typeRegistry, AtlasEntityType" intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java Lines 394 (patched) <https://reviews.apache.org/r/61526/#comment260560> With the changes suggested in resolveReferences(), this method implementation will be simpler: return CollectionUtils.isEmpty(this.entityTypes) || this.entityTypes.contains(entityType); intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java Lines 450 (patched) <https://reviews.apache.org/r/61526/#comment260561> No need to make this method public - please review my comment in AtlasClassificationType.canApplyToEntityType() intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java Lines 222 (patched) <https://reviews.apache.org/r/61526/#comment260562> "superTypes,ImmutableSet<String>" ==> "superTypes, ImmutableSet<String>" intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java Lines 223 (patched) <https://reviews.apache.org/r/61526/#comment260563> "superTypes,entityTypes,null" ==> "superTypes, entityTypes, null" repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java Lines 728 (patched) <https://reviews.apache.org/r/61526/#comment260564> Again, I don't see why it is necessary to retrieve the whole entity and its extended info here? Only piece of information needed here seems to be entityTypeName. Lets avoid unnecessary reads. repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java Lines 741 (patched) <https://reviews.apache.org/r/61526/#comment260565> "typeRegistry,entityType" ==> "typeRegistry, entityType" repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasTypeDefGraphStoreV1.java Lines 382 (patched) <https://reviews.apache.org/r/61526/#comment260566> Separate methods with a blank line. repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasTypeDefGraphStoreV1.java Lines 399 (patched) <https://reviews.apache.org/r/61526/#comment260567> Separate methods with a blank line. repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasTypeDefGraphStoreV1.java Lines 402 (patched) <https://reviews.apache.org/r/61526/#comment260568> Separate methods with a blank line. repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasTypeDefGraphStoreV1.java Lines 405 (patched) <https://reviews.apache.org/r/61526/#comment260569> Separate methods with a blank line. repository/src/test/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStoreTest.java Lines 387 (patched) <https://reviews.apache.org/r/61526/#comment260570> Separate methods with a blank line. repository/src/test/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStoreTest.java Lines 412 (patched) <https://reviews.apache.org/r/61526/#comment260571> Separate methods with a blank line. repository/src/test/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStoreTest.java Lines 473 (patched) <https://reviews.apache.org/r/61526/#comment260572> Separate methods with a blank line. repository/src/test/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStoreTest.java Line 391 (original), 524 (patched) <https://reviews.apache.org/r/61526/#comment260573> Separate methods with a blank line. repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java Line 944 (original), 944 (patched) <https://reviews.apache.org/r/61526/#comment260574> "+e.getMessage()" ==> "+ e.getMessage()" - Madhan Neethiraj On Sept. 1, 2017, 9:50 a.m., David Radley wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/61526/ > ----------------------------------------------------------- > > (Updated Sept. 1, 2017, 9:50 a.m.) > > > Review request for atlas, Graham Wallis, Madhan Neethiraj, and Sarath > Subramanian. > > > Repository: atlas > > > Description > ------- > > ATLAS-2029: Restrict entities, classifications can be applied to > > > Diffs > ----- > > intg/src/main/java/org/apache/atlas/AtlasErrorCode.java > 2503d8ef203cf4efbe15b440257b1da2252b6153 > > intg/src/main/java/org/apache/atlas/model/typedef/AtlasClassificationDef.java > eeaf71413a56c08db8170fd3323b8e8245ae44fe > intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java > cc3e45ed2f059ad0c5731dc1da7e592d139c3e7a > intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java > 28215fd2aa33ec8011f6900b68c672b685053e7a > intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java > ab063e23e355f74668af389b97f7da03b2a8f90f > intg/src/test/java/org/apache/atlas/TestUtilsV2.java > fc65af057255b4c17378080ee4fb7cbfc780c3fe > intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java > aaf4a6ac0a978e5eb6de41279cae1b1c82373374 > > repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasClassificationDefStoreV1.java > e3aa4e0b2317bec47426a914f6feae68b17851dd > > repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java > 1c168b4cff0d105c7a0d4a9fbdb50871388c917e > > repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java > 227f7cd12a9b23c3bbc1cfdc40d06616ea775ca4 > > repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasTypeDefGraphStoreV1.java > f639ea56e6188837e069a5fcba953d9d196af0e5 > > repository/src/test/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStoreTest.java > 8638a7f17e8a17d3a6e0bfb94879b5c5406be1a3 > > repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java > 62fad5b02a7229d9bc3083690980eb063756bc29 > > > Diff: https://reviews.apache.org/r/61526/diff/3/ > > > Testing > ------- > > Testing > performed unit tests > > Using postman > 1) create an entityDef aaa > 2) create a classificationDef with an entitytype aaaa - checked that it is > in the response > 3) Create a entity instance of aaa > 4) add the classification to it > 5) Create an entity instance with a different type bbbb > 6) Attempt to add the classification to bbbb. this fails with an informative > message > 7) Attempt to update the ClassificationDef to remove the entity type - this > fails with an informative message > 8) Attempt to update the classificationdef to add bbbb. this update works. > 9) Attempt to add an entity type that does not exist to the > ClassificationDef. this should fail. > 10) Attempt to update an entity type that does not exist to the > ClassificationDef. this should fail. > > > Thanks, > > David Radley > >