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 2018/06/05 14:53:13 UTC

[1/3] atlas git commit: ATLAS-2730: added validation of TimeBoundry values in classifications

Repository: atlas
Updated Branches:
  refs/heads/branch-1.0 32699ab53 -> 32a87a314


ATLAS-2730: added validation of TimeBoundry values in classifications

Signed-off-by: Madhan Neethiraj <ma...@apache.org>
(cherry picked from commit e73a80998ee39aab54eee637aee7ccb99e4156c1)


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

Branch: refs/heads/branch-1.0
Commit: 047f31beb4a40c8b784c64a2203a1348be91a440
Parents: 32699ab
Author: nixonrodrigues <ni...@apache.org>
Authored: Fri Jun 1 12:46:47 2018 +0530
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Tue Jun 5 07:52:37 2018 -0700

----------------------------------------------------------------------
 intg/pom.xml                                    |  6 ++
 .../java/org/apache/atlas/AtlasErrorCode.java   |  3 +
 .../atlas/type/AtlasClassificationType.java     | 87 ++++++++++++++++++++
 .../atlas/type/TestAtlasClassificationType.java | 32 ++++++-
 pom.xml                                         |  1 +
 .../store/graph/v2/AtlasEntityStoreV2.java      |  5 ++
 6 files changed, 131 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/047f31be/intg/pom.xml
----------------------------------------------------------------------
diff --git a/intg/pom.xml b/intg/pom.xml
index 03e4325..089dbfb 100644
--- a/intg/pom.xml
+++ b/intg/pom.xml
@@ -47,6 +47,12 @@
         </dependency>
 
         <dependency>
+            <groupId>commons-validator</groupId>
+            <artifactId>commons-validator</artifactId>
+            <version>${commons-validator.version}</version>
+        </dependency>
+
+        <dependency>
             <groupId>com.fasterxml.jackson.jaxrs</groupId>
             <artifactId>jackson-jaxrs-base</artifactId>
             <version>${jackson.version}</version>

http://git-wip-us.apache.org/repos/asf/atlas/blob/047f31be/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
index 06b4345..f0585eb 100644
--- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
+++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
@@ -148,6 +148,9 @@ public enum AtlasErrorCode {
     MISSING_CATEGORY_DISPLAY_NAME(400, "ATLAS-400-00-082", "Category name is empty/null"),
     INVALID_DISPLAY_NAME(400, "ATLAS-400-00-083", "name cannot contain following special chars ('@', '.')"),
     TERM_HAS_ENTITY_ASSOCIATION(400, "ATLAS-400-00-086", "Term (guid={0}) can't be deleted as it has been assigned to {1} entities."),
+    INVALID_TIMEBOUNDRY_START_TIME(400, "ATLAS-400-00-87B", "Invalid startTime {0}"),
+    INVALID_TIMEBOUNDRY_END_TIME(400, "ATLAS-400-00-87C", "Invalid endTime {0}"),
+    INVALID_TIMEBOUNDRY_DATERANGE(400, "ATLAS-400-00-87D", "Invalid dateRange: startTime {0} must be before endTime {1}"),
 
     UNAUTHORIZED_ACCESS(403, "ATLAS-403-00-001", "{0} is not authorized to perform {1}"),
 

http://git-wip-us.apache.org/repos/asf/atlas/blob/047f31be/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 abacd78..1adb362 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
@@ -20,11 +20,13 @@ package org.apache.atlas.type;
 
 import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.TimeBoundary;
 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.apache.commons.validator.routines.DateValidator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -302,6 +304,10 @@ public class AtlasClassificationType extends AtlasStructType {
                 }
             }
 
+            if (!validateTimeBoundaries(obj, null)) {
+                return false;
+            }
+
             return super.isValidValue(obj);
         }
 
@@ -328,6 +334,10 @@ public class AtlasClassificationType extends AtlasStructType {
                 }
             }
 
+            if (!validateTimeBoundaries(obj, null)) {
+                return false;
+            }
+
             return super.isValidValueForUpdate(obj);
         }
 
@@ -381,6 +391,8 @@ public class AtlasClassificationType extends AtlasStructType {
                 ret = superType.validateValue(obj, objName, messages) && ret;
             }
 
