You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by sh...@apache.org on 2016/07/14 11:05:13 UTC

[1/2] incubator-atlas git commit: ATLAS-1025 Set HIVE_HOME if hive is available in relative path to import hive script (svimal2106 via shwethags)

Repository: incubator-atlas
Updated Branches:
  refs/heads/master 99d514367 -> de0bf1db9


ATLAS-1025 Set HIVE_HOME if hive is available in relative path to import hive script (svimal2106 via shwethags)


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

Branch: refs/heads/master
Commit: 34f67ae0e75b61a12f5c261b358a64478ec37f07
Parents: 99d5143
Author: Shwetha GS <ss...@hortonworks.com>
Authored: Thu Jul 14 16:07:48 2016 +0530
Committer: Shwetha GS <ss...@hortonworks.com>
Committed: Thu Jul 14 16:07:48 2016 +0530

----------------------------------------------------------------------
 addons/hive-bridge/src/bin/import-hive.sh | 8 ++++++--
 release-log.txt                           | 1 +
 2 files changed, 7 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/34f67ae0/addons/hive-bridge/src/bin/import-hive.sh
----------------------------------------------------------------------
diff --git a/addons/hive-bridge/src/bin/import-hive.sh b/addons/hive-bridge/src/bin/import-hive.sh
index 7cbc738..1032aa2 100755
--- a/addons/hive-bridge/src/bin/import-hive.sh
+++ b/addons/hive-bridge/src/bin/import-hive.sh
@@ -78,8 +78,12 @@ if [ -f "${HIVE_CONF}/hive-env.sh" ]; then
 fi
 
 if [ -z "$HIVE_HOME" ]; then
-    echo "Please set HIVE_HOME to the root of Hive installation"
-    exit 1
+    if [ -d "${BASEDIR}/../hive" ]; then
+        HIVE_HOME=${BASEDIR}/../hive
+    else
+        echo "Please set HIVE_HOME to the root of Hive installation"
+        exit 1
+    fi
 fi
 
 HIVE_CP="${HIVE_CONF}"

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/34f67ae0/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index 4469309..46268c9 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -6,6 +6,7 @@ INCOMPATIBLE CHANGES:
 
 
 ALL CHANGES:
+ATLAS-1025 Set HIVE_HOME if hive is available in relative path to import hive script (svimal2106 via shwethags)
 ATLAS-1009 Source HIVE_HOME and HIVE_CONF_DIR from hive_env.sh (svimal2106 via shwethags)
 ATLAS-847 UI: Audit versioning does not paginate details from Atlas server (Kalyanikashikar via shwethags)
 ATLAS-1004 Option to enable taxonomy feature (kevalbhatt18 via shwethags)


[2/2] incubator-atlas git commit: ATLAS-986 Ability to differentiate business catalog terms from traits (sumasai, svimal2106 via shwethags)

Posted by sh...@apache.org.
ATLAS-986 Ability to differentiate business catalog terms from traits (sumasai,svimal2106 via shwethags)


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

Branch: refs/heads/master
Commit: de0bf1db9f1116b02ef30d72cbfc157649a5010a
Parents: 34f67ae
Author: Shwetha GS <ss...@hortonworks.com>
Authored: Thu Jul 14 16:09:54 2016 +0530
Committer: Shwetha GS <ss...@hortonworks.com>
Committed: Thu Jul 14 16:09:54 2016 +0530

----------------------------------------------------------------------
 .../org/apache/atlas/hive/hook/HiveHookIT.java  |  4 +-
 catalog/pom.xml                                 |  7 +++
 .../apache/atlas/catalog/AtlasTypeSystem.java   |  2 +-
 .../apache/atlas/catalog/DefaultTypeSystem.java | 63 ++++++++++++++++++--
 .../atlas/catalog/TaxonomyResourceProvider.java |  9 +++
 .../definition/TaxonomyResourceDefinition.java  |  3 +
 .../catalog/TaxonomyResourceProviderTest.java   |  4 +-
 .../TaxonomyResourceDefinitionTest.java         |  2 +-
 .../java/org/apache/atlas/AtlasConstants.java   |  1 +
 pom.xml                                         |  8 +++
 release-log.txt                                 |  1 +
 repository/pom.xml                              | 13 ++--
 .../atlas/services/DefaultMetadataService.java  | 11 +++-
 .../test/java/org/apache/atlas/TestUtils.java   | 17 ++++++
 .../service/DefaultMetadataServiceTest.java     |  7 +++
 .../apache/atlas/services/MetadataService.java  |  8 +++
 .../atlas/web/resources/EntityService.java      |  3 +-
 .../atlas/web/resources/TaxonomyService.java    |  3 +-
 .../web/resources/TaxonomyServiceTest.java      | 16 ++++-
 19 files changed, 160 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java
