You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2016/11/03 20:39:48 UTC

incubator-atlas git commit: ATLAS-1268: added methods to retrieve attributeDefs in a type and all its superTypes

Repository: incubator-atlas
Updated Branches:
  refs/heads/master 0c7468954 -> 6a24cad18


ATLAS-1268: added methods to retrieve attributeDefs in a type and all its superTypes

Signed-off-by: Madhan Neethiraj <ma...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/6a24cad1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/6a24cad1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/6a24cad1

Branch: refs/heads/master
Commit: 6a24cad180b071290211c2695c567e83c13e9f97
Parents: 0c74689
Author: Madhan Neethiraj <ma...@apache.org>
Authored: Thu Nov 3 00:33:52 2016 -0700
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Thu Nov 3 13:17:54 2016 -0700

----------------------------------------------------------------------
 .../atlas/type/AtlasClassificationType.java     |  60 +++++++----
 .../org/apache/atlas/type/AtlasEntityType.java  |  60 +++++++----
 .../atlas/type/TestAtlasTypeRegistry.java       | 105 ++++++++++++++++++-
 3 files changed, 179 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6a24cad1/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java b/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
index fa4ca20..d841977 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
@@ -22,12 +22,14 @@ import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.instance.AtlasClassification;
 import org.apache.atlas.model.typedef.AtlasClassificationDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
 import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -42,8 +44,9 @@ public class AtlasClassificationType extends AtlasStructType {
 
     private final AtlasClassificationDef classificationDef;
 
-    private List<AtlasClassificationType> superTypes    = Collections.emptyList();
-    private Set<String>                   allSuperTypes = Collections.emptySet();
+    private List<AtlasClassificationType>  superTypes       = Collections.emptyList();
+    private Set<String>                    allSuperTypes    = Collections.emptySet();
+    private Map<String, AtlasAttributeDef> allAttributeDefs = Collections.emptyMap();
 
     public AtlasClassificationType(AtlasClassificationDef classificationDef) {
         super(classificationDef, TypeCategory.CLASSIFICATION);
@@ -64,8 +67,11 @@ public class AtlasClassificationType extends AtlasStructType {
     public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
         super.resolveReferences(typeRegistry);
 
-        List<AtlasClassificationType> s    = new ArrayList<AtlasClassificationType>();
-        Set<String>                   allS = getAllSuperTypes(typeRegistry);
+        List<AtlasClassificationType>  s    = new ArrayList<>();
+        Set<String>                    allS = new HashSet<>();
+        Map<String, AtlasAttributeDef> allA = new HashMap<>();
+
+        getTypeHierarchyInfo(typeRegistry, allS, allA);
 
         for (String superTypeName : classificationDef.getSuperTypes()) {
             AtlasType superType = typeRegistry.getType(superTypeName);
@@ -78,8 +84,9 @@ public class AtlasClassificationType extends AtlasStructType {
             }
         }
 
-        this.superTypes    = Collections.unmodifiableList(s);
-        this.allSuperTypes = Collections.unmodifiableSet(allS);
+        this.superTypes       = Collections.unmodifiableList(s);
+        this.allSuperTypes    = Collections.unmodifiableSet(allS);
+        this.allAttributeDefs = Collections.unmodifiableMap(allA);
     }
 
     public Set<String> getSuperTypes() {
@@ -88,6 +95,8 @@ public class AtlasClassificationType extends AtlasStructType {
 
     public Set<String> getAllSuperTypes() { return allSuperTypes; }
 
+    public Map<String, AtlasAttributeDef> getAllAttributeDefs() { return allAttributeDefs; }
+
     public boolean isSuperTypeOf(AtlasClassificationType classificationType) {
         return classificationType != null ? classificationType.getAllSuperTypes().contains(this.getTypeName()) : false;
     }
@@ -185,40 +194,47 @@ public class AtlasClassificationType extends AtlasStructType {
         }
     }
 
-    private Set<String> getAllSuperTypes(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
-        Set<String>  superTypes = new HashSet<>();
-        List<String> subTypes   = new ArrayList<>();
-
-        collectAllSuperTypes(subTypes, superTypes, typeRegistry);
+    private void getTypeHierarchyInfo(AtlasTypeRegistry              typeRegistry,
+                                      Set<String>                    allSuperTypeNames,
+                                      Map<String, AtlasAttributeDef> allAttributeDefs) throws AtlasBaseException {
+        List<String> visitedTypes = new ArrayList<>();
 
-        return superTypes;
+        collectTypeHierarchyInfo(typeRegistry, allSuperTypeNames, allAttributeDefs, visitedTypes);
     }
 
     /*
      * This method should not assume that resolveReferences() has been called on all superTypes.
      * this.classificationDef is the only safe member to reference here
      */
-    private void collectAllSuperTypes(List<String> subTypes, Set<String> superTypes, AtlasTypeRegistry typeRegistry)
-        throws AtlasBaseException {
-        if (subTypes.contains(classificationDef.getName())) {
-            throw new AtlasBaseException(AtlasErrorCode.CIRCULAR_REFERENCE,
-                    classificationDef.getName(), subTypes.toString());
+    private void collectTypeHierarchyInfo(AtlasTypeRegistry              typeRegistry,
+                                          Set<String>                    allSuperTypeNames,
+                                          Map<String, AtlasAttributeDef> allAttributeDefs,
+                                          List<String>                   visitedTypes) throws AtlasBaseException {
+        if (visitedTypes.contains(classificationDef.getName())) {
+            throw new AtlasBaseException(AtlasErrorCode.CIRCULAR_REFERENCE, classificationDef.getName(),
+                                         visitedTypes.toString());
         }
 
         if (CollectionUtils.isNotEmpty(classificationDef.getSuperTypes())) {
-            superTypes.addAll(classificationDef.getSuperTypes());
-
-            subTypes.add(classificationDef.getName());
+            visitedTypes.add(classificationDef.getName());
             for (String superTypeName : classificationDef.getSuperTypes()) {
                 AtlasType type = typeRegistry.getType(superTypeName);
 
                 if (type instanceof AtlasClassificationType) {
                     AtlasClassificationType superType = (AtlasClassificationType) type;
 
-                    superType.collectAllSuperTypes(subTypes, superTypes, typeRegistry);
+                    superType.collectTypeHierarchyInfo(typeRegistry, allSuperTypeNames, allAttributeDefs, visitedTypes);
                 }
             }
-            subTypes.remove(classificationDef.getName());
+            visitedTypes.remove(classificationDef.getName());
+
+            allSuperTypeNames.addAll(classificationDef.getSuperTypes());
+        }
+
+        if (CollectionUtils.isNotEmpty(classificationDef.getAttributeDefs())) {
+            for (AtlasAttributeDef attributeDef : classificationDef.getAttributeDefs()) {
+                allAttributeDefs.put(attributeDef.getName(), attributeDef);
+            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6a24cad1/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
index 9c5ec62..7170ee4 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
@@ -22,18 +22,19 @@ import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.instance.AtlasEntity;
 import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
 import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-
 /**
  * class that implements behaviour of an entity-type.
  */
@@ -42,8 +43,9 @@ public class AtlasEntityType extends AtlasStructType {
 
     private final AtlasEntityDef entityDef;
 
-    private List<AtlasEntityType> superTypes    = Collections.emptyList();
-    private Set<String>           allSuperTypes = Collections.emptySet();
+    private List<AtlasEntityType>          superTypes       = Collections.emptyList();
+    private Set<String>                    allSuperTypes    = Collections.emptySet();
+    private Map<String, AtlasAttributeDef> allAttributeDefs = Collections.emptyMap();
 
     public AtlasEntityType(AtlasEntityDef entityDef) {
         super(entityDef, TypeCategory.ENTITY);
@@ -63,8 +65,11 @@ public class AtlasEntityType extends AtlasStructType {
     public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
         super.resolveReferences(typeRegistry);
 
-        List<AtlasEntityType> s    = new ArrayList<AtlasEntityType>();
-        Set<String>           allS = getAllSuperTypes(typeRegistry);
+        List<AtlasEntityType>          s    = new ArrayList<>();
+        Set<String>                    allS = new HashSet<>();
+        Map<String, AtlasAttributeDef> allA = new HashMap<>();
+
+        getTypeHierarchyInfo(typeRegistry, allS, allA);
 
         for (String superTypeName : entityDef.getSuperTypes()) {
             AtlasType superType = typeRegistry.getType(superTypeName);
@@ -77,8 +82,9 @@ public class AtlasEntityType extends AtlasStructType {
             }
         }
 
-        this.superTypes    = Collections.unmodifiableList(s);
-        this.allSuperTypes = Collections.unmodifiableSet(allS);
+        this.superTypes       = Collections.unmodifiableList(s);
+        this.allSuperTypes    = Collections.unmodifiableSet(allS);
+        this.allAttributeDefs = Collections.unmodifiableMap(allA);
     }
 
     public Set<String> getSuperTypes() {
@@ -89,6 +95,8 @@ public class AtlasEntityType extends AtlasStructType {
         return allSuperTypes;
     }
 
+    public Map<String, AtlasAttributeDef> getAllAttributeDefs() { return allAttributeDefs; }
+
     public boolean isSuperTypeOf(AtlasEntityType entityType) {
         return entityType != null ? entityType.getAllSuperTypes().contains(this.getTypeName()) : false;
     }
@@ -186,39 +194,47 @@ public class AtlasEntityType extends AtlasStructType {
         }
     }
 
-    private Set<String> getAllSuperTypes(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
-        Set<String>  superTypes = new HashSet<>();
-        List<String> subTypes   = new ArrayList<>();
+    private void getTypeHierarchyInfo(AtlasTypeRegistry              typeRegistry,
+                                      Set<String>                    allSuperTypeNames,
+                                      Map<String, AtlasAttributeDef> allAttributeDefs) throws AtlasBaseException {
+        List<String> visitedTypes = new ArrayList<>();
 
-        collectAllSuperTypes(subTypes, superTypes, typeRegistry);
-
-        return superTypes;
+        collectTypeHierarchyInfo(typeRegistry, allSuperTypeNames, allAttributeDefs, visitedTypes);
     }
 
     /*
      * This method should not assume that resolveReferences() has been called on all superTypes.
      * this.entityDef is the only safe member to reference here
      */
-    private void collectAllSuperTypes(List<String> subTypes, Set<String> superTypes, AtlasTypeRegistry typeRegistry)
-        throws AtlasBaseException {
-        if (subTypes.contains(entityDef.getName())) {
-            throw new AtlasBaseException(AtlasErrorCode.CIRCULAR_REFERENCE, entityDef.getName(), subTypes.toString());
+    private void collectTypeHierarchyInfo(AtlasTypeRegistry              typeRegistry,
+                                          Set<String>                    allSuperTypeNames,
+                                          Map<String, AtlasAttributeDef> allAttributeDefs,
+                                          List<String>                   visitedTypes) throws AtlasBaseException {
+        if (visitedTypes.contains(entityDef.getName())) {
+            throw new AtlasBaseException(AtlasErrorCode.CIRCULAR_REFERENCE, entityDef.getName(),
+                                         visitedTypes.toString());
         }
 
         if (CollectionUtils.isNotEmpty(entityDef.getSuperTypes())) {
-            superTypes.addAll(entityDef.getSuperTypes());
-
-            subTypes.add(entityDef.getName());
+            visitedTypes.add(entityDef.getName());
             for (String superTypeName : entityDef.getSuperTypes()) {
                 AtlasType type = typeRegistry.getType(superTypeName);
 
                 if (type instanceof AtlasEntityType) {
                     AtlasEntityType superType = (AtlasEntityType) type;
 
-                    superType.collectAllSuperTypes(subTypes, superTypes, typeRegistry);
+                    superType.collectTypeHierarchyInfo(typeRegistry, allSuperTypeNames, allAttributeDefs, visitedTypes);
                 }
             }
-            subTypes.remove(entityDef.getName());
+            visitedTypes.remove(entityDef.getName());
+
+            allSuperTypeNames.addAll(entityDef.getSuperTypes());
+        }
+
+        if (CollectionUtils.isNotEmpty(entityDef.getAttributeDefs())) {
+            for (AtlasAttributeDef attributeDef : entityDef.getAttributeDefs()) {
+                allAttributeDefs.put(attributeDef.getName(), attributeDef);
+            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6a24cad1/intg/src/test/java/org/apache/atlas/type/TestAtlasTypeRegistry.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasTypeRegistry.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasTypeRegistry.java
index 7ad9a18..9429c07 100644
--- a/intg/src/test/java/org/apache/atlas/type/TestAtlasTypeRegistry.java
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasTypeRegistry.java
@@ -19,14 +19,20 @@ package org.apache.atlas.type;
 
 
 import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
 import org.apache.atlas.model.typedef.AtlasClassificationDef;
 import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
 import org.apache.atlas.model.typedef.AtlasTypesDef;
 import org.apache.atlas.type.AtlasTypeRegistry.AtlasTransientTypeRegistry;
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static org.testng.Assert.*;
 
 public class TestAtlasTypeRegistry {
 
@@ -57,6 +63,14 @@ public class TestAtlasTypeRegistry {
         classifiL2_3.addSuperType(classifiL1_2.getName());
         classifiL2_4.addSuperType(classifiL1_2.getName());
 
+        classifiL0.addAttribute(new AtlasAttributeDef("L0_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        classifiL1_1.addAttribute(new AtlasAttributeDef("L1-1_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        classifiL1_2.addAttribute(new AtlasAttributeDef("L1-2_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        classifiL2_1.addAttribute(new AtlasAttributeDef("L2-1_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        classifiL2_2.addAttribute(new AtlasAttributeDef("L2-2_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        classifiL2_3.addAttribute(new AtlasAttributeDef("L2-3_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        classifiL2_4.addAttribute(new AtlasAttributeDef("L2-4_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+
         AtlasTypesDef typesDef = new AtlasTypesDef();
 
         typesDef.getClassificationDefs().add(classifiL0);
@@ -77,6 +91,24 @@ public class TestAtlasTypeRegistry {
             failureMsg = excp.getMessage();
         }
         assertNull(failureMsg);
+
+        typeRegistry.commitTransientTypeRegistry(ttr);
+
+        validateSuperTypes(typeRegistry, "L0", new HashSet<String>());
+        validateSuperTypes(typeRegistry, "L1-1", new HashSet<>(Arrays.asList("L0")));
+        validateSuperTypes(typeRegistry, "L1-2", new HashSet<>(Arrays.asList("L0")));
+        validateSuperTypes(typeRegistry, "L2-1", new HashSet<>(Arrays.asList("L1-1", "L0")));
+        validateSuperTypes(typeRegistry, "L2-2", new HashSet<>(Arrays.asList("L1-1", "L0")));
+        validateSuperTypes(typeRegistry, "L2-3", new HashSet<>(Arrays.asList("L1-1", "L0", "L1-2")));
+        validateSuperTypes(typeRegistry, "L2-4", new HashSet<>(Arrays.asList("L1-2", "L0")));
+
+        validateAttributeNames(typeRegistry, "L0", new HashSet<>(Arrays.asList("L0_a1")));
+        validateAttributeNames(typeRegistry, "L1-1", new HashSet<>(Arrays.asList("L0_a1", "L1-1_a1")));
+        validateAttributeNames(typeRegistry, "L1-2", new HashSet<>(Arrays.asList("L0_a1", "L1-2_a1")));
+        validateAttributeNames(typeRegistry, "L2-1", new HashSet<>(Arrays.asList("L0_a1", "L1-1_a1", "L2-1_a1")));
+        validateAttributeNames(typeRegistry, "L2-2", new HashSet<>(Arrays.asList("L0_a1", "L1-1_a1", "L2-2_a1")));
+        validateAttributeNames(typeRegistry, "L2-3", new HashSet<>(Arrays.asList("L0_a1", "L1-1_a1", "L1-2_a1", "L2-3_a1")));
+        validateAttributeNames(typeRegistry, "L2-4", new HashSet<>(Arrays.asList("L0_a1", "L1-2_a1", "L2-4_a1")));
     }
 
     @Test
@@ -176,6 +208,14 @@ public class TestAtlasTypeRegistry {
         entL2_3.addSuperType(entL1_2.getName());
         entL2_4.addSuperType(entL1_2.getName());
 
+        entL0.addAttribute(new AtlasAttributeDef("L0_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        entL1_1.addAttribute(new AtlasAttributeDef("L1-1_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        entL1_2.addAttribute(new AtlasAttributeDef("L1-2_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        entL2_1.addAttribute(new AtlasAttributeDef("L2-1_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        entL2_2.addAttribute(new AtlasAttributeDef("L2-2_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        entL2_3.addAttribute(new AtlasAttributeDef("L2-3_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        entL2_4.addAttribute(new AtlasAttributeDef("L2-4_a1", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+
         AtlasTypesDef typesDef = new AtlasTypesDef();
 
         typesDef.getEntityDefs().add(entL0);
@@ -196,6 +236,24 @@ public class TestAtlasTypeRegistry {
             failureMsg = excp.getMessage();
         }
         assertNull(failureMsg);
+
+        typeRegistry.commitTransientTypeRegistry(ttr);
+
+        validateSuperTypes(typeRegistry, "L0", new HashSet<String>());
+        validateSuperTypes(typeRegistry, "L1-1", new HashSet<>(Arrays.asList("L0")));
+        validateSuperTypes(typeRegistry, "L1-2", new HashSet<>(Arrays.asList("L0")));
+        validateSuperTypes(typeRegistry, "L2-1", new HashSet<>(Arrays.asList("L1-1", "L0")));
+        validateSuperTypes(typeRegistry, "L2-2", new HashSet<>(Arrays.asList("L1-1", "L0")));
+        validateSuperTypes(typeRegistry, "L2-3", new HashSet<>(Arrays.asList("L1-1", "L0", "L1-2")));
+        validateSuperTypes(typeRegistry, "L2-4", new HashSet<>(Arrays.asList("L1-2", "L0")));
+
+        validateAttributeNames(typeRegistry, "L0", new HashSet<>(Arrays.asList("L0_a1")));
+        validateAttributeNames(typeRegistry, "L1-1", new HashSet<>(Arrays.asList("L0_a1", "L1-1_a1")));
+        validateAttributeNames(typeRegistry, "L1-2", new HashSet<>(Arrays.asList("L0_a1", "L1-2_a1")));
+        validateAttributeNames(typeRegistry, "L2-1", new HashSet<>(Arrays.asList("L0_a1", "L1-1_a1", "L2-1_a1")));
+        validateAttributeNames(typeRegistry, "L2-2", new HashSet<>(Arrays.asList("L0_a1", "L1-1_a1", "L2-2_a1")));
+        validateAttributeNames(typeRegistry, "L2-3", new HashSet<>(Arrays.asList("L0_a1", "L1-1_a1", "L1-2_a1", "L2-3_a1")));
+        validateAttributeNames(typeRegistry, "L2-4", new HashSet<>(Arrays.asList("L0_a1", "L1-2_a1", "L2-4_a1")));
     }
 
     @Test
@@ -267,4 +325,47 @@ public class TestAtlasTypeRegistry {
         }
         assertNotNull(failureMsg, "expected invalid supertype failure");
     }
+
+    private void validateSuperTypes(AtlasTypeRegistry typeRegistry, String typeName, Set<String> expectedSuperTypes) {
+        AtlasType type = null;
+
+        try {
+            type = typeRegistry.getType(typeName);
+        } catch (AtlasBaseException excp) {
+        }
+
+        Set<String> superTypes = null;
+
+        if (type != null) {
+            if (type instanceof AtlasEntityType) {
+                superTypes = ((AtlasEntityType) type).getAllSuperTypes();
+            } else if (type instanceof AtlasClassificationType) {
+                superTypes = ((AtlasClassificationType) type).getAllSuperTypes();
+            }
+        }
+
+        assertEquals(superTypes, expectedSuperTypes);
+    }
+
+    private void validateAttributeNames(AtlasTypeRegistry typeRegistry, String typeName, Set<String> attributeNames) {
+        AtlasType type = null;
+
+        try {
+            type = typeRegistry.getType(typeName);
+        } catch (AtlasBaseException excp) {
+        }
+
+        Map<String, AtlasAttributeDef> attributeDefs = null;
+
+        if (type != null) {
+            if (type instanceof AtlasEntityType) {
+                attributeDefs = ((AtlasEntityType) type).getAllAttributeDefs();
+            } else if (type instanceof AtlasClassificationType) {
+                attributeDefs = ((AtlasClassificationType) type).getAllAttributeDefs();
+            }
+        }
+
+        assertNotNull(attributeDefs);
+        assertEquals(attributeDefs.keySet(), attributeNames);
+    }
 }