+            ret = validateTimeBoundaries(obj, messages) && ret;
+
             ret = super.validateValue(obj, objName, messages) && ret;
         }
 
@@ -396,6 +408,8 @@ public class AtlasClassificationType extends AtlasStructType {
                 ret = superType.validateValueForUpdate(obj, objName, messages) && ret;
             }
 
+            ret = validateTimeBoundaries(obj, messages) && ret;
+
             ret = super.validateValueForUpdate(obj, objName, messages) && ret;
         }
 
@@ -516,4 +530,77 @@ public class AtlasClassificationType extends AtlasStructType {
             }
         }
     }
+
+    private boolean validateTimeBoundaries(Object classificationObj, List<String> messages) {
+        boolean             ret            = true;
+        AtlasClassification classification = null;
+
+        if (classificationObj instanceof AtlasClassification) {
+            classification = (AtlasClassification) classificationObj;
+        } else if (classificationObj instanceof Map) {
+            classification = new AtlasClassification((Map) classificationObj);
+        }
+
+        if (classification != null && classification.getValidityPeriods() != null) {
+            for (TimeBoundary timeBoundary : classification.getValidityPeriods()) {
+                if (timeBoundary != null) {
+                    ret = validateTimeBoundry(timeBoundary, messages) && ret;
+                }
+            }
+        }
+
+        return ret;
+    }
+
+    private boolean validateTimeBoundry(TimeBoundary timeBoundary, List<String> messages) {
+        boolean        ret           = true;
+        DateValidator  dateValidator = DateValidator.getInstance();
+        Date           startDate     = null;
+        Date           endDate       = null;
+        final TimeZone timezone;
+
+        if (StringUtils.isNotEmpty(timeBoundary.getTimeZone())) {
+            timezone = TimeZone.getTimeZone(timeBoundary.getTimeZone());
+        } else {
+            timezone = java.util.TimeZone.getDefault();
+        }
+
+        if (StringUtils.isNotEmpty(timeBoundary.getStartTime())) {
+            startDate = dateValidator.validate(timeBoundary.getStartTime(), TimeBoundary.TIME_FORMAT, timezone);
+
+            if (startDate == null) {
+                addValidationMessageIfNotPresent(new AtlasBaseException(AtlasErrorCode.INVALID_TIMEBOUNDRY_START_TIME, timeBoundary.getStartTime()), messages);
+
+                ret = false;
+            }
+        }
+
+        if (StringUtils.isNotEmpty(timeBoundary.getEndTime())) {
+            endDate = dateValidator.validate(timeBoundary.getEndTime(), TimeBoundary.TIME_FORMAT, timezone);
+
+            if (endDate == null) {
+                addValidationMessageIfNotPresent(new AtlasBaseException(AtlasErrorCode.INVALID_TIMEBOUNDRY_END_TIME, timeBoundary.getEndTime()), messages);
+
+                ret = false;
+            }
+        }
+
+        if (startDate != null && endDate != null) {
+            if (endDate.before(startDate)) {
+                addValidationMessageIfNotPresent(new AtlasBaseException(AtlasErrorCode.INVALID_TIMEBOUNDRY_DATERANGE, timeBoundary.getStartTime(), timeBoundary.getEndTime()), messages);
+
+                ret = false;
+            }
+        }
+
+        return ret;
+    }
+
+    private void addValidationMessageIfNotPresent(AtlasBaseException excp, List<String> messages) {
+        String msg = excp.getMessage();
+
+        if (messages != null && !messages.contains(msg)) {
+            messages.add(msg);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/047f31be/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
index 0badfcf..1ade5f7 100644
--- a/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
@@ -21,6 +21,7 @@ import java.util.*;
 
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.model.TimeBoundary;
 import org.apache.atlas.model.instance.AtlasClassification;
 import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
 import org.apache.atlas.model.typedef.AtlasClassificationDef;
@@ -39,9 +40,28 @@ public class TestAtlasClassificationType {
     {
         classificationType = getClassificationType(ModelTestUtil.getClassificationDefWithSuperTypes());
 
-        AtlasClassification invalidValue1 = classificationType.createDefaultValue();
-        AtlasClassification invalidValue2 = classificationType.createDefaultValue();
-        Map<String, Object> invalidValue3 = classificationType.createDefaultValue().getAttributes();
+        AtlasClassification invalidValue1   = classificationType.createDefaultValue();
+        AtlasClassification invalidValue2   = classificationType.createDefaultValue();
+        Map<String, Object> invalidValue3   = classificationType.createDefaultValue().getAttributes();
+        AtlasClassification validValueTB1   = classificationType.createDefaultValue();
+        AtlasClassification validValueTB2   = classificationType.createDefaultValue();
+        AtlasClassification validValueTB3   = classificationType.createDefaultValue();
+        AtlasClassification invalidValueTB1 = classificationType.createDefaultValue();
+        AtlasClassification invalidValueTB2 = classificationType.createDefaultValue();
+        AtlasClassification invalidValueTB3 = classificationType.createDefaultValue();
+        TimeBoundary        validTB1        = new TimeBoundary("2018/07/07 04:38:55");                        // valid start-time
+        TimeBoundary        validTB2        = new TimeBoundary(null, "2018/07/08 04:38:55");                  // valid end-time
+        TimeBoundary        validTB3        = new TimeBoundary("2018/07/07 04:38:55", "2018/07/08 04:38:55"); // valid start and end times
+        TimeBoundary        invalidTB1      = new TimeBoundary("2018-07-07 04:38:55");                        // invalid start-time
+        TimeBoundary        invalidTB2      = new TimeBoundary(null, "2018-07-08 04:38:55");                  // invalid end-time
+        TimeBoundary        invalidTB3      = new TimeBoundary("2018/07/08 04:38:55", "2018/07/07 04:38:55"); // invalid time-ranger
+
+        validValueTB1.addValityPeriod(validTB1);
+        validValueTB2.addValityPeriod(validTB2);
+        validValueTB3.addValityPeriod(validTB3);
+        invalidValueTB1.addValityPeriod(invalidTB1);
+        invalidValueTB2.addValityPeriod(invalidTB2);
+        invalidValueTB3.addValityPeriod(invalidTB3);
 
         // invalid value for int
         invalidValue1.setAttribute(ModelTestUtil.getDefaultAttributeName(AtlasBaseTypeDef.ATLAS_TYPE_INT), "xyz");
@@ -53,6 +73,9 @@ public class TestAtlasClassificationType {
         validValues.add(null);
         validValues.add(classificationType.createDefaultValue());
         validValues.add(classificationType.createDefaultValue().getAttributes()); // Map<String, Object>
+        validValues.add(validValueTB1);
+        validValues.add(validValueTB2);
+        validValues.add(validValueTB3);
         invalidValues.add(invalidValue1);
         invalidValues.add(invalidValue2);
         invalidValues.add(invalidValue3);
@@ -62,6 +85,9 @@ public class TestAtlasClassificationType {
         invalidValues.add(new HashSet());   // incorrect datatype
         invalidValues.add(new ArrayList()); // incorrect datatype
         invalidValues.add(new String[] {}); // incorrect datatype
+        invalidValues.add(invalidValueTB1);
+        invalidValues.add(invalidValueTB2);
+        invalidValues.add(invalidValueTB3);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/atlas/blob/047f31be/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 1741651..fbf2f9c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -583,6 +583,7 @@
         <commons-collections.version>3.2.2</commons-collections.version>
         <commons-logging.version>1.1.3</commons-logging.version>
         <commons-lang.version>2.6</commons-lang.version>
+        <commons-validator.version>1.4.0</commons-validator.version>
         <javax-inject.version>1</javax-inject.version>
         <jettison.version>1.3.7</jettison.version>
         <paranamer.version>2.7</paranamer.version>

http://git-wip-us.apache.org/repos/asf/atlas/blob/047f31be/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
index 5e33cf5..40593be 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
@@ -403,6 +403,7 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore {
         }
 
         GraphTransactionInterceptor.lockObjectAndReleasePostCommit(guid);
+
         for (AtlasClassification classification : classifications) {
             validateAndNormalize(classification);
         }
@@ -436,6 +437,10 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore {
 
         GraphTransactionInterceptor.lockObjectAndReleasePostCommit(guid);
 
+        for (AtlasClassification classification : classifications) {
+            validateAndNormalize(classification);
+        }
+
         entityGraphMapper.updateClassifications(new EntityMutationContext(), guid, classifications);
     }
 


[3/3] atlas git commit: ATLAS-2732: updated import-hive.sh/import-hbase.sh to handle kerberos security command-line arguments

Posted by ma...@apache.org.
ATLAS-2732: updated import-hive.sh/import-hbase.sh to handle kerberos security command-line arguments

Signed-off-by: Madhan Neethiraj <ma...@apache.org>
(cherry picked from commit f93da20b3fc8a4853c4c7d991cac375cb3a6ad6a)


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

Branch: refs/heads/branch-1.0
Commit: 32a87a3140d9af3b82906a0192265632966a6eab
Parents: 1e4b743
Author: rmani <rm...@hortonworks.com>
Authored: Sat Jun 2 13:48:59 2018 -0700
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Tue Jun 5 07:53:03 2018 -0700

----------------------------------------------------------------------
 addons/hbase-bridge/src/bin/import-hbase.sh | 26 +++++++++++++++++------
 addons/hive-bridge/src/bin/import-hive.sh   | 27 ++++++++++++++++++------
 2 files changed, 40 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/32a87a31/addons/hbase-bridge/src/bin/import-hbase.sh
----------------------------------------------------------------------
diff --git a/addons/hbase-bridge/src/bin/import-hbase.sh b/addons/hbase-bridge/src/bin/import-hbase.sh
index 0a5989f..d429ea2 100644
--- a/addons/hbase-bridge/src/bin/import-hbase.sh
+++ b/addons/hbase-bridge/src/bin/import-hbase.sh
@@ -35,8 +35,6 @@ BASEDIR=`cd ${BASEDIR}/..;pwd`
 
 echo ">>>>> $BASEDIR"
 
-allargs=$@
-
 if test -z "${JAVA_HOME}"
 then
     JAVA_BIN=`which java`
@@ -125,16 +123,32 @@ fi
 
 JAVA_PROPERTIES="$ATLAS_OPTS -Datlas.log.dir=$ATLAS_LOG_DIR -Datlas.log.file=import-hbase.log
 -Dlog4j.configuration=atlas-hbase-import-log4j.xml"
-shift
 
-while [[ ${1} =~ ^\-D ]]; do
-  JAVA_PROPERTIES="${JAVA_PROPERTIES} ${1}"
+IMPORT_ARGS=
+JVM_ARGS=
+
+while true
+do
+  option=$1
   shift
+
+  case "$option" in
+    -n) IMPORT_ARGS="$IMPORT_ARGS -n $1"; shift;;
+    -t) IMPORT_ARGS="$IMPORT_ARGS -t $1"; shift;;
+    -f) IMPORT_ARGS="$IMPORT_ARGS -f $1"; shift;;
+    --namespace) IMPORT_ARGS="$IMPORT_ARGS --namespace $1"; shift;;
+    --table) IMPORT_ARGS="$IMPORT_ARGS --table $1"; shift;;
+    --filename) IMPORT_ARGS="$IMPORT_ARGS --filename $1"; shift;;
+    "") break;;
+    *) JVM_ARGS="$JVM_ARGS $option"
+  esac
 done
 
