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 2017/01/20 19:45:38 UTC

incubator-atlas git commit: ATLAS-1490: added methods to get sub-types of entity and classification types

Repository: incubator-atlas
Updated Branches:
  refs/heads/master 49453f280 -> bda289ef7


ATLAS-1490: added methods to get sub-types of entity and classification types


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

Branch: refs/heads/master
Commit: bda289ef7e001c2831a219c527ae102ebab8d104
Parents: 49453f2
Author: Madhan Neethiraj <ma...@apache.org>
Authored: Fri Jan 20 02:27:09 2017 -0800
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Fri Jan 20 11:45:22 2017 -0800

----------------------------------------------------------------------
 .../atlas/type/AtlasClassificationType.java     | 53 +++++++++---
 .../org/apache/atlas/type/AtlasEntityType.java  | 51 ++++++++----
 .../java/org/apache/atlas/type/AtlasType.java   |  3 +
 .../apache/atlas/type/AtlasTypeRegistry.java    | 87 ++++++++++++++++----
 .../org/apache/atlas/model/ModelTestUtil.java   | 36 ++++----
 .../model/instance/TestAtlasClassification.java | 35 ++++----
 .../atlas/model/instance/TestAtlasEntity.java   | 25 +++---
 .../atlas/type/TestAtlasTypeRegistry.java       | 49 +++++++++--
 release-log.txt                                 |  1 +
 9 files changed, 237 insertions(+), 103 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/bda289ef/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 7d89848..d06364c 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