----------------------------------------------------------------------
diff --git a/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java b/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java
index e7ecbb1..3457009 100755
--- a/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java
+++ b/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java
@@ -395,7 +395,7 @@ public class HiveHookIT {
         runCommand(drpquery);
         assertTableIsNotRegistered(DEFAULT_DB, ctasTableName);
 
-        //Fix after ATLAS-876
+        //TODO : Fix after ATLAS-876
         runCommand(query);
         assertTableIsRegistered(DEFAULT_DB, ctasTableName);
         String process2Id = assertProcessIsRegistered(hiveEventContext, inputs, outputs);
@@ -760,7 +760,7 @@ public class HiveHookIT {
         assertTableIsRegistered(DEFAULT_DB, tableName);
         assertTableIsRegistered(DEFAULT_DB, insertTableName);
 
-        //TODO - update
+        //TODO -Add update test case
     }
 
     private String random() {

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/catalog/pom.xml
----------------------------------------------------------------------
diff --git a/catalog/pom.xml b/catalog/pom.xml
index 7b9b691..5946c10 100755
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -39,6 +39,13 @@
 
         <dependency>
             <groupId>org.apache.atlas</groupId>
+            <artifactId>atlas-repository</artifactId>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.atlas</groupId>
             <artifactId>atlas-typesystem</artifactId>
         </dependency>
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/catalog/src/main/java/org/apache/atlas/catalog/AtlasTypeSystem.java
----------------------------------------------------------------------
diff --git a/catalog/src/main/java/org/apache/atlas/catalog/AtlasTypeSystem.java b/catalog/src/main/java/org/apache/atlas/catalog/AtlasTypeSystem.java
index 3a58488..8f9cd1d 100644
--- a/catalog/src/main/java/org/apache/atlas/catalog/AtlasTypeSystem.java
+++ b/catalog/src/main/java/org/apache/atlas/catalog/AtlasTypeSystem.java
@@ -51,7 +51,7 @@ public interface AtlasTypeSystem {
      *
      * @throws ResourceAlreadyExistsException if type already exists
      */
-    void createEntity(ResourceDefinition definition, Request request)
+    String createEntity(ResourceDefinition definition, Request request)
             throws ResourceAlreadyExistsException;
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/catalog/src/main/java/org/apache/atlas/catalog/DefaultTypeSystem.java
----------------------------------------------------------------------
diff --git a/catalog/src/main/java/org/apache/atlas/catalog/DefaultTypeSystem.java b/catalog/src/main/java/org/apache/atlas/catalog/DefaultTypeSystem.java
index a8e63f3..f111eb6 100644
--- a/catalog/src/main/java/org/apache/atlas/catalog/DefaultTypeSystem.java
+++ b/catalog/src/main/java/org/apache/atlas/catalog/DefaultTypeSystem.java
@@ -18,24 +18,38 @@
 
 package org.apache.atlas.catalog;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import org.apache.atlas.AtlasException;
 import org.apache.atlas.catalog.definition.ResourceDefinition;
 import org.apache.atlas.catalog.exception.CatalogRuntimeException;
 import org.apache.atlas.catalog.exception.ResourceAlreadyExistsException;
 import org.apache.atlas.catalog.exception.ResourceNotFoundException;
+import org.apache.atlas.classification.InterfaceAudience;
 import org.apache.atlas.services.MetadataService;
 import org.apache.atlas.typesystem.ITypedReferenceableInstance;
 import org.apache.atlas.typesystem.Referenceable;
 import org.apache.atlas.typesystem.Struct;
+import org.apache.atlas.typesystem.TypesDef;
 import org.apache.atlas.typesystem.exception.EntityExistsException;
 import org.apache.atlas.typesystem.exception.EntityNotFoundException;
 import org.apache.atlas.typesystem.exception.TraitNotFoundException;
 import org.apache.atlas.typesystem.exception.TypeExistsException;
+import org.apache.atlas.typesystem.exception.TypeNotFoundException;
 import org.apache.atlas.typesystem.json.TypesSerialization;
-import org.apache.atlas.typesystem.types.*;
+import org.apache.atlas.typesystem.types.AttributeDefinition;
+import org.apache.atlas.typesystem.types.ClassType;
+import org.apache.atlas.typesystem.types.DataTypes;
+import org.apache.atlas.typesystem.types.EnumTypeDefinition;
+import org.apache.atlas.typesystem.types.HierarchicalType;
+import org.apache.atlas.typesystem.types.HierarchicalTypeDefinition;
+import org.apache.atlas.typesystem.types.StructTypeDefinition;
+import org.apache.atlas.typesystem.types.TraitType;
+import org.apache.atlas.typesystem.types.utils.TypesUtil;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -49,12 +63,36 @@ public class DefaultTypeSystem implements AtlasTypeSystem {
      *
      * @param metadataService  atlas metadata service
      */
-    public DefaultTypeSystem(MetadataService metadataService) {
+    public DefaultTypeSystem(MetadataService metadataService) throws AtlasException {
         this.metadataService = metadataService;
+        //Create namespace
+        createSuperTypes();
+    }
+
+    @InterfaceAudience.Private
+    private void createSuperTypes() throws AtlasException {
+        HierarchicalTypeDefinition<TraitType> termType = TypesUtil
+            .createTraitTypeDef(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE, ImmutableSet.<String>of(),
+                TypesUtil.createOptionalAttrDef(TaxonomyResourceProvider.NAMESPACE_ATTRIBUTE_NAME,
+                    DataTypes.STRING_TYPE));
+
+        createTraitType(termType);
+    }
+
+    private void createTraitType(HierarchicalTypeDefinition<TraitType> type) throws AtlasException {
+        try {
+            metadataService.getTypeDefinition(type.typeName);
+        } catch(TypeNotFoundException tne) {
+            //Type not found . Create
+            TypesDef typesDef = TypesUtil.getTypesDef(ImmutableList.<EnumTypeDefinition>of(), ImmutableList.<StructTypeDefinition>of(),
+                ImmutableList.<HierarchicalTypeDefinition<TraitType>>of(type),
+                ImmutableList.<HierarchicalTypeDefinition<ClassType>>of());
+            metadataService.createType(TypesSerialization.toJson(typesDef));
+        }
     }
 
     @Override
-    public void createEntity(ResourceDefinition definition, Request request) throws ResourceAlreadyExistsException {
+    public String createEntity(ResourceDefinition definition, Request request) throws ResourceAlreadyExistsException {
         String typeName = definition.getTypeName();
         try {
             createClassType(definition, typeName, typeName + " Definition");
@@ -63,8 +101,12 @@ public class DefaultTypeSystem implements AtlasTypeSystem {
         }
         try {
             Referenceable entity = new Referenceable(typeName, request.getQueryProperties());
+            //add Taxonomy Namespace
+            entity.set(TaxonomyResourceProvider.NAMESPACE_ATTRIBUTE_NAME, TaxonomyResourceProvider.TAXONOMY_NS);
+
             ITypedReferenceableInstance typedInstance = metadataService.getTypedReferenceableInstance(entity);
-            metadataService.createEntities(Collections.singletonList(typedInstance).toArray(new ITypedReferenceableInstance[1]));
+            final List<String> entities = metadataService.createEntities(Collections.singletonList(typedInstance).toArray(new ITypedReferenceableInstance[1]));
+            return entities != null && entities.size() > 0 ? entities.get(0) : null;
         } catch (EntityExistsException e) {
             throw new ResourceAlreadyExistsException(
                     "Attempted to create an entity which already exists: " + request.getQueryProperties());
@@ -115,6 +157,9 @@ public class DefaultTypeSystem implements AtlasTypeSystem {
             for (Map.Entry<String, Object> propEntry : properties.entrySet()) {
                 struct.set(propEntry.getKey(), propEntry.getValue());
             }
+
+            //add Taxonomy Namespace
+            struct.set(TaxonomyResourceProvider.NAMESPACE_ATTRIBUTE_NAME, TaxonomyResourceProvider.TAXONOMY_NS);
             metadataService.addTrait(guid, metadataService.createTraitInstance(struct));
         } catch (IllegalArgumentException e) {
             //todo: unfortunately, IllegalArgumentException can be thrown for other reasons
@@ -151,8 +196,14 @@ public class DefaultTypeSystem implements AtlasTypeSystem {
                                                          throws ResourceAlreadyExistsException {
 
         try {
-            HierarchicalTypeDefinition<T> definition = new HierarchicalTypeDefinition<>(type, name, description, null,
-                    attributes.toArray(new AttributeDefinition[attributes.size()]));
+            HierarchicalTypeDefinition<T> definition = null;
+            if ( isTrait) {
+                definition = new HierarchicalTypeDefinition<T>(type, name, description,
+                    ImmutableSet.<String>of(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE), attributes.toArray(new AttributeDefinition[attributes.size()]));
+            } else {
+                definition = new HierarchicalTypeDefinition<T>(type, name, description,
+                    ImmutableSet.<String>of(), attributes.toArray(new AttributeDefinition[attributes.size()]));
+            }
 
             metadataService.createType(TypesSerialization.toJson(definition, isTrait));
         } catch (TypeExistsException e) {

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/catalog/src/main/java/org/apache/atlas/catalog/TaxonomyResourceProvider.java
----------------------------------------------------------------------
diff --git a/catalog/src/main/java/org/apache/atlas/catalog/TaxonomyResourceProvider.java b/catalog/src/main/java/org/apache/atlas/catalog/TaxonomyResourceProvider.java
index ee71e47..b59dcae 100644
--- a/catalog/src/main/java/org/apache/atlas/catalog/TaxonomyResourceProvider.java
+++ b/catalog/src/main/java/org/apache/atlas/catalog/TaxonomyResourceProvider.java
@@ -36,6 +36,15 @@ public class TaxonomyResourceProvider extends BaseResourceProvider implements Re
     private static final Logger LOG = LoggerFactory.getLogger(TaxonomyResourceProvider.class);
     public static final String DEFAULT_TAXONOMY_NAME = "Catalog";
     public static final String DEFAULT_TAXONOMY_DESCRIPTION = "Business Catalog";
+
+    public static final String NAMESPACE_ATTRIBUTE_NAME = "taxonomy.namespace";
+
+    // Taxonomy Term type
+    public static final String TAXONOMY_TERM_TYPE = "TaxonomyTerm";
+
+    // Taxonomy Namespace
+    public static final String TAXONOMY_NS = "atlas.taxonomy";
+
     private final TermResourceProvider termResourceProvider;
 
     // This is a cached value to prevent checking for taxonomy objects in every API call.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/catalog/src/main/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinition.java
----------------------------------------------------------------------
diff --git a/catalog/src/main/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinition.java b/catalog/src/main/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinition.java
index ff22f3b..47d182c 100644
--- a/catalog/src/main/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinition.java
+++ b/catalog/src/main/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinition.java
@@ -20,7 +20,9 @@ package org.apache.atlas.catalog.definition;
 
 import com.tinkerpop.pipes.PipeFunction;
 import com.tinkerpop.pipes.transform.TransformFunctionPipe;
+import org.apache.atlas.AtlasConstants;
 import org.apache.atlas.catalog.Request;
+import org.apache.atlas.catalog.TaxonomyResourceProvider;
 import org.apache.atlas.catalog.VertexWrapper;
 import org.apache.atlas.catalog.exception.InvalidPayloadException;
 import org.apache.atlas.catalog.projection.Projection;
@@ -37,6 +39,7 @@ public class TaxonomyResourceDefinition extends BaseResourceDefinition {
     public TaxonomyResourceDefinition() {
         registerProperty(TypesUtil.createUniqueRequiredAttrDef("name", DataTypes.STRING_TYPE));
         registerProperty(TypesUtil.createOptionalAttrDef("description", DataTypes.STRING_TYPE));
+        registerProperty(TypesUtil.createOptionalAttrDef(TaxonomyResourceProvider.NAMESPACE_ATTRIBUTE_NAME, DataTypes.STRING_TYPE));
 
         //todo: combine with above registrations
         instanceProperties.add("name");

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/catalog/src/test/java/org/apache/atlas/catalog/TaxonomyResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/TaxonomyResourceProviderTest.java b/catalog/src/test/java/org/apache/atlas/catalog/TaxonomyResourceProviderTest.java
index 5a03414..8dfce5e 100644
--- a/catalog/src/test/java/org/apache/atlas/catalog/TaxonomyResourceProviderTest.java
+++ b/catalog/src/test/java/org/apache/atlas/catalog/TaxonomyResourceProviderTest.java
@@ -98,7 +98,7 @@ public class TaxonomyResourceProviderTest {
         // mock expectations
         expect(queryFactory.createTaxonomyQuery(capture(checkForAnyTaxonomiesCapture))).andReturn(query);
         expect(query.execute()).andReturn(Collections.<Map<String, Object>>emptySet());
-        typeSystem.createEntity(capture(resourceDefinitionCapture), capture(createDefaultTaxonomyRequestCapture));
+        expect(typeSystem.createEntity(capture(resourceDefinitionCapture), capture(createDefaultTaxonomyRequestCapture))).andReturn("testGuid");
         expect(queryFactory.createTaxonomyQuery(capture(requestCapture))).andReturn(query);
         expect(query.execute()).andReturn(queryResult);
         replay(typeSystem, queryFactory, query);
@@ -348,7 +348,7 @@ public class TaxonomyResourceProviderTest {
         // mock expectations
         expect(queryFactory.createTaxonomyQuery(capture(requestCapture))).andReturn(query);
         expect(query.execute()).andReturn(queryResult);
-        typeSystem.createEntity(capture(resourceDefinitionCapture), capture(requestCapture));
+        expect(typeSystem.createEntity(capture(resourceDefinitionCapture), capture(requestCapture))).andReturn("testGuid");
         replay(typeSystem, queryFactory, query);
 
         Map<String, Object> requestProperties = new HashMap<>();

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/catalog/src/test/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinitionTest.java b/catalog/src/test/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinitionTest.java
index 33620c3..1af8d14 100644
--- a/catalog/src/test/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinitionTest.java
+++ b/catalog/src/test/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinitionTest.java
@@ -99,7 +99,7 @@ public class TaxonomyResourceDefinitionTest {
         ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
         Collection<AttributeDefinition> propertyDefinitions = taxonomyDefinition.getPropertyDefinitions();
 
-        assertEquals(propertyDefinitions.size(), 2);
+        assertEquals(propertyDefinitions.size(), 3);
         Set<String> defNames = new HashSet<>();
         for (AttributeDefinition def : propertyDefinitions) {
             defNames.add(def.name);

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/common/src/main/java/org/apache/atlas/AtlasConstants.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/atlas/AtlasConstants.java b/common/src/main/java/org/apache/atlas/AtlasConstants.java
index cb46316..cee85b4 100644
--- a/common/src/main/java/org/apache/atlas/AtlasConstants.java
+++ b/common/src/main/java/org/apache/atlas/AtlasConstants.java
@@ -32,4 +32,5 @@ public final class AtlasConstants {
     public static final String DEFAULT_APP_PORT_STR = "21000";
     public static final String ATLAS_REST_ADDRESS_KEY = "atlas.rest.address";
     public static final String DEFAULT_ATLAS_REST_ADDRESS = "http://localhost:21000";
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 1e70d10..88b7ee9 100755
--- a/pom.xml
+++ b/pom.xml
@@ -1051,6 +1051,14 @@
 
             <dependency>
                 <groupId>org.apache.atlas</groupId>
+                <artifactId>atlas-repository</artifactId>
+                <version>${project.version}</version>
+                <classifier>tests</classifier>
+                <scope>test</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.atlas</groupId>
                 <artifactId>atlas-notification</artifactId>
                 <version>${project.version}</version>
             </dependency>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index 46268c9..8c195e7 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -6,6 +6,7 @@ INCOMPATIBLE CHANGES:
 
 
 ALL CHANGES:
+ATLAS-986 Ability to differentiate business catalog terms from traits (sumasai,svimal2106 via shwethags)
 ATLAS-1025 Set HIVE_HOME if hive is available in relative path to import hive script (svimal2106 via shwethags)
 ATLAS-1009 Source HIVE_HOME and HIVE_CONF_DIR from hive_env.sh (svimal2106 via shwethags)
 ATLAS-847 UI: Audit versioning does not paginate details from Atlas server (Kalyanikashikar via shwethags)

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/repository/pom.xml
----------------------------------------------------------------------
diff --git a/repository/pom.xml b/repository/pom.xml
index 9c34f19..3d525e0 100755
--- a/repository/pom.xml
+++ b/repository/pom.xml
@@ -164,17 +164,18 @@
     </dependencies>
 
     <build>
-
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <version>2.4</version>
-                <configuration>
-                    <excludes>
-                        <exclude>**/log4j.xml</exclude>
-                    </excludes>
-                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>test-jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
             </plugin>
             <plugin>
                 <groupId>net.alchim31.maven</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java b/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java
index 99f0036..578def0 100755
--- a/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java
+++ b/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java
@@ -25,6 +25,7 @@ import com.google.inject.Provider;
 
 import org.apache.atlas.ApplicationProperties;
 import org.apache.atlas.AtlasClient;
+import org.apache.atlas.AtlasConstants;
 import org.apache.atlas.AtlasException;
 import org.apache.atlas.EntityAuditEvent;
 import org.apache.atlas.RequestContext;
@@ -637,7 +638,6 @@ public class DefaultMetadataService implements MetadataService, ActiveStateChang
 
     private ITypedStruct deserializeTraitInstance(String traitInstanceDefinition)
     throws AtlasException {
-
         return createTraitInstance(InstanceSerialization.fromJsonStruct(traitInstanceDefinition, true));
     }
 
@@ -656,6 +656,15 @@ public class DefaultMetadataService implements MetadataService, ActiveStateChang
         }
     }
 
+    @Override
+    public String getTraitDefinition(final String guid, final String traitName) throws AtlasException {
+        ParamChecker.notEmpty(guid, "entity id");
+
+        final ITypedReferenceableInstance instance = repository.getEntityDefinition(guid);
+        IStruct struct = instance.getTrait(traitName);
+        return InstanceSerialization.toJson(struct, true);
+    }
+
     /**
      * Deletes a given trait from an existing entity represented by a guid.
      *

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/repository/src/test/java/org/apache/atlas/TestUtils.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/TestUtils.java b/repository/src/test/java/org/apache/atlas/TestUtils.java
index a159496..1eeffb4 100755
--- a/repository/src/test/java/org/apache/atlas/TestUtils.java
+++ b/repository/src/test/java/org/apache/atlas/TestUtils.java
@@ -23,9 +23,11 @@ import com.google.common.collect.ImmutableSet;
 import com.thinkaurelius.titan.core.TitanGraph;
 import com.tinkerpop.blueprints.util.io.graphson.GraphSONWriter;
 import org.apache.atlas.repository.graph.GraphHelper;
+import org.apache.atlas.services.MetadataService;
 import org.apache.atlas.typesystem.ITypedReferenceableInstance;
 import org.apache.atlas.typesystem.Referenceable;
 import org.apache.atlas.typesystem.TypesDef;
+import org.apache.atlas.typesystem.json.InstanceSerialization;
 import org.apache.atlas.typesystem.persistence.Id;
 import org.apache.atlas.typesystem.types.AttributeDefinition;
 import org.apache.atlas.typesystem.types.ClassType;
@@ -40,12 +42,14 @@ import org.apache.atlas.typesystem.types.TraitType;
 import org.apache.atlas.typesystem.types.TypeSystem;
 import org.apache.atlas.typesystem.types.utils.TypesUtil;
 import org.apache.commons.lang.RandomStringUtils;
+import org.codehaus.jettison.json.JSONArray;
 import org.testng.Assert;
 
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
+import java.util.List;
 
 import static org.apache.atlas.typesystem.types.utils.TypesUtil.createClassTypeDef;
 import static org.apache.atlas.typesystem.types.utils.TypesUtil.createOptionalAttrDef;
@@ -368,4 +372,17 @@ public final class TestUtils {
         entity.set("type", "VARCHAR(32)");
         return entity;
     }
+
+    public static String createInstance(MetadataService metadataService, Referenceable entity) throws Exception {
+        RequestContext.createContext();
+
+        String entityjson = InstanceSerialization.toJson(entity, true);
+        JSONArray entitiesJson = new JSONArray();
+        entitiesJson.put(entityjson);
+        List<String> guids = metadataService.createEntities(entitiesJson.toString());
+        if (guids != null && guids.size() > 0) {
+            return guids.get(guids.size() - 1);
+        }
+        return null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java b/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java
index e6dd230..443dd4a 100644
--- a/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java
+++ b/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java
@@ -24,6 +24,7 @@ import com.google.inject.Inject;
 import com.thinkaurelius.titan.core.TitanGraph;
 import com.thinkaurelius.titan.core.util.TitanCleanup;
 import org.apache.atlas.AtlasClient;
+import org.apache.atlas.AtlasConstants;
 import org.apache.atlas.AtlasException;
 import org.apache.atlas.EntityAuditEvent;
 import org.apache.atlas.RepositoryMetadataModule;
@@ -213,6 +214,12 @@ public class DefaultMetadataServiceTest {
         assertEquals(traits.size(), 1);
         assertEquals(traits.get(0), PII);
 
+        //getTrait
+        String traitDefinition = metadataService.getTraitDefinition(id, PII);
+        Struct traitResult = InstanceSerialization.fromJsonStruct(traitDefinition, true);
+        Assert.assertNotNull(traitResult);
+        Assert.assertEquals(traitResult.getValuesMap().size(), 0);
+
         //delete trait
         metadataService.deleteTrait(id, PII);
         traits = metadataService.getTraitNames(id);

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/server-api/src/main/java/org/apache/atlas/services/MetadataService.java
----------------------------------------------------------------------
diff --git a/server-api/src/main/java/org/apache/atlas/services/MetadataService.java b/server-api/src/main/java/org/apache/atlas/services/MetadataService.java
index 7cc036c..ed0f7fd 100644
--- a/server-api/src/main/java/org/apache/atlas/services/MetadataService.java
+++ b/server-api/src/main/java/org/apache/atlas/services/MetadataService.java
@@ -209,6 +209,14 @@ public interface MetadataService {
      */
     ITypedStruct createTraitInstance(Struct traitInstance) throws AtlasException;
 
+    /**
+     * Return trait definition of a single trait for a given entity
+     * @param guid - Guid of the entity to which the trait is tagged
+     * @param traitName - Name of the trait
+     * @return
+     * @throws AtlasException
+     */
+    String getTraitDefinition(String guid, String traitName) throws AtlasException;
 
     /**
      * Deletes a given trait from an existing entity represented by a guid.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/webapp/src/main/java/org/apache/atlas/web/resources/EntityService.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/resources/EntityService.java b/webapp/src/main/java/org/apache/atlas/web/resources/EntityService.java
index 1f0c944..f7b32b6 100644
--- a/webapp/src/main/java/org/apache/atlas/web/resources/EntityService.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/EntityService.java
@@ -18,6 +18,7 @@
 
 package org.apache.atlas.web.resources;
 
+import org.apache.atlas.AtlasException;
 import org.apache.atlas.catalog.*;
 import org.apache.atlas.catalog.exception.CatalogException;
 import org.apache.atlas.services.MetadataService;
@@ -40,7 +41,7 @@ public class EntityService extends BaseService {
     private final EntityTagResourceProvider entityTagResourceProvider;
 
     @Inject
-    public EntityService(MetadataService metadataService) {
+    public EntityService(MetadataService metadataService) throws AtlasException {
         DefaultTypeSystem typeSystem = new DefaultTypeSystem(metadataService);
         entityResourceProvider = new EntityResourceProvider(typeSystem);
         entityTagResourceProvider = new EntityTagResourceProvider(typeSystem);

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/webapp/src/main/java/org/apache/atlas/web/resources/TaxonomyService.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/resources/TaxonomyService.java b/webapp/src/main/java/org/apache/atlas/web/resources/TaxonomyService.java
index d84f8a2..3c460ed 100644
--- a/webapp/src/main/java/org/apache/atlas/web/resources/TaxonomyService.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/TaxonomyService.java
@@ -18,6 +18,7 @@
 
 package org.apache.atlas.web.resources;
 
+import org.apache.atlas.AtlasException;
 import org.apache.atlas.catalog.*;
 import org.apache.atlas.catalog.Request;
 import org.apache.atlas.catalog.exception.CatalogException;
@@ -45,7 +46,7 @@ public class TaxonomyService extends BaseService {
     private ResourceProvider termResourceProvider;
 
     @Inject
-    public void setMetadataService(MetadataService metadataService) {
+    public void setMetadataService(MetadataService metadataService) throws AtlasException {
         DefaultTypeSystem typeSystem = new DefaultTypeSystem(metadataService);
         taxonomyResourceProvider = createTaxonomyResourceProvider(typeSystem);
         termResourceProvider = createTermResourceProvider(typeSystem);

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/de0bf1db/webapp/src/test/java/org/apache/atlas/web/resources/TaxonomyServiceTest.java
----------------------------------------------------------------------
diff --git a/webapp/src/test/java/org/apache/atlas/web/resources/TaxonomyServiceTest.java b/webapp/src/test/java/org/apache/atlas/web/resources/TaxonomyServiceTest.java
index b2ff4cf..3f20453 100644
--- a/webapp/src/test/java/org/apache/atlas/web/resources/TaxonomyServiceTest.java
+++ b/webapp/src/test/java/org/apache/atlas/web/resources/TaxonomyServiceTest.java
@@ -18,6 +18,8 @@
 
 package org.apache.atlas.web.resources;
 
+import org.apache.atlas.AtlasConstants;
+import org.apache.atlas.AtlasException;
 import org.apache.atlas.catalog.*;
 import org.apache.atlas.services.MetadataService;
 import org.easymock.Capture;
@@ -55,6 +57,7 @@ public class TaxonomyServiceTest {
         Result result = new Result(resultPropertyMaps);
 
         expect(taxonomyResourceProvider.getResourceById(capture(requestCapture))).andReturn(result);
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         expect(serializer.serialize(result, uriInfo)).andReturn("Taxonomy Get Response");
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider, serializer);
 
@@ -95,6 +98,7 @@ public class TaxonomyServiceTest {
         expect(uriInfo.getRequestUri()).andReturn(uri);
         expect(taxonomyResourceProvider.getResources(capture(requestCapture))).andReturn(result);
         expect(serializer.serialize(result, uriInfo)).andReturn("Taxonomy Get Response");
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider, serializer);
 
         // instantiate service and invoke method being tested
@@ -126,6 +130,7 @@ public class TaxonomyServiceTest {
         String body = "{ \"description\" : \"test description\" } ";
         // set mock expectations
         expect(uriInfo.getRequestUri()).andReturn(uri);
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         taxonomyResourceProvider.createResource(capture(requestCapture));
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider);
 
@@ -162,6 +167,7 @@ public class TaxonomyServiceTest {
         // set mock expectations
         expect(uriInfo.getRequestUri()).andReturn(uri);
         taxonomyResourceProvider.deleteResourceById(capture(requestCapture));
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider);
 
         // instantiate service and invoke method being tested
@@ -203,6 +209,7 @@ public class TaxonomyServiceTest {
 
         expect(termResourceProvider.getResourceById(capture(requestCapture))).andReturn(result);
         expect(serializer.serialize(result, uriInfo)).andReturn("Taxonomy Term Get Response");
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider, serializer);
 
         TestTaxonomyService service = new TestTaxonomyService(
@@ -243,6 +250,7 @@ public class TaxonomyServiceTest {
         expect(uriInfo.getRequestUri()).andReturn(uri);
         expect(termResourceProvider.getResources(capture(requestCapture))).andReturn(result);
         expect(serializer.serialize(result, uriInfo)).andReturn("Taxonomy Term Get Response");
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider, serializer);
 
         // instantiate service and invoke method being tested
@@ -290,6 +298,7 @@ public class TaxonomyServiceTest {
         expect(segment3.getPath()).andReturn("testTerm2");
         expect(termResourceProvider.getResourceById(capture(requestCapture))).andReturn(result);
         expect(serializer.serialize(result, uriInfo)).andReturn("Taxonomy Term Get Response");
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider, serializer,
                 segment1, segment2, segment3);
 
@@ -341,6 +350,7 @@ public class TaxonomyServiceTest {
 
         expect(termResourceProvider.getResources(capture(requestCapture))).andReturn(result);
         expect(serializer.serialize(result, uriInfo)).andReturn("Taxonomy Term Get Response");
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider, serializer,
                 segment1, segment2, segment3);
 
@@ -378,6 +388,7 @@ public class TaxonomyServiceTest {
         String body = "{ \"description\" : \"test description\" } ";
         // set mock expectations
         expect(uriInfo.getRequestUri()).andReturn(uri);
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         termResourceProvider.createResource(capture(requestCapture));
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider);
 
@@ -417,6 +428,7 @@ public class TaxonomyServiceTest {
         String body = "{ \"description\" : \"test description\" } ";
         // set mock expectations
         expect(uriInfo.getRequestUri()).andReturn(uri);
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         termResourceProvider.createResource(capture(requestCapture));
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider);
 
@@ -454,6 +466,7 @@ public class TaxonomyServiceTest {
         // set mock expectations
         expect(uriInfo.getRequestUri()).andReturn(uri);
         termResourceProvider.deleteResourceById(capture(requestCapture));
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider);
 
         // instantiate service and invoke method being tested
@@ -489,6 +502,7 @@ public class TaxonomyServiceTest {
         // set mock expectations
         expect(uriInfo.getRequestUri()).andReturn(uri);
         termResourceProvider.deleteResourceById(capture(requestCapture));
+        expect(metadataService.getTypeDefinition(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE)).andReturn(TaxonomyResourceProvider.TAXONOMY_TERM_TYPE + "-definition");
         replay(uriInfo, metadataService, taxonomyResourceProvider, termResourceProvider);
 
         // instantiate service and invoke method being tested
@@ -521,7 +535,7 @@ public class TaxonomyServiceTest {
         public TestTaxonomyService(MetadataService metadataService,
                                    ResourceProvider taxonomyProvider,
                                    ResourceProvider termResourceProvider,
-                                   JsonSerializer serializer) {
+                                   JsonSerializer serializer) throws AtlasException {
 
             testTaxonomyResourceProvider = taxonomyProvider;
             testTermResourceProvider = termResourceProvider;