+JAVA_PROPERTIES="${JAVA_PROPERTIES} ${JVM_ARGS}"
+
 echo "Log file for import is $LOGFILE"
 
-"${JAVA_BIN}" ${JAVA_PROPERTIES} -cp "${CP}" org.apache.atlas.hbase.bridge.HBaseBridge $allargs
+"${JAVA_BIN}" ${JAVA_PROPERTIES} -cp "${CP}" org.apache.atlas.hbase.bridge.HBaseBridge $IMPORT_ARGS
 
 RETVAL=$?
 [ $RETVAL -eq 0 ] && echo HBase Data Model imported successfully!!!

http://git-wip-us.apache.org/repos/asf/atlas/blob/32a87a31/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 98f4c84..49e6d70 100755
--- a/addons/hive-bridge/src/bin/import-hive.sh
+++ b/addons/hive-bridge/src/bin/import-hive.sh
@@ -12,7 +12,6 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License. See accompanying LICENSE file.
 #
-
 # resolve links - $0 may be a softlink
 PRG="${0}"
 
@@ -31,8 +30,6 @@ done
 BASEDIR=`dirname ${PRG}`
 BASEDIR=`cd ${BASEDIR}/..;pwd`
 
-allargs=$@
-
 if test -z "${JAVA_HOME}"
 then
     JAVA_BIN=`which java`