@@ -24,6 +24,7 @@ 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.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,8 +45,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 Set<String>                    allSubTypes   = Collections.emptySet();
 
     public AtlasClassificationType(AtlasClassificationDef classificationDef) {
         super(classificationDef);
@@ -68,9 +70,9 @@ public class AtlasClassificationType extends AtlasStructType {
     public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
         super.resolveReferences(typeRegistry);
 
-        List<AtlasClassificationType>  s    = new ArrayList<>();
-        Set<String>                    allS = new HashSet<>();
-        Map<String, AtlasAttribute> allA    = new HashMap<>();
+        List<AtlasClassificationType> s    = new ArrayList<>();
+        Set<String>                   allS = new HashSet<>();
+        Map<String, AtlasAttribute>   allA = new HashMap<>();
 
         getTypeHierarchyInfo(typeRegistry, allS, allA);
 
@@ -85,9 +87,24 @@ public class AtlasClassificationType extends AtlasStructType {
             }
         }
 
-        this.superTypes        = Collections.unmodifiableList(s);
-        this.allSuperTypes     = Collections.unmodifiableSet(allS);
-        this.allAttributes     = Collections.unmodifiableMap(allA);
+        this.superTypes    = Collections.unmodifiableList(s);
+        this.allSuperTypes = Collections.unmodifiableSet(allS);
+        this.allAttributes = Collections.unmodifiableMap(allA);
+        this.allSubTypes   = new HashSet<>(); // this will be populated in resolveReferencesPhase2()
+    }
+
+    @Override
+    public void resolveReferencesPhase2(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        super.resolveReferencesPhase2(typeRegistry);
+
+        for (String superTypeName : allSuperTypes) {
+            AtlasClassificationType superType = typeRegistry.getClassificationTypeByName(superTypeName);
+            superType.addSubType(this);
+        }
+    }
+
+    private void addSubType(AtlasClassificationType subType) {
+        allSubTypes.add(subType.getTypeName());
     }
 
     public Set<String> getSuperTypes() {
@@ -96,14 +113,26 @@ public class AtlasClassificationType extends AtlasStructType {
 
     public Set<String> getAllSuperTypes() { return allSuperTypes; }
 
+    public Set<String> getAllSubTypes() {
+        return allSubTypes;
+    }
+
     public boolean isSuperTypeOf(AtlasClassificationType classificationType) {
-        return classificationType != null && classificationType.getAllSuperTypes().contains(this.getTypeName());
+        return classificationType != null && allSubTypes.contains(classificationType.getTypeName());
+    }
+
+    public boolean isSuperTypeOf(String classificationName) {
+        return StringUtils.isNotEmpty(classificationName) && allSubTypes.contains(classificationName);
     }
 
     public boolean isSubTypeOf(AtlasClassificationType classificationType) {
         return classificationType != null && allSuperTypes.contains(classificationType.getTypeName());
     }
 
+    public boolean isSubTypeOf(String classificationName) {
+        return StringUtils.isNotEmpty(classificationName) && allSuperTypes.contains(classificationName);
+    }
+
     @Override
     public AtlasClassification createDefaultValue() {
         AtlasClassification ret = new AtlasClassification(classificationDef.getName());
@@ -217,11 +246,9 @@ public class AtlasClassificationType extends AtlasStructType {
         if (CollectionUtils.isNotEmpty(classificationDef.getSuperTypes())) {
             visitedTypes.add(classificationDef.getName());
             for (String superTypeName : classificationDef.getSuperTypes()) {
-                AtlasType type = typeRegistry.getType(superTypeName);
-
-                if (type instanceof AtlasClassificationType) {
-                    AtlasClassificationType superType = (AtlasClassificationType) type;
+                AtlasClassificationType superType = typeRegistry.getClassificationTypeByName(superTypeName);
 
+                if (superType != null) {
                     superType.collectTypeHierarchyInfo(typeRegistry, allSuperTypeNames, allAttributes, visitedTypes);
                 }
             }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/bda289ef/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 caadecc..b83a241 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
@@ -45,8 +45,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 Set<String>           allSubTypes   = Collections.emptySet();
 
     public AtlasEntityType(AtlasEntityDef entityDef) {
         super(entityDef);
@@ -68,8 +69,8 @@ public class AtlasEntityType extends AtlasStructType {
     public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
         super.resolveReferences(typeRegistry);
 
-        List<AtlasEntityType>          s    = new ArrayList<>();
-        Set<String>                    allS = new HashSet<>();
+        List<AtlasEntityType>       s    = new ArrayList<>();
+        Set<String>                 allS = new HashSet<>();
         Map<String, AtlasAttribute> allA    = new HashMap<>();
 
         getTypeHierarchyInfo(typeRegistry, allS, allA);
@@ -84,9 +85,24 @@ public class AtlasEntityType extends AtlasStructType {
             }
         }
 
-        this.superTypes        = Collections.unmodifiableList(s);
-        this.allSuperTypes     = Collections.unmodifiableSet(allS);
-        this.allAttributes     = Collections.unmodifiableMap(allA);
+        this.superTypes    = Collections.unmodifiableList(s);
+        this.allSuperTypes = Collections.unmodifiableSet(allS);
+        this.allAttributes = Collections.unmodifiableMap(allA);
+        this.allSubTypes   = new HashSet<>(); // this will be populated in resolveReferencesPhase2()
+    }
+
+    @Override
+    public void resolveReferencesPhase2(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        super.resolveReferencesPhase2(typeRegistry);
+
+        for (String superTypeName : allSuperTypes) {
+            AtlasEntityType superType = typeRegistry.getEntityTypeByName(superTypeName);
+            superType.addSubType(this);
+        }
+    }
+
+    private void addSubType(AtlasEntityType subType) {
+        allSubTypes.add(subType.getTypeName());
     }
 
     public Set<String> getSuperTypes() {
@@ -97,8 +113,16 @@ public class AtlasEntityType extends AtlasStructType {
         return allSuperTypes;
     }
 
+    public Set<String> getAllSubTypes() {
+        return allSubTypes;
+    }
+
     public boolean isSuperTypeOf(AtlasEntityType entityType) {
-        return entityType != null && entityType.getAllSuperTypes().contains(this.getTypeName());
+        return entityType != null && allSubTypes.contains(entityType.getTypeName());
+    }
+
+    public boolean isSuperTypeOf(String entityTypeName) {
+        return StringUtils.isNotEmpty(entityTypeName) && allSubTypes.contains(entityTypeName);
     }
 
     public boolean isSubTypeOf(AtlasEntityType entityType) {
@@ -238,10 +262,9 @@ public class AtlasEntityType extends AtlasStructType {
         if (CollectionUtils.isNotEmpty(entityDef.getSuperTypes())) {
             visitedTypes.add(entityDef.getName());
             for (String superTypeName : entityDef.getSuperTypes()) {
-                AtlasType type = typeRegistry.getType(superTypeName);
+                AtlasEntityType superType = typeRegistry.getEntityTypeByName(superTypeName);
 
-                if (type instanceof AtlasEntityType) {
-                    AtlasEntityType superType = (AtlasEntityType) type;
+                if (superType != null) {
                     superType.collectTypeHierarchyInfo(typeRegistry, allSuperTypeNames, allAttributes, visitedTypes);
                 }
             }
@@ -263,11 +286,7 @@ public class AtlasEntityType extends AtlasStructType {
             return false;
         } else {
             String typeName = objId.getTypeName();
-            if (!typeName.equals(getTypeName())) {
-                //TODO - Enable below after enabling subType check
-//                        if ( !isSuperTypeOf(typeName)) {
-//                            return false;
-//                        }
+            if (!typeName.equals(getTypeName()) && !isSuperTypeOf(typeName)) {
                 return false;
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/bda289ef/intg/src/main/java/org/apache/atlas/type/AtlasType.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasType.java b/intg/src/main/java/org/apache/atlas/type/AtlasType.java
index b7502d3..6ea34b3 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasType.java
@@ -50,6 +50,9 @@ public abstract class AtlasType {
     public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
     }
 
+    public void resolveReferencesPhase2(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+    }
+
     public String getTypeName() { return typeName; }
 
     public TypeCategory getTypeCategory() { return typeCategory; }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/bda289ef/intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java b/intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java
index c88e559..3de0215 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java
@@ -64,6 +64,8 @@ public class AtlasTypeRegistry {
 
     public Collection<String> getAllTypeNames() { return registryData.allTypes.getAllTypeNames(); }
 
+    public Collection<AtlasType> getAllTypes() { return registryData.allTypes.getAllTypes(); }
+
     public boolean isRegisteredType(String typeName) {
         return registryData.allTypes.isKnownType(typeName);
     }
@@ -120,6 +122,7 @@ public class AtlasTypeRegistry {
 
     public AtlasBaseTypeDef getTypeDefByGuid(String guid) { return registryData.getTypeDefByGuid(guid); }
 
+
     public Collection<AtlasEnumDef> getAllEnumDefs() { return registryData.enumDefs.getAll(); }
 
     public AtlasEnumDef getEnumDefByGuid(String guid) {
@@ -130,6 +133,12 @@ public class AtlasTypeRegistry {
         return registryData.enumDefs.getTypeDefByName(name);
     }
 
+    public Collection<String> getAllEnumDefNames() { return registryData.enumDefs.getAllNames(); }
+
+    public Collection<AtlasEnumType> getAllEnumTypes() { return registryData.enumDefs.getAllTypes(); }
+
+    public AtlasEnumType getEnumTypeByName(String name) { return registryData.enumDefs.getTypeByName(name); }
+
 
     public Collection<AtlasStructDef> getAllStructDefs() { return registryData.structDefs.getAll(); }
 
@@ -139,6 +148,12 @@ public class AtlasTypeRegistry {
 
     public AtlasStructDef getStructDefByName(String name) { return registryData.structDefs.getTypeDefByName(name); }
 
+    public Collection<String> getAllStructDefNames() { return registryData.structDefs.getAllNames(); }
+
+    public Collection<AtlasStructType> getAllStructTypes() { return registryData.structDefs.getAllTypes(); }
+
+    public AtlasStructType getStructTypeByName(String name) { return registryData.structDefs.getTypeByName(name); }
+
 
     public Collection<AtlasClassificationDef> getAllClassificationDefs() {
         return registryData.classificationDefs.getAll();
@@ -152,6 +167,16 @@ public class AtlasTypeRegistry {
         return registryData.classificationDefs.getTypeDefByName(name);
     }
 
+    public Collection<String> getAllClassificationDefNames() { return registryData.classificationDefs.getAllNames(); }
+
+    public Collection<AtlasClassificationType> getAllClassificationTypes() {
+        return registryData.classificationDefs.getAllTypes();
+    }
+
+    public AtlasClassificationType getClassificationTypeByName(String name) {
+        return registryData.classificationDefs.getTypeByName(name);
+    }
+
 
     public Collection<AtlasEntityDef> getAllEntityDefs() { return registryData.entityDefs.getAll(); }
 
@@ -163,6 +188,13 @@ public class AtlasTypeRegistry {
         return registryData.entityDefs.getTypeDefByName(name);
     }
 
+    public Collection<String> getAllEntityDefNames() { return registryData.entityDefs.getAllNames(); }
+
+    public Collection<AtlasEntityType> getAllEntityTypes() { return registryData.entityDefs.getAllTypes(); }
+
+    public AtlasEntityType getEntityTypeByName(String name) { return registryData.entityDefs.getTypeByName(name); }
+
+
     public AtlasTransientTypeRegistry createTransientTypeRegistry() {
         return new AtlasTransientTypeRegistry(this);
     }
@@ -172,12 +204,12 @@ public class AtlasTypeRegistry {
     }
 
     static class RegistryData {
-        final TypeCache                            allTypes;
-        final TypeDefCache<AtlasEnumDef>           enumDefs;
-        final TypeDefCache<AtlasStructDef>         structDefs;
-        final TypeDefCache<AtlasClassificationDef> classificationDefs;
-        final TypeDefCache<AtlasEntityDef>         entityDefs;
-        final TypeDefCache<? extends AtlasBaseTypeDef>[] allDefCaches;
+        final TypeCache                                                       allTypes;
+        final TypeDefCache<AtlasEnumDef, AtlasEnumType>                       enumDefs;
+        final TypeDefCache<AtlasStructDef, AtlasStructType>                   structDefs;
+        final TypeDefCache<AtlasClassificationDef, AtlasClassificationType>   classificationDefs;
+        final TypeDefCache<AtlasEntityDef, AtlasEntityType>                   entityDefs;
+        final TypeDefCache<? extends AtlasBaseTypeDef, ? extends AtlasType>[] allDefCaches;
 
         RegistryData() {
             allTypes           = new TypeCache();
@@ -284,6 +316,10 @@ public class AtlasTypeRegistry {
             for (AtlasType type : registryData.allTypes.getAllTypes()) {
                 type.resolveReferences(this);
             }
+
+            for (AtlasType type : registryData.allTypes.getAllTypes()) {
+                type.resolveReferencesPhase2(this);
+            }
         }
 
         public void addType(AtlasBaseTypeDef typeDef) throws AtlasBaseException {
@@ -730,25 +766,28 @@ class TypeCache {
     }
 }
 
-class TypeDefCache<T extends AtlasBaseTypeDef> {
+class TypeDefCache<T1 extends AtlasBaseTypeDef, T2 extends AtlasType> {
     private static final Logger LOG = LoggerFactory.getLogger(TypeDefCache.class);
-    private final TypeCache      typeCache;
-    private final Map<String, T> typeDefGuidMap;
-    private final Map<String, T> typeDefNameMap;
+    private final TypeCache       typeCache;
+    private final Map<String, T1> typeDefGuidMap;
+    private final Map<String, T1> typeDefNameMap;
+    private final Map<String, T2> typeNameMap;
 
     public TypeDefCache(TypeCache typeCache) {
         this.typeCache      = typeCache;
         this.typeDefGuidMap = new ConcurrentHashMap<>();
         this.typeDefNameMap = new ConcurrentHashMap<>();
+        this.typeNameMap    = new ConcurrentHashMap<>();
     }
 
     public TypeDefCache(TypeDefCache other, TypeCache typeCache) {
         this.typeCache      = typeCache;
         this.typeDefGuidMap = new ConcurrentHashMap<>(other.typeDefGuidMap);
         this.typeDefNameMap = new ConcurrentHashMap<>(other.typeDefNameMap);
+        this.typeNameMap    = new ConcurrentHashMap<>(other.typeNameMap);
     }
 
-    public void addType(T typeDef, AtlasType type) {
+    public void addType(T1 typeDef, T2 type) {
         if (typeDef != null && type != null) {
             if (StringUtils.isNotEmpty(typeDef.getGuid())) {
                 typeDefGuidMap.put(typeDef.getGuid(), typeDef);
@@ -756,28 +795,38 @@ class TypeDefCache<T extends AtlasBaseTypeDef> {
 
             if (StringUtils.isNotEmpty(typeDef.getName())) {
                 typeDefNameMap.put(typeDef.getName(), typeDef);
+                typeNameMap.put(typeDef.getName(), type);
             }
 
             typeCache.addType(typeDef, type);
         }
     }
 
-    public Collection<T> getAll() {
+    public Collection<T1> getAll() {
         return Collections.unmodifiableCollection(typeDefNameMap.values());
     }
 
-    public T getTypeDefByGuid(String guid) {
+    public Collection<String> getAllNames() { return Collections.unmodifiableCollection(typeDefNameMap.keySet()); }
+
+    public T1 getTypeDefByGuid(String guid) {
         return guid != null ? typeDefGuidMap.get(guid) : null;
     }
 
-    public T getTypeDefByName(String name) {
-
+    public T1 getTypeDefByName(String name) {
         return name != null ? typeDefNameMap.get(name) : null;
     }
 
+    public Collection<T2> getAllTypes() {
+        return Collections.unmodifiableCollection(typeNameMap.values());
+    }
+
+    public T2 getTypeByName(String name) {
+        return name != null ? typeNameMap.get(name) : null;
+    }
+
     public void updateGuid(String typeName, String newGuid) {
         if (typeName != null) {
-            T typeDef = typeDefNameMap.get(typeName);
+            T1 typeDef = typeDefNameMap.get(typeName);
 
             if (typeDef != null) {
                 String currGuid = typeDef.getGuid();
@@ -807,7 +856,7 @@ class TypeDefCache<T extends AtlasBaseTypeDef> {
 
     public void removeTypeDefByGuid(String guid) {
         if (guid != null) {
-            T typeDef = typeDefGuidMap.remove(guid);
+            T1 typeDef = typeDefGuidMap.remove(guid);
 
             typeCache.removeTypeByGuid(guid);
 
@@ -815,6 +864,7 @@ class TypeDefCache<T extends AtlasBaseTypeDef> {
 
             if (name != null) {
                 typeDefNameMap.remove(name);
+                typeNameMap.remove(name);
                 typeCache.removeTypeByName(name);
             }
 
@@ -823,8 +873,9 @@ class TypeDefCache<T extends AtlasBaseTypeDef> {
 
     public void removeTypeDefByName(String name) {
         if (name != null) {
-            T typeDef = typeDefNameMap.remove(name);
+            T1 typeDef = typeDefNameMap.remove(name);
 
+            typeNameMap.remove(name);
             typeCache.removeTypeByName(name);
 
             String guid = typeDef != null ? typeDef.getGuid() : null;

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/bda289ef/intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java b/intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java
index ac740c9..6d3c312 100644
--- a/intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java
+++ b/intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java
@@ -302,14 +302,12 @@ public final class  ModelTestUtil {
     public static AtlasEntity newEntity(AtlasEntityDef entityDef, AtlasTypeRegistry typesRegistry) {
         AtlasEntity ret = null;
 
-        try {
-            AtlasType dataType = typesRegistry.getType(entityDef.getName());
+        AtlasEntityType entityType = typesRegistry.getEntityTypeByName(entityDef.getName());
 
-            if (dataType instanceof AtlasEntityType) {
-                ret = ((AtlasEntityType) dataType).createDefaultValue();
-            }
-        } catch (AtlasBaseException excp) {
-            LOG.error("failed to get entity-type {}", entityDef.getName(), excp);
+        if (entityType != null) {
+            ret = entityType.createDefaultValue();
+        } else {
+            LOG.error("failed to get entity-type {}", entityDef.getName());
         }
 
         return ret;
@@ -322,14 +320,12 @@ public final class  ModelTestUtil {
     public static AtlasStruct newStruct(AtlasStructDef structDef, AtlasTypeRegistry typesRegistry) {
         AtlasStruct ret = null;
 
-        try {
-            AtlasType dataType = typesRegistry.getType(structDef.getName());
+        AtlasStructType structType = typesRegistry.getStructTypeByName(structDef.getName());
 
-            if (dataType instanceof AtlasStructType) {
-                ret = ((AtlasStructType)dataType).createDefaultValue();
-            }
-        } catch (AtlasBaseException excp) {
-            LOG.error("failed to get struct-type {}", structDef.getName(), excp);
+        if (structType != null) {
+            ret = structType.createDefaultValue();
+        } else {
+            LOG.error("failed to get struct-type {}", structDef.getName());
         }
 
         return ret;
@@ -343,14 +339,12 @@ public final class  ModelTestUtil {
                                                         AtlasTypeRegistry typesRegistry) {
         AtlasClassification ret = null;
 
-        try {
-            AtlasType dataType = typesRegistry.getType(classificationDef.getName());
+        AtlasClassificationType classificationType = typesRegistry.getClassificationTypeByName(classificationDef.getName());
 
-            if (dataType instanceof AtlasClassificationType) {
-                ret = ((AtlasClassificationType)dataType).createDefaultValue();
-            }
-        } catch (AtlasBaseException excp) {
-            LOG.error("failed to get classification-type {}", classificationDef.getName(), excp);
+        if (classificationType != null) {
+            ret = classificationType.createDefaultValue();
+        } else {
+            LOG.error("failed to get classification-type {}", classificationDef.getName());
         }
 
         return ret;

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/bda289ef/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java b/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java
index 6dc72ee..b368515 100644
--- a/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java
+++ b/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java
@@ -26,6 +26,7 @@ import org.apache.atlas.type.AtlasTypeRegistry;
 import org.testng.annotations.Test;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
 
@@ -33,11 +34,11 @@ public class TestAtlasClassification {
 
     @Test
     public void testClassificationSerDe() throws AtlasBaseException {
-        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDef();
-        AtlasTypeRegistry      typeRegistry      = ModelTestUtil.getTypesRegistry();
-        AtlasType              dataType          = typeRegistry.getType(classificationDef.getName());
+        AtlasClassificationDef  classificationDef  = ModelTestUtil.getClassificationDef();
+        AtlasTypeRegistry       typeRegistry       = ModelTestUtil.getTypesRegistry();
+        AtlasClassificationType classificationType = typeRegistry.getClassificationTypeByName(classificationDef.getName());
 
-        assertTrue(dataType instanceof  AtlasClassificationType);
+        assertNotNull(classificationType);
 
         AtlasClassification ent1 = ModelTestUtil.newClassification(classificationDef, typeRegistry);
 
@@ -45,45 +46,45 @@ public class TestAtlasClassification {
 
         AtlasClassification ent2 = AtlasType.fromJson(jsonString, AtlasClassification.class);
 
-        ((AtlasClassificationType)dataType).normalizeAttributeValues(ent2);
+        classificationType.normalizeAttributeValues(ent2);
 
         assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasClassification");
     }
 
     @Test
     public void testClassificationSerDeWithSuperType() throws AtlasBaseException {
-        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDefWithSuperType();
-        AtlasTypeRegistry      typeRegistry      = ModelTestUtil.getTypesRegistry();
-        AtlasType              dataType          = typeRegistry.getType(classificationDef.getName());
+        AtlasClassificationDef  classificationDef  = ModelTestUtil.getClassificationDefWithSuperType();
+        AtlasTypeRegistry       typeRegistry       = ModelTestUtil.getTypesRegistry();
+        AtlasClassificationType classificationType = typeRegistry.getClassificationTypeByName(classificationDef.getName());
 
-        assertTrue(dataType instanceof AtlasClassificationType);
+        assertNotNull(classificationType);
 
-        AtlasClassification ent1 =  ((AtlasClassificationType)dataType).createDefaultValue();
+        AtlasClassification ent1 =  classificationType.createDefaultValue();
 
         String jsonString = AtlasType.toJson(ent1);
 
         AtlasClassification ent2 = AtlasType.fromJson(jsonString, AtlasClassification.class);
 
-        ((AtlasClassificationType)dataType).normalizeAttributeValues(ent2);
+        classificationType.normalizeAttributeValues(ent2);
 
         assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasClassification with superType");
     }
 
     @Test
     public void testClassificationSerDeWithSuperTypes() throws AtlasBaseException {
-        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDefWithSuperTypes();
-        AtlasTypeRegistry      typeRegistry      = ModelTestUtil.getTypesRegistry();
-        AtlasType              dataType          = typeRegistry.getType(classificationDef.getName());
+        AtlasClassificationDef  classificationDef  = ModelTestUtil.getClassificationDefWithSuperTypes();
+        AtlasTypeRegistry       typeRegistry       = ModelTestUtil.getTypesRegistry();
+        AtlasClassificationType classificationType = typeRegistry.getClassificationTypeByName(classificationDef.getName());
 
-        assertTrue(dataType instanceof  AtlasClassificationType);
+        assertNotNull(classificationType);
 
-        AtlasClassification ent1 =  ((AtlasClassificationType)dataType).createDefaultValue();
+        AtlasClassification ent1 =  classificationType.createDefaultValue();
 
         String jsonString = AtlasType.toJson(ent1);
 
         AtlasClassification ent2 = AtlasType.fromJson(jsonString, AtlasClassification.class);
 
-        ((AtlasClassificationType)dataType).normalizeAttributeValues(ent2);
+        classificationType.normalizeAttributeValues(ent2);
 
         assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasClassification with superTypes");
     }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/bda289ef/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java b/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java
index efcf1cf..f58b1ff 100644
--- a/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java
+++ b/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java
@@ -26,6 +26,7 @@ import org.apache.atlas.type.AtlasTypeRegistry;
 import org.testng.annotations.Test;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
 
@@ -35,17 +36,17 @@ public class TestAtlasEntity {
     public void testEntitySerDe() throws AtlasBaseException {
         AtlasEntityDef    entityDef    = ModelTestUtil.getEntityDef();
         AtlasTypeRegistry typeRegistry = ModelTestUtil.getTypesRegistry();
-        AtlasType         dataType     = typeRegistry.getType(entityDef.getName());
+        AtlasEntityType   entityType   = typeRegistry.getEntityTypeByName(entityDef.getName());
 
-        assertTrue(dataType instanceof  AtlasEntityType);
+        assertNotNull(entityType);
 
-        AtlasEntity ent1 =  ((AtlasEntityType)dataType).createDefaultValue();
+        AtlasEntity ent1 =  entityType.createDefaultValue();
 
         String jsonString = AtlasType.toJson(ent1);
 
         AtlasEntity ent2 = AtlasType.fromJson(jsonString, AtlasEntity.class);
 
-        ((AtlasEntityType)dataType).normalizeAttributeValues(ent2);
+        entityType.normalizeAttributeValues(ent2);
 
         assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasEntity");
     }
@@ -54,17 +55,17 @@ public class TestAtlasEntity {
     public void testEntitySerDeWithSuperType() throws AtlasBaseException {
         AtlasEntityDef    entityDef    = ModelTestUtil.getEntityDefWithSuperType();
         AtlasTypeRegistry typeRegistry = ModelTestUtil.getTypesRegistry();
-        AtlasType         dataType     = typeRegistry.getType(entityDef.getName());
+        AtlasEntityType   entityType   = typeRegistry.getEntityTypeByName(entityDef.getName());
 
-        assertTrue(dataType instanceof  AtlasEntityType);
+        assertNotNull(entityType);
 
-        AtlasEntity ent1 =  ((AtlasEntityType)dataType).createDefaultValue();
+        AtlasEntity ent1 =  entityType.createDefaultValue();
 
         String jsonString = AtlasType.toJson(ent1);
 
         AtlasEntity ent2 = AtlasType.fromJson(jsonString, AtlasEntity.class);
 
-        ((AtlasEntityType)dataType).normalizeAttributeValues(ent2);
+        entityType.normalizeAttributeValues(ent2);
 
         assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasEntity with superType");
     }
@@ -73,17 +74,17 @@ public class TestAtlasEntity {
     public void testEntitySerDeWithSuperTypes() throws AtlasBaseException {
         AtlasEntityDef    entityDef    = ModelTestUtil.getEntityDefWithSuperTypes();
         AtlasTypeRegistry typeRegistry = ModelTestUtil.getTypesRegistry();
-        AtlasType         dataType     = typeRegistry.getType(entityDef.getName());
+        AtlasEntityType   entityType   = typeRegistry.getEntityTypeByName(entityDef.getName());
 
-        assertTrue(dataType instanceof  AtlasEntityType);
+        assertNotNull(entityType);
 
-        AtlasEntity ent1 =  ((AtlasEntityType)dataType).createDefaultValue();
+        AtlasEntity ent1 =  entityType.createDefaultValue();
 
         String jsonString = AtlasType.toJson(ent1);
 
         AtlasEntity ent2 = AtlasType.fromJson(jsonString, AtlasEntity.class);
 
-        ((AtlasEntityType)dataType).normalizeAttributeValues(ent2);
+        entityType.normalizeAttributeValues(ent2);
 
         assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasEntity with superTypes");
     }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/bda289ef/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 d171dcf..60a09a1 100644
--- a/intg/src/test/java/org/apache/atlas/type/TestAtlasTypeRegistry.java
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasTypeRegistry.java
@@ -46,7 +46,7 @@ public class TestAtlasTypeRegistry {
      *   L2_1  L2_2   L2_3   L2_4
      */
     @Test
-    public void testClassificationDefValidSuperTypes() {
+    public void testClassificationDefValidHierarchy() {
         AtlasClassificationDef classifiL0   = new AtlasClassificationDef("L0");
         AtlasClassificationDef classifiL1_1 = new AtlasClassificationDef("L1-1");
         AtlasClassificationDef classifiL1_2 = new AtlasClassificationDef("L1-2");
@@ -102,6 +102,14 @@ public class TestAtlasTypeRegistry {
         validateSuperTypes(typeRegistry, "L2-3", new HashSet<>(Arrays.asList("L1-1", "L0", "L1-2")));
         validateSuperTypes(typeRegistry, "L2-4", new HashSet<>(Arrays.asList("L1-2", "L0")));
 
+        validateSubTypes(typeRegistry, "L0", new HashSet<>(Arrays.asList("L1-1", "L1-2", "L2-1", "L2-2", "L2-3", "L2-4")));
+        validateSubTypes(typeRegistry, "L1-1", new HashSet<>(Arrays.asList("L2-1", "L2-2", "L2-3")));
+        validateSubTypes(typeRegistry, "L1-2", new HashSet<>(Arrays.asList("L2-3", "L2-4")));
+        validateSubTypes(typeRegistry, "L2-1", new HashSet<String>());
+        validateSubTypes(typeRegistry, "L2-2", new HashSet<String>());
+        validateSubTypes(typeRegistry, "L2-3", new HashSet<String>());
+        validateSubTypes(typeRegistry, "L2-4", new HashSet<String>());
+
         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")));
@@ -112,7 +120,7 @@ public class TestAtlasTypeRegistry {
     }
 
     @Test
-    public void testClassificationDefInvalidSuperTypes_Self() {
+    public void testClassificationDefInvalidHierarchy_Self() {
         AtlasClassificationDef classifiDef1 = new AtlasClassificationDef("classifiDef-1");
 
         classifiDef1.addSuperType(classifiDef1.getName());
@@ -141,7 +149,7 @@ public class TestAtlasTypeRegistry {
      *   L2_1  L2_2   L2_3   L2_4
      */
     @Test
-    public void testClassificationDefInvalidSuperTypes_CircularRef() {
+    public void testClassificationDefInvalidHierarchy_CircularRef() {
         AtlasClassificationDef classifiL0   = new AtlasClassificationDef("L0");
         AtlasClassificationDef classifiL1_1 = new AtlasClassificationDef("L1-1");
         AtlasClassificationDef classifiL1_2 = new AtlasClassificationDef("L1-2");
@@ -191,7 +199,7 @@ public class TestAtlasTypeRegistry {
      *   L2_1  L2_2   L2_3   L2_4
      */
     @Test
-    public void testEntityDefValidSuperTypes() {
+    public void testEntityDefValidHierarchy() {
         AtlasEntityDef entL0   = new AtlasEntityDef("L0");
         AtlasEntityDef entL1_1 = new AtlasEntityDef("L1-1");
         AtlasEntityDef entL1_2 = new AtlasEntityDef("L1-2");
@@ -247,6 +255,14 @@ public class TestAtlasTypeRegistry {
         validateSuperTypes(typeRegistry, "L2-3", new HashSet<>(Arrays.asList("L1-1", "L0", "L1-2")));
         validateSuperTypes(typeRegistry, "L2-4", new HashSet<>(Arrays.asList("L1-2", "L0")));
 
+        validateSubTypes(typeRegistry, "L0", new HashSet<>(Arrays.asList("L1-1", "L1-2", "L2-1", "L2-2", "L2-3", "L2-4")));
+        validateSubTypes(typeRegistry, "L1-1", new HashSet<>(Arrays.asList("L2-1", "L2-2", "L2-3")));
+        validateSubTypes(typeRegistry, "L1-2", new HashSet<>(Arrays.asList("L2-3", "L2-4")));
+        validateSubTypes(typeRegistry, "L2-1", new HashSet<String>());
+        validateSubTypes(typeRegistry, "L2-2", new HashSet<String>());
+        validateSubTypes(typeRegistry, "L2-3", new HashSet<String>());
+        validateSubTypes(typeRegistry, "L2-4", new HashSet<String>());
+
         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")));
@@ -257,7 +273,7 @@ public class TestAtlasTypeRegistry {
     }
 
     @Test
-    public void testEntityDefInvalidSuperTypes_Self() {
+    public void testEntityDefInvalidHierarchy_Self() {
         AtlasEntityDef entDef1 = new AtlasEntityDef("entDef-1");
 
         entDef1.addSuperType(entDef1.getName());
@@ -286,7 +302,7 @@ public class TestAtlasTypeRegistry {
      *   L2_1  L2_2   L2_3   L2_4
      */
     @Test
-    public void testEntityDefInvalidSuperTypes_CircularRef() {
+    public void testEntityDefInvalidHierarchy_CircularRef() {
         AtlasEntityDef entL0   = new AtlasEntityDef("L0");
         AtlasEntityDef entL1_1 = new AtlasEntityDef("L1-1");
         AtlasEntityDef entL1_2 = new AtlasEntityDef("L1-2");
@@ -347,6 +363,27 @@ public class TestAtlasTypeRegistry {
         assertEquals(superTypes, expectedSuperTypes);
     }
 
+    private void validateSubTypes(AtlasTypeRegistry typeRegistry, String typeName, Set<String> expectedSubTypes) {
+        AtlasType type = null;
+
+        try {
+            type = typeRegistry.getType(typeName);
+        } catch (AtlasBaseException excp) {
+        }
+
+        Set<String> subTypes = null;
+
+        if (type != null) {
+            if (type instanceof AtlasEntityType) {
+                subTypes = ((AtlasEntityType) type).getAllSubTypes();
+            } else if (type instanceof AtlasClassificationType) {
+                subTypes = ((AtlasClassificationType) type).getAllSubTypes();
+            }
+        }
+
+        assertEquals(subTypes, expectedSubTypes);
+    }
+
     private void validateAttributeNames(AtlasTypeRegistry typeRegistry, String typeName, Set<String> attributeNames) {
         AtlasType type = null;
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/bda289ef/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index 87b3a9f..55ac3da 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -9,6 +9,7 @@ ATLAS-1060 Add composite indexes for exact match performance improvements for al
 ATLAS-1127 Modify creation and modification timestamps to Date instead of Long(sumasai)
 
 ALL CHANGES:
+ATLAS-1490 added methods to get sub-types of entity and classification types (mneethiraj)
 ATLAS-1437 UI update to disallow tag association changes to deleted entities (Kalyanikashikar via mneethiraj)
 ATLAS-1352 fix for error in redirecting to Knox gateway URL (nixonrodrigues via mneethiraj)
 ATLAS-1467 instance create/full-Update implementation (sumasai via mneethiraj)