@@ -121,16 +118,32 @@ fi
 
 JAVA_PROPERTIES="$ATLAS_OPTS -Datlas.log.dir=$ATLAS_LOG_DIR -Datlas.log.file=import-hive.log
 -Dlog4j.configuration=atlas-hive-import-log4j.xml"
-shift
 
-while [[ ${1} =~ ^\-D ]]; do
-  JAVA_PROPERTIES="${JAVA_PROPERTIES} ${1}"
+IMPORT_ARGS=
+JVM_ARGS=
+
+while true
+do
+  option=$1
   shift
+
+  case "$option" in
+    -d) IMPORT_ARGS="$IMPORT_ARGS -d $1"; shift;;
+    -t) IMPORT_ARGS="$IMPORT_ARGS -t $1"; shift;;
+    -f) IMPORT_ARGS="$IMPORT_ARGS -f $1"; shift;;
+    --database) IMPORT_ARGS="$IMPORT_ARGS --database $1"; shift;;
+    --table) IMPORT_ARGS="$IMPORT_ARGS --table $1"; shift;;
+    --filename) IMPORT_ARGS="$IMPORT_ARGS --filename $1"; shift;;
+    "") break;;
+    *) JVM_ARGS="$JVM_ARGS $option"
+  esac
 done
 
+JAVA_PROPERTIES="${JAVA_PROPERTIES} ${JVM_ARGS}"
+
 echo "Log file for import is $LOGFILE"
 
-"${JAVA_BIN}" ${JAVA_PROPERTIES} -cp "${CP}" org.apache.atlas.hive.bridge.HiveMetaStoreBridge $allargs
+"${JAVA_BIN}" ${JAVA_PROPERTIES} -cp "${CP}" org.apache.atlas.hive.bridge.HiveMetaStoreBridge $IMPORT_ARGS
 
 RETVAL=$?
 [ $RETVAL -eq 0 ] && echo Hive Meta Data imported successfully!!!


[2/3] atlas git commit: ATLAS-2731: UI : attributes on table's detailsPage buffers forever due no access on that entity

Posted by ma...@apache.org.
ATLAS-2731: UI : attributes on table's detailsPage buffers forever due no access on that entity

Signed-off-by: Madhan Neethiraj <ma...@apache.org>
(cherry picked from commit b57420cd0f4af242caed81d8b69c2438794f1fd9)


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

Branch: refs/heads/branch-1.0
Commit: 1e4b743b296b569eff513e0aceec9a66375d7585
Parents: 047f31b
Author: Abhishek Kadam <ab...@gmail.com>
Authored: Tue Jun 5 18:42:02 2018 +0530
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Tue Jun 5 07:52:47 2018 -0700

----------------------------------------------------------------------
 .../public/js/utils/CommonViewFunction.js       | 27 ++++++++++++++------
 .../views/audit/CreateAuditTableLayoutView.js   |  2 +-
 .../views/entity/EntityDetailTableLayoutView.js |  2 +-
 3 files changed, 21 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/1e4b743b/dashboardv2/public/js/utils/CommonViewFunction.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/utils/CommonViewFunction.js b/dashboardv2/public/js/utils/CommonViewFunction.js
index b8e023a..3d39eb8 100644
--- a/dashboardv2/public/js/utils/CommonViewFunction.js
+++ b/dashboardv2/public/js/utils/CommonViewFunction.js
@@ -75,6 +75,7 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
         var scope = options.scope,
             valueObject = options.valueObject,
             extractJSON = options.extractJSON,
+            relationshipAttributes = options.relationshipAttributes,
             isTable = _.isUndefined(options.isTable) ? true : options.isTable,
             attributeDefs = options.attributeDefs;
 
@@ -104,11 +105,16 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
                             scope.$('td div[data-id="' + id + '"]').append(deleteButton);
                         }
                     },
+                    cust_error: function() {
+                        scope.$('td div[data-id="' + id + '"]').html('<div><span class="text-danger"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Not Authorized</span></div>');
+                    },
                     complete: function() {}
                 });
             },
-            extractObject = function(keyValue) {
-                var valueOfArray = [];
+            extractObject = function(opt) {
+                var valueOfArray = [],
+                    keyValue = opt.keyValue,
+                    key = opt.key;
                 if (!_.isArray(keyValue) && _.isObject(keyValue)) {
                     keyValue = [keyValue];
                 }
@@ -163,10 +169,15 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
                     if (id && inputOutputField) {
                         var name = Utils.getName(inputOutputField);
                         if ((name === "-" || name === id) && !inputOutputField.attributes) {
-                            var fetch = true;
-                            var fetchId = (_.isObject(id) ? id.id : id);
-                            fetchInputOutputValue(fetchId);
-                            tempLink += '<div data-id="' + fetchId + '"><div class="value-loader"></div></div>';
+                            var rAttrValue = relationshipAttributes && relationshipAttributes[key];
+                            if (!rAttrValue) {
+                                var fetch = true;
+                                var fetchId = (_.isObject(id) ? id.id : id);
+                                fetchInputOutputValue(fetchId);
+                                tempLink += '<div data-id="' + fetchId + '"><div class="value-loader"></div></div>';
+                            } else {
+                                tempLink += '<div data-id="' + rAttrValue.guid + '"><a href="#!/detailPage/' + rAttrValue.guid + '">' + Utils.getName(rAttrValue) + '</a></div>';
+                            }
                         } else {
                             tempLink += '<a href="#!/detailPage/' + id + '">' + name + '</a>'
                         }
@@ -205,11 +216,11 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
                 if (defEntityType === 'date') {
                     keyValue = new Date(keyValue);
                 } else if (_.isObject(keyValue)) {
-                    keyValue = extractObject(keyValue);
+                    keyValue = extractObject({ "keyValue": keyValue, "key": key });
                 }
             } else {
                 if (_.isObject(keyValue)) {
-                    keyValue = extractObject(keyValue)
+                    keyValue = extractObject({ "keyValue": keyValue, "key": key })
                 }
             }
             var val = "";

http://git-wip-us.apache.org/repos/asf/atlas/blob/1e4b743b/dashboardv2/public/js/views/audit/CreateAuditTableLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/audit/CreateAuditTableLayoutView.js b/dashboardv2/public/js/views/audit/CreateAuditTableLayoutView.js
index aa6f5f4..0d66235 100644
--- a/dashboardv2/public/js/views/audit/CreateAuditTableLayoutView.js
+++ b/dashboardv2/public/js/views/audit/CreateAuditTableLayoutView.js
@@ -87,7 +87,7 @@ define(['require',
                     this.ui.name.text(name);
                     if (parseDetailsObject) {
                         this.ui.auditHeaderValue.html('<th>Key</th><th>New Value</th>');
-                        table = CommonViewFunction.propertyTable({ scope: this, valueObject: parseDetailsObject, attributeDefs: this.attributeDefs });
+                        table = CommonViewFunction.propertyTable({ scope: this, valueObject: parseDetailsObject, relationshipAttributes: parseDetailsObject.relationshipAttributes, attributeDefs: this.attributeDefs });
                         if (table.length) {
                             this.ui.noData.hide();
                             this.ui.tableAudit.show();

http://git-wip-us.apache.org/repos/asf/atlas/blob/1e4b743b/dashboardv2/public/js/views/entity/EntityDetailTableLayoutView.js
----------------------------------------------------------------------
diff --git a/dashboardv2/public/js/views/entity/EntityDetailTableLayoutView.js b/dashboardv2/public/js/views/entity/EntityDetailTableLayoutView.js
index 28eb749..138e2cc 100644
--- a/dashboardv2/public/js/views/entity/EntityDetailTableLayoutView.js
+++ b/dashboardv2/public/js/views/entity/EntityDetailTableLayoutView.js
@@ -56,7 +56,7 @@ define(['require',
                 this.entityTableGenerate();
             },
             entityTableGenerate: function() {
-                var table = CommonViewFunction.propertyTable({ scope: this, valueObject: this.entity.attributes, attributeDefs: this.attributeDefs });
+                var table = CommonViewFunction.propertyTable({ scope: this, valueObject: this.entity.attributes, relationshipAttributes: this.entity.relationshipAttributes, attributeDefs: this.attributeDefs });
                 this.ui.detailValue.append(table);
             }
         });