This is an automated email from the ASF dual-hosted git repository.

madhan pushed a commit to branch RANGER-3923
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/RANGER-3923 by this push:
     new 5aecd131e RANGER-4471: generate trxLog for dataset, project, 
dataShare, sharedResource
5aecd131e is described below

commit 5aecd131e57a22d02c6e16cb283697d04e9e5dbf
Author: Madhan Neethiraj <mad...@apache.org>
AuthorDate: Tue Oct 10 14:08:50 2023 -0700

    RANGER-4471: generate trxLog for dataset, project, dataShare, sharedResource
---
 .../java/org/apache/ranger/biz/GdsDBStore.java     |  38 ++--
 .../ranger/service/RangerGdsBaseModelService.java  | 148 ++++++++++++++-
 .../RangerGdsDataShareInDatasetService.java        |  11 +-
 .../ranger/service/RangerGdsDataShareService.java  |  14 +-
 .../service/RangerGdsDatasetInProjectService.java  |  11 +-
 .../ranger/service/RangerGdsDatasetService.java    |   8 +-
 .../ranger/service/RangerGdsProjectService.java    |   8 +-
 .../service/RangerGdsSharedResourceService.java    |  15 +-
 .../main/webapp/react-webapp/src/utils/XAEnums.js  |  48 +++++
 .../src/views/AuditEvent/AdminLogs.jsx             |   6 +
 .../AdminLogs/DataShareInDatasetLogs.jsx           | 205 +++++++++++++++++++++
 .../views/AuditEvent/AdminLogs/DataShareLogs.jsx   | 205 +++++++++++++++++++++
 .../AuditEvent/AdminLogs/DatasetInProjectLogs.jsx  | 205 +++++++++++++++++++++
 .../src/views/AuditEvent/AdminLogs/DatasetLogs.jsx | 205 +++++++++++++++++++++
 .../src/views/AuditEvent/AdminLogs/ProjectLogs.jsx | 205 +++++++++++++++++++++
 .../AuditEvent/AdminLogs/SharedResourceLogs.jsx    | 205 +++++++++++++++++++++
 .../src/views/AuditEvent/OperationAdminModal.jsx   |  42 +++++
 17 files changed, 1552 insertions(+), 27 deletions(-)

diff --git a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
index 9feb978ef..4d2a9cc8f 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
@@ -195,7 +195,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDataset ret = datasetService.create(dataset);
 
-        datasetService.createObjectHistory(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
+        datasetService.onObjectChange(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
 
         updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATASET);
 
@@ -220,7 +220,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDataset ret = datasetService.update(dataset);
 
-        datasetService.createObjectHistory(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
+        datasetService.onObjectChange(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
 
         updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATASET);
 
@@ -252,7 +252,7 @@ public class GdsDBStore extends AbstractGdsStore {
             deleteDatasetPolicies(existing);
             datasetService.delete(existing);
 
-            datasetService.createObjectHistory(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
+            datasetService.onObjectChange(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
 
             updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATASET);
         }
@@ -486,7 +486,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerProject ret = projectService.create(project);
 
-        projectService.createObjectHistory(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
+        projectService.onObjectChange(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
 
         updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_PROJECT);
 
@@ -511,7 +511,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerProject ret = projectService.update(project);
 
-        projectService.createObjectHistory(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
+        projectService.onObjectChange(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
 
         updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_PROJECT);
 
@@ -538,7 +538,7 @@ public class GdsDBStore extends AbstractGdsStore {
             deleteProjectPolicies(existing);
             projectService.delete(existing);
 
-            projectService.createObjectHistory(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
+            projectService.onObjectChange(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
 
             updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_PROJECT);
         }
@@ -782,7 +782,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDataShare ret = dataShareService.create(dataShare);
 
-        dataShareService.createObjectHistory(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
+        dataShareService.onObjectChange(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
 
         updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATA_SHARE);
 
@@ -807,7 +807,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDataShare ret = dataShareService.update(dataShare);
 
-        dataShareService.createObjectHistory(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
+        dataShareService.onObjectChange(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
 
         updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATA_SHARE);
 
@@ -838,7 +838,7 @@ public class GdsDBStore extends AbstractGdsStore {
         if (existing != null) {
             dataShareService.delete(existing);
 
-            dataShareService.createObjectHistory(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
+            dataShareService.onObjectChange(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
 
             updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATA_SHARE);
         }
@@ -890,7 +890,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerSharedResource ret = sharedResourceService.create(resource);
 
-        sharedResourceService.createObjectHistory(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
+        sharedResourceService.onObjectChange(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
 
         LOG.debug("<== addSharedResource({}): ret={}", resource, ret);
 
@@ -913,7 +913,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerSharedResource ret = sharedResourceService.update(resource);
 
-        sharedResourceService.createObjectHistory(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
+        sharedResourceService.onObjectChange(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
 
         LOG.debug("<== updateSharedResource({}): ret={}", resource, ret);
 
@@ -938,7 +938,7 @@ public class GdsDBStore extends AbstractGdsStore {
         if (existing != null) {
             sharedResourceService.delete(existing);
 
-            sharedResourceService.createObjectHistory(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
+            sharedResourceService.onObjectChange(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
         }
 
         LOG.debug("<== removeSharedResource({})", sharedResourceId);
@@ -997,7 +997,7 @@ public class GdsDBStore extends AbstractGdsStore {
             }
 
             if (includeResource) {
-                sharedResources.add(sharedResource);;
+                sharedResources.add(sharedResource);
             }
         }
 
@@ -1039,7 +1039,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDataShareInDataset ret = 
dataShareInDatasetService.create(dataShareInDataset);
 
-        dataShareInDatasetService.createObjectHistory(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
+        dataShareInDatasetService.onObjectChange(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
 
         LOG.debug("<== addDataShareInDataset({}): ret={}", dataShareInDataset, 
ret);
 
@@ -1058,7 +1058,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDataShareInDataset ret = 
dataShareInDatasetService.update(dataShareInDataset);
 
-        dataShareInDatasetService.createObjectHistory(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
+        dataShareInDatasetService.onObjectChange(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
 
         LOG.debug("<== updateDataShareInDataset({}): ret={}", 
dataShareInDataset, ret);
 
@@ -1075,7 +1075,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         dataShareInDatasetService.delete(existing);
 
-        dataShareInDatasetService.createObjectHistory(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
+        dataShareInDatasetService.onObjectChange(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
 
         LOG.debug("<== removeDataShareInDataset({})", dataShareInDatasetId);
     }
@@ -1135,7 +1135,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDatasetInProject ret = 
datasetInProjectService.create(datasetInProject);
 
-        datasetInProjectService.createObjectHistory(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
+        datasetInProjectService.onObjectChange(ret, null, 
RangerServiceService.OPERATION_CREATE_CONTEXT);
 
         LOG.debug("<== addDatasetInProject({}): ret={}", datasetInProject, 
ret);
 
@@ -1154,7 +1154,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDatasetInProject ret = 
datasetInProjectService.update(datasetInProject);
 
-        datasetInProjectService.createObjectHistory(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
+        datasetInProjectService.onObjectChange(ret, existing, 
RangerServiceService.OPERATION_UPDATE_CONTEXT);
 
         LOG.debug("<== updateDatasetInProject({}): ret={}", datasetInProject, 
ret);
 
@@ -1171,7 +1171,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         datasetInProjectService.delete(existing);
 
-        datasetInProjectService.createObjectHistory(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
+        datasetInProjectService.onObjectChange(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
 
         LOG.debug("<== removeDatasetInProject({})", datasetInProjectId);
     }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsBaseModelService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsBaseModelService.java
index bee32c596..e7c54385f 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsBaseModelService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsBaseModelService.java
@@ -17,20 +17,48 @@
 
 package org.apache.ranger.service;
 
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ranger.biz.RangerBizUtil;
+import org.apache.ranger.common.view.VTrxLogAttr;
 import org.apache.ranger.entity.XXDBBase;
+import org.apache.ranger.entity.XXTrxLog;
 import org.apache.ranger.plugin.model.RangerGds.GdsShareStatus;
 import org.apache.ranger.plugin.model.RangerGds.RangerGdsBaseModelObject;
+import org.apache.ranger.plugin.util.JsonUtilsV2;
 import org.apache.ranger.view.VXMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.io.Serializable;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 public abstract class RangerGdsBaseModelService<T extends XXDBBase, V extends 
RangerGdsBaseModelObject> extends RangerBaseModelService<T, V> {
+    private static final Logger LOG = 
LoggerFactory.getLogger(RangerGdsBaseModelService.class);
+
     @Autowired
     RangerDataHistService dataHistService;
 
-    public void createObjectHistory(V current, V former, int action) {
+    @Autowired
+    RangerBizUtil bizUtil;
+
+    protected final Map<String, VTrxLogAttr> trxLogAttrs = new HashMap<>();
+    private   final int                      classType;
+
+    protected RangerGdsBaseModelService(int classType) {
+        this.classType = classType;
+
+        trxLogAttrs.put("description",    new VTrxLogAttr("description", 
"Description", false));
+        trxLogAttrs.put("options",        new VTrxLogAttr("options", 
"Options", false));
+        trxLogAttrs.put("additionalInfo", new VTrxLogAttr("additionalInfo", 
"Additional info", false));
+    }
+
+    public void onObjectChange(V current, V former, int action) {
         switch (action) {
             case RangerServiceService.OPERATION_CREATE_CONTEXT:
                 dataHistService.createObjectDataHistory(current, 
RangerDataHistService.ACTION_CREATE);
@@ -41,9 +69,17 @@ public abstract class RangerGdsBaseModelService<T extends 
XXDBBase, V extends Ra
             break;
 
             case RangerServiceService.OPERATION_DELETE_CONTEXT:
-                dataHistService.createObjectDataHistory(current == null ? 
former : current, RangerDataHistService.ACTION_DELETE);
+                if (current == null) {
+                    current = former;
+                }
+
+                dataHistService.createObjectDataHistory(current, 
RangerDataHistService.ACTION_DELETE);
             break;
         }
+
+        if (current != null && (former != null || action != 
OPERATION_UPDATE_CONTEXT) && action != 0) {
+            createTransactionLog(current, former, action);
+        }
     }
 
     public static List<VXMessage> getOrCreateMessageList(List<VXMessage> 
msgList) {
@@ -67,4 +103,112 @@ public abstract class RangerGdsBaseModelService<T extends 
XXDBBase, V extends Ra
 
         return ret;
     }
+
+    private void createTransactionLog(V obj, V oldObj, int action) {
+        List<XXTrxLog> trxLogs = new ArrayList<>();
+        String         objName = getObjectName(obj);
+
+        for (Field field : obj.getClass().getDeclaredFields()) {
+            if (!trxLogAttrs.containsKey(field.getName())) {
+                continue;
+            }
+
+            XXTrxLog xTrxLog = processFieldToCreateTrxLog(field, objName, obj, 
oldObj, action);
+
+            if (xTrxLog != null) {
+                trxLogs.add(xTrxLog);
+            }
+        }
+
+        for (Field field : obj.getClass().getSuperclass().getDeclaredFields()) 
{
+            if (!trxLogAttrs.containsKey(field.getName())) {
+                continue;
+            }
+
+            XXTrxLog xTrx = processFieldToCreateTrxLog(field, objName, obj, 
oldObj, action);
+
+            if (xTrx != null) {
+                trxLogs.add(xTrx);
+            }
+        }
+
+        bizUtil.createTrxLog(trxLogs);
+    }
+
+    private String getObjectName(V obj) {
+        try {
+            Field nameField = obj.getClass().getDeclaredField("name");
+
+            nameField.setAccessible(true);
+
+            return Objects.toString(nameField.get(obj));
+        } catch (NoSuchFieldException | IllegalAccessException excp) {
+            // ignore
+            return null;
+        }
+    }
+
+    private XXTrxLog processFieldToCreateTrxLog(Field field, String objName, V 
obj, V oldObj, int action) {
+        field.setAccessible(true);
+
+        String actionString = "";
+        String attrName     = null;
+        String prevValue    = null;
+        String newValue     = null;
+        String fieldName    = field.getName();
+
+        try {
+            VTrxLogAttr vTrxLogAttr = trxLogAttrs.get(fieldName);
+            String      value       = toString(field.get(obj));
+
+            attrName = vTrxLogAttr.getAttribUserFriendlyName();
+
+            if (action == OPERATION_CREATE_CONTEXT) {
+                actionString = "create";
+
+                if (StringUtils.isNotBlank(value)) {
+                    newValue = value;
+                }
+            } else if (action == OPERATION_DELETE_CONTEXT) {
+                actionString = "delete";
+                prevValue    = value;
+            } else if (action == OPERATION_UPDATE_CONTEXT) {
+                actionString = "update";
+                prevValue    = toString(field.get(oldObj));
+                newValue     = value;
+            }
+        } catch (IllegalArgumentException | IllegalAccessException e) {
+            LOG.error("Process field to create trx log failure.", e);
+        }
+
+        XXTrxLog ret = null;
+
+        if (!StringUtils.equals(prevValue, newValue)) {
+            ret = new XXTrxLog();
+
+            ret.setAction(actionString);
+            ret.setAttributeName(attrName);
+            ret.setPreviousValue(prevValue);
+            ret.setNewValue(newValue);
+            ret.setObjectClassType(classType);
+            ret.setObjectId(obj.getId());
+            ret.setObjectName(objName);
+        }
+
+        return ret;
+    }
+
+    private String toString(Object obj) {
+        if (obj instanceof String) {
+            return (String) obj;
+        } else if (obj instanceof Serializable) {
+            try {
+                return JsonUtilsV2.objToJson((Serializable) obj);
+            } catch (Exception excp) {
+                // ignore
+            }
+        }
+
+        return Objects.toString(obj);
+    }
 }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
index 4a6963fa4..569509d66 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
@@ -21,10 +21,12 @@ package org.apache.ranger.service;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.authorization.utils.JsonUtils;
+import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.GUIDUtil;
 import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.view.VTrxLogAttr;
 import org.apache.ranger.db.XXPortalUserDao;
 import org.apache.ranger.entity.XXGdsDataShare;
 import org.apache.ranger.entity.XXGdsDataShareInDataset;
@@ -57,7 +59,7 @@ public class RangerGdsDataShareInDatasetService extends 
RangerGdsBaseModelServic
     XXPortalUserDao xxPortalUserDao;
 
     public RangerGdsDataShareInDatasetService() {
-        super();
+        super(AppConstants.CLASS_TYPE_GDS_DATA_SHARE_IN_DATASET);
 
         searchFields.add(new 
SearchField(SearchFilter.DATA_SHARE_IN_DATASET_ID, "obj.id",          
SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
         searchFields.add(new SearchField(SearchFilter.GUID      ,              
 "obj.guid",        SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.FULL));
@@ -70,6 +72,13 @@ public class RangerGdsDataShareInDatasetService extends 
RangerGdsBaseModelServic
         sortFields.add(new SortField(SearchFilter.CREATE_TIME,              
"obj.createTime"));
         sortFields.add(new SortField(SearchFilter.UPDATE_TIME,              
"obj.updateTime"));
         sortFields.add(new SortField(SearchFilter.DATA_SHARE_IN_DATASET_ID, 
"obj.id", true, SortField.SORT_ORDER.ASC));
+
+        trxLogAttrs.put("dataShareId",      new VTrxLogAttr("dataShareId", 
"DataShare ID", false));
+        trxLogAttrs.put("datasetId",        new VTrxLogAttr("datasetId", 
"Dataset ID", false));
+        trxLogAttrs.put("status",           new VTrxLogAttr("status", 
"Status", true));
+        trxLogAttrs.put("validitySchedule", new 
VTrxLogAttr("validitySchedule", "Validity Schedule", false));
+        trxLogAttrs.put("profiles",         new VTrxLogAttr("profiles", 
"Profiles", false));
+        trxLogAttrs.put("approver",         new VTrxLogAttr("approver", 
"Approver", false));
     }
 
     @Override
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareService.java
index 36897c111..6a93e44dc 100755
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareService.java
@@ -21,10 +21,12 @@ package org.apache.ranger.service;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.authorization.utils.JsonUtils;
+import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.GUIDUtil;
 import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.view.VTrxLogAttr;
 import org.apache.ranger.entity.XXGdsDataShare;
 import org.apache.ranger.entity.XXSecurityZone;
 import org.apache.ranger.entity.XXService;
@@ -53,7 +55,7 @@ public class RangerGdsDataShareService extends 
RangerGdsBaseModelService<XXGdsDa
     GUIDUtil guidUtil;
 
     public RangerGdsDataShareService() {
-        super();
+        super(AppConstants.CLASS_TYPE_GDS_DATA_SHARE);
 
         searchFields.add(new SearchField(SearchFilter.DATA_SHARE_NAME,         
  "obj.name",        SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.FULL));
         searchFields.add(new SearchField(SearchFilter.DATA_SHARE_NAME_PARTIAL, 
  "obj.name",        SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.PARTIAL));
@@ -77,6 +79,16 @@ public class RangerGdsDataShareService extends 
RangerGdsBaseModelService<XXGdsDa
         sortFields.add(new SortField(SearchFilter.UPDATE_TIME,  
"obj.updateTime"));
         sortFields.add(new SortField(SearchFilter.DATA_SHARE_ID,   "obj.id", 
true, SortField.SORT_ORDER.ASC));
         sortFields.add(new SortField(SearchFilter.DATA_SHARE_NAME, 
"obj.name"));
+
+
+        trxLogAttrs.put("name",               new VTrxLogAttr("name", "Name", 
false));
+        trxLogAttrs.put("acl",                new VTrxLogAttr("acl", "ACL", 
false));
+        trxLogAttrs.put("service",            new VTrxLogAttr("service", 
"Service name", false));
+        trxLogAttrs.put("zone",               new VTrxLogAttr("zone", "Zone 
name", false));
+        trxLogAttrs.put("conditionExpr",      new VTrxLogAttr("conditionExpr", 
"Condition expression", false));
+        trxLogAttrs.put("defaultAccessTypes", new 
VTrxLogAttr("defaultAccessTypes", "Default access types", false));
+        trxLogAttrs.put("defaultTagMasks",    new 
VTrxLogAttr("defaultTagMasks", "Default tag masks", false));
+        trxLogAttrs.put("termsOfUse",         new VTrxLogAttr("termsOfUse", 
"Terms of use", false));
     }
 
     @Override
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetInProjectService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetInProjectService.java
index 5954183b7..d62040175 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetInProjectService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetInProjectService.java
@@ -21,10 +21,12 @@ package org.apache.ranger.service;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.authorization.utils.JsonUtils;
+import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.GUIDUtil;
 import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.view.VTrxLogAttr;
 import org.apache.ranger.db.XXPortalUserDao;
 import org.apache.ranger.entity.XXGdsProject;
 import org.apache.ranger.entity.XXGdsDatasetInProject;
@@ -57,7 +59,7 @@ public class RangerGdsDatasetInProjectService extends 
RangerGdsBaseModelService<
     XXPortalUserDao xxPortalUserDao;
 
     public RangerGdsDatasetInProjectService() {
-        super();
+        super(AppConstants.CLASS_TYPE_GDS_DATASET_IN_PROJECT);
 
         searchFields.add(new SearchField(SearchFilter.DATASET_IN_PROJECT_ID, 
"obj.id",        SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
         searchFields.add(new SearchField(SearchFilter.GUID      ,            
"obj.guid",      SearchField.DATA_TYPE.STRING,  SearchField.SEARCH_TYPE.FULL));
@@ -70,6 +72,13 @@ public class RangerGdsDatasetInProjectService extends 
RangerGdsBaseModelService<
         sortFields.add(new SortField(SearchFilter.CREATE_TIME,           
"obj.createTime"));
         sortFields.add(new SortField(SearchFilter.UPDATE_TIME,           
"obj.updateTime"));
         sortFields.add(new SortField(SearchFilter.DATASET_IN_PROJECT_ID, 
"obj.id", true, SortField.SORT_ORDER.ASC));
+
+        trxLogAttrs.put("datasetId",        new VTrxLogAttr("datasetId", 
"Dataset ID", false));
+        trxLogAttrs.put("projectId",        new VTrxLogAttr("projectId", 
"Project ID", false));
+        trxLogAttrs.put("status",           new VTrxLogAttr("status", 
"Status", true));
+        trxLogAttrs.put("validitySchedule", new 
VTrxLogAttr("validitySchedule", "Validity Schedule", false));
+        trxLogAttrs.put("profiles",         new VTrxLogAttr("profiles", 
"Profiles", false));
+        trxLogAttrs.put("approver",         new VTrxLogAttr("approver", 
"Approver", false));
     }
 
     @Override
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java
index d5e2e52bd..072889f1d 100755
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java
@@ -21,10 +21,12 @@ package org.apache.ranger.service;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.authorization.utils.JsonUtils;
+import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.GUIDUtil;
 import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.view.VTrxLogAttr;
 import org.apache.ranger.entity.*;
 import org.apache.ranger.plugin.model.RangerGds;
 import org.apache.ranger.plugin.model.RangerGds.RangerDataset;
@@ -49,7 +51,7 @@ public class RangerGdsDatasetService extends 
RangerGdsBaseModelService<XXGdsData
     GUIDUtil guidUtil;
 
     public RangerGdsDatasetService() {
-        super();
+        super(AppConstants.CLASS_TYPE_GDS_DATASET);
 
         searchFields.add(new SearchField(SearchFilter.DATASET_NAME,            
  "obj.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.FULL));
         searchFields.add(new SearchField(SearchFilter.DATASET_NAME_PARTIAL,    
  "obj.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.PARTIAL));
@@ -77,6 +79,10 @@ public class RangerGdsDatasetService extends 
RangerGdsBaseModelService<XXGdsData
         sortFields.add(new SortField(SearchFilter.UPDATE_TIME,  
"obj.updateTime"));
         sortFields.add(new SortField(SearchFilter.DATASET_ID,   "obj.id", 
true, SortField.SORT_ORDER.ASC));
         sortFields.add(new SortField(SearchFilter.DATASET_NAME, "obj.name"));
+
+        trxLogAttrs.put("name",       new VTrxLogAttr("name", "Name", false));
+        trxLogAttrs.put("acl",        new VTrxLogAttr("acl", "ACL", false));
+        trxLogAttrs.put("termsOfUse", new VTrxLogAttr("termsOfUse", "Terms of 
use", false));
     }
 
     @Override
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsProjectService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsProjectService.java
index f800c90b0..4ccb063fe 100755
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsProjectService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsProjectService.java
@@ -21,10 +21,12 @@ package org.apache.ranger.service;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.authorization.utils.JsonUtils;
+import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.GUIDUtil;
 import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.view.VTrxLogAttr;
 import org.apache.ranger.entity.XXGdsProject;
 import org.apache.ranger.plugin.model.RangerGds;
 import org.apache.ranger.plugin.model.RangerGds.RangerProject;
@@ -49,7 +51,7 @@ public class RangerGdsProjectService extends 
RangerGdsBaseModelService<XXGdsProj
     GUIDUtil guidUtil;
 
     public RangerGdsProjectService() {
-        super();
+        super(AppConstants.CLASS_TYPE_GDS_PROJECT);
 
         searchFields.add(new SearchField(SearchFilter.PROJECT_NAME,            
"obj.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.FULL));
         searchFields.add(new SearchField(SearchFilter.PROJECT_NAME_PARTIAL,    
"obj.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.PARTIAL));
@@ -73,6 +75,10 @@ public class RangerGdsProjectService extends 
RangerGdsBaseModelService<XXGdsProj
         sortFields.add(new SortField(SearchFilter.UPDATE_TIME,  
"obj.updateTime"));
         sortFields.add(new SortField(SearchFilter.PROJECT_ID,   "obj.id", 
true, SortField.SORT_ORDER.ASC));
         sortFields.add(new SortField(SearchFilter.PROJECT_NAME, "obj.name"));
+
+        trxLogAttrs.put("name",       new VTrxLogAttr("name", "Name", false));
+        trxLogAttrs.put("acl",        new VTrxLogAttr("acl", "ACL", false));
+        trxLogAttrs.put("termsOfUse", new VTrxLogAttr("termsOfUse", "Terms of 
use", false));
     }
 
     @Override
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsSharedResourceService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsSharedResourceService.java
index 0a11d4f1d..2d2830c07 100755
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsSharedResourceService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsSharedResourceService.java
@@ -22,9 +22,11 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.authorization.utils.JsonUtils;
 import org.apache.ranger.common.GUIDUtil;
+import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.view.VTrxLogAttr;
 import org.apache.ranger.entity.XXGdsDataShare;
 import org.apache.ranger.entity.XXGdsSharedResource;
 import org.apache.ranger.plugin.model.RangerGds.RangerSharedResource;
@@ -52,7 +54,7 @@ public class RangerGdsSharedResourceService extends 
RangerGdsBaseModelService<XX
     GUIDUtil guidUtil;
 
     public RangerGdsSharedResourceService() {
-        super();
+        super(AppConstants.CLASS_TYPE_GDS_SHARED_RESOURCE);
 
         searchFields.add(new SearchField(SearchFilter.SHARED_RESOURCE_NAME, 
"obj.name",        SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.FULL));
         searchFields.add(new SearchField(SearchFilter.SHARED_RESOURCE_ID,   
"obj.id",          SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
@@ -75,6 +77,17 @@ public class RangerGdsSharedResourceService extends 
RangerGdsBaseModelService<XX
         sortFields.add(new SortField(SearchFilter.UPDATE_TIME,  
"obj.updateTime"));
         sortFields.add(new SortField(SearchFilter.SHARED_RESOURCE_ID,   
"obj.id", true, SortField.SORT_ORDER.ASC));
         sortFields.add(new SortField(SearchFilter.SHARED_RESOURCE_NAME, 
"obj.name"));
+
+        trxLogAttrs.put("name",             new VTrxLogAttr("name", "Name", 
false));
+        trxLogAttrs.put("dataShareId",      new VTrxLogAttr("dataShareId", 
"DataShare ID", false));
+        trxLogAttrs.put("resource",         new VTrxLogAttr("resource", 
"Resource", false));
+        trxLogAttrs.put("subResource",      new VTrxLogAttr("subResource", 
"Subresource", false));
+        trxLogAttrs.put("subResourceType",  new VTrxLogAttr("subResourceType", 
"Subresource Type", false));
+        trxLogAttrs.put("conditionExpr",    new VTrxLogAttr("conditionExpr", 
"Condition expression", false));
+        trxLogAttrs.put("accessTypes",      new VTrxLogAttr("accessTypes", 
"Access types", false));
+        trxLogAttrs.put("rowFilter",        new VTrxLogAttr("rowFilter", "Row 
filter", false));
+        trxLogAttrs.put("subResourceMasks", new 
VTrxLogAttr("subResourceMasks", "Subresource Masks", false));
+        trxLogAttrs.put("profiles",         new VTrxLogAttr("profiles", 
"Profiles", false));
     }
 
     @Override
diff --git a/security-admin/src/main/webapp/react-webapp/src/utils/XAEnums.js 
b/security-admin/src/main/webapp/react-webapp/src/utils/XAEnums.js
index 3313e538c..e8463ab3b 100755
--- a/security-admin/src/main/webapp/react-webapp/src/utils/XAEnums.js
+++ b/security-admin/src/main/webapp/react-webapp/src/utils/XAEnums.js
@@ -360,6 +360,54 @@ export const ClassTypes = {
     modelName: "VXRole",
     type: "vXRole",
     tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_ROLE"
+  },
+  CLASS_TYPE_RANGER_DATASET: {
+    value: 1062,
+    label: "Ranger Dataset",
+    rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_DATASET",
+    modelName: "RangerDataset",
+    type: "vDataset",
+    tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_DATASET"
+  },
+  CLASS_TYPE_RANGER_PROJECT: {
+    value: 1063,
+    label: "Ranger Project",
+    rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_PROJECT",
+    modelName: "RangerProject",
+    type: "vProject",
+    tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_PROJECT"
+  },
+  CLASS_TYPE_RANGER_DATA_SHARE: {
+    value: 1064,
+    label: "Ranger Data Share",
+    rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE",
+    modelName: "RangerDataShare",
+    type: "vDataShare",
+    tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_DATA_SHARE"
+  },
+  CLASS_TYPE_RANGER_SHARED_RESOURCE: {
+    value: 1065,
+    label: "Ranger Shared Resource",
+    rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE",
+    modelName: "RangerSharedResource",
+    type: "vSharedResource",
+    tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_SHARED_RESOURCE"
+  },
+  CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET: {
+    value: 1066,
+    label: "Ranger DataShare in Dataset",
+    rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET",
+    modelName: "RangerDataShareInDataset",
+    type: "vDataShareInDataset",
+    tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET"
+  },
+  CLASS_TYPE_RANGER_DATASET_IN_PROJECT: {
+    value: 1067,
+    label: "Ranger Dataset in Project",
+    rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT",
+    modelName: "RangerDatasetInProject",
+    type: "vDatasetInProject",
+    tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_DATASET_IN_PROJECT"
   }
 };
 
diff --git 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs.jsx
 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs.jsx
index 6575dae24..a59d09fb6 100644
--- 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs.jsx
+++ 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs.jsx
@@ -398,6 +398,12 @@ function Admin() {
           { value: "1056", label: "Ranger Security Zone" },
           { value: "1030", label: "Ranger Service" },
           { value: "1003", label: "Ranger User" },
+          { value: "1062", label: "Ranger Dataset" },
+          { value: "1063", label: "Ranger Project" },
+          { value: "1064", label: "Ranger Data Share" },
+          { value: "1065", label: "Ranger Shared Resource" },
+          { value: "1066", label: "Ranger Data Share in Dataset" },
+          { value: "1067", label: "Ranger Dataset in Project" },
           { value: "2", label: "User Profile" }
         ];
       }
diff --git 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareInDatasetLogs.jsx
 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareInDatasetLogs.jsx
new file mode 100644
index 000000000..61d7bcbf9
--- /dev/null
+++ 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareInDatasetLogs.jsx
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+import { Table, Badge } from "react-bootstrap";
+import dateFormat from "dateformat";
+import { ClassTypes } from "../../../utils/XAEnums";
+import { isEmpty } from "lodash";
+
+export const DataShareInDatasetLogs = ({ data, reportdata }) => {
+  const { objectName, objectClassType, createDate, owner, action } = data;
+
+  const updateDataShareInDatasetOldNew = (userDetails) => {
+    var tablerow = [];
+
+    const getfilteredoldval = (oldvals) => {
+      return !isEmpty(oldvals) ? oldvals : "--";
+    };
+
+    const getfilterednewval = (newvals) => {
+      return !isEmpty(newvals) ? newvals : "--";
+    };
+
+    userDetails.map((val) => {
+      return tablerow.push(
+        <>
+          <tr key={val.id}>
+            <td className="table-warning">{val.attributeName}</td>
+            {val && val.previousValue && !isEmpty(val.previousValue) ? (
+              <td className="table-warning">
+                {val && val.previousValue && !isEmpty(val.previousValue) ? (
+                  isEmpty(val.newValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="danger">
+                        {getfilteredoldval(val.previousValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilteredoldval(val.previousValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+            {val && val.newValue && !isEmpty(val.newValue) ? (
+              <td className="table-warning">
+                {val && val.newValue && !isEmpty(val.newValue) ? (
+                  isEmpty(val.previousValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="success">
+                        {getfilterednewval(val.newValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilterednewval(val.newValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+          </tr>
+        </>
+      );
+    });
+
+    return tablerow;
+  };
+  return (
+    <div>
+      {/* CREATE  */}
+      {action == "create" &&
+        objectClassType == 
ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+              India Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner}</div>
+            <h5 className="bold wrap-header m-t-sm">DataShareInDataset 
Detail:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              {reportdata.map((dataShareInDataset) => {
+                return (
+                  <tbody>
+                    <tr key={dataShareInDataset.id}>
+                      <td 
className="table-warning">{dataShareInDataset.attributeName}</td>
+
+                      <td className="table-warning">
+                        {!isEmpty(dataShareInDataset.newValue) ? 
dataShareInDataset.newValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+
+      {/* UPDATE */}
+
+      {action == "update" &&
+        objectClassType == 
ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET.value && (
+          <div>
+            <div className="row">
+              <div className="col-md-6">
+                <div className="font-weight-bolder">Name: {objectName}</div>
+                <div className="font-weight-bolder">
+                  Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+                  India Standard Time
+                </div>
+                <div className="font-weight-bolder">Updated By: {owner}</div>
+              </div>
+              <div className="col-md-6 text-right">
+                <div className="bg-success legend"></div> {" Added "}
+                <div className="bg-danger legend"></div> {" Deleted "}
+              </div>
+            </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">DataShareInDataset 
Detail:</h5>
+
+            <Table className="table  table-bordered table-striped w-75 ">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              <tbody>{updateDataShareInDatasetOldNew(reportdata)}</tbody>
+            </Table>
+          </div>
+        )}
+      {/* DELETE  */}
+      {action == "delete" &&
+        objectClassType == 
ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India
+              Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner} </div>
+            <div className="font-weight-bolder">Deleted By: {owner} </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">DataShareInDataset 
Details:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                </tr>
+              </thead>
+              {reportdata.map((dataShareInDataset) => {
+                return (
+                  <tbody>
+                    <tr>
+                      <td 
className="table-warning">{dataShareInDataset.attributeName}</td>
+                      <td className="table-warning">
+                        {!isEmpty(dataShareInDataset.previousValue) ? 
dataShareInDataset.previousValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+    </div>
+  );
+};
+
+export default DataShareInDatasetLogs;
diff --git 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareLogs.jsx
 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareLogs.jsx
new file mode 100644
index 000000000..b35c0f4bf
--- /dev/null
+++ 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareLogs.jsx
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+import { Table, Badge } from "react-bootstrap";
+import dateFormat from "dateformat";
+import { ClassTypes } from "../../../utils/XAEnums";
+import { isEmpty } from "lodash";
+
+export const DataShareLogs = ({ data, reportdata }) => {
+  const { objectName, objectClassType, createDate, owner, action } = data;
+
+  const updateDataShareOldNew = (userDetails) => {
+    var tablerow = [];
+
+    const getfilteredoldval = (oldvals) => {
+      return !isEmpty(oldvals) ? oldvals : "--";
+    };
+
+    const getfilterednewval = (newvals) => {
+      return !isEmpty(newvals) ? newvals : "--";
+    };
+
+    userDetails.map((val) => {
+      return tablerow.push(
+        <>
+          <tr key={val.id}>
+            <td className="table-warning">{val.attributeName}</td>
+            {val && val.previousValue && !isEmpty(val.previousValue) ? (
+              <td className="table-warning">
+                {val && val.previousValue && !isEmpty(val.previousValue) ? (
+                  isEmpty(val.newValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="danger">
+                        {getfilteredoldval(val.previousValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilteredoldval(val.previousValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+            {val && val.newValue && !isEmpty(val.newValue) ? (
+              <td className="table-warning">
+                {val && val.newValue && !isEmpty(val.newValue) ? (
+                  isEmpty(val.previousValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="success">
+                        {getfilterednewval(val.newValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilterednewval(val.newValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+          </tr>
+        </>
+      );
+    });
+
+    return tablerow;
+  };
+  return (
+    <div>
+      {/* CREATE  */}
+      {action == "create" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+              India Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner}</div>
+            <h5 className="bold wrap-header m-t-sm">DataShare Detail:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              {reportdata.map((dataShare) => {
+                return (
+                  <tbody>
+                    <tr key={dataShare.id}>
+                      <td 
className="table-warning">{dataShare.attributeName}</td>
+
+                      <td className="table-warning">
+                        {!isEmpty(dataShare.newValue) ? dataShare.newValue : 
"--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+
+      {/* UPDATE */}
+
+      {action == "update" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE.value && (
+          <div>
+            <div className="row">
+              <div className="col-md-6">
+                <div className="font-weight-bolder">Name: {objectName}</div>
+                <div className="font-weight-bolder">
+                  Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+                  India Standard Time
+                </div>
+                <div className="font-weight-bolder">Updated By: {owner}</div>
+              </div>
+              <div className="col-md-6 text-right">
+                <div className="bg-success legend"></div> {" Added "}
+                <div className="bg-danger legend"></div> {" Deleted "}
+              </div>
+            </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">DataShare Detail:</h5>
+
+            <Table className="table  table-bordered table-striped w-75 ">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              <tbody>{updateDataShareOldNew(reportdata)}</tbody>
+            </Table>
+          </div>
+        )}
+      {/* DELETE  */}
+      {action == "delete" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India
+              Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner} </div>
+            <div className="font-weight-bolder">Deleted By: {owner} </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">DataShare Details:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                </tr>
+              </thead>
+              {reportdata.map((dataShare) => {
+                return (
+                  <tbody>
+                    <tr>
+                      <td 
className="table-warning">{dataShare.attributeName}</td>
+                      <td className="table-warning">
+                        {!isEmpty(dataShare.previousValue) ? 
dataShare.previousValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+    </div>
+  );
+};
+
+export default DataShareLogs;
diff --git 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetInProjectLogs.jsx
 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetInProjectLogs.jsx
new file mode 100644
index 000000000..5714ece8d
--- /dev/null
+++ 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetInProjectLogs.jsx
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+import { Table, Badge } from "react-bootstrap";
+import dateFormat from "dateformat";
+import { ClassTypes } from "../../../utils/XAEnums";
+import { isEmpty } from "lodash";
+
+export const DatasetInProjectLogs = ({ data, reportdata }) => {
+  const { objectName, objectClassType, createDate, owner, action } = data;
+
+  const updateDatasetInProjectOldNew = (userDetails) => {
+    var tablerow = [];
+
+    const getfilteredoldval = (oldvals) => {
+      return !isEmpty(oldvals) ? oldvals : "--";
+    };
+
+    const getfilterednewval = (newvals) => {
+      return !isEmpty(newvals) ? newvals : "--";
+    };
+
+    userDetails.map((val) => {
+      return tablerow.push(
+        <>
+          <tr key={val.id}>
+            <td className="table-warning">{val.attributeName}</td>
+            {val && val.previousValue && !isEmpty(val.previousValue) ? (
+              <td className="table-warning">
+                {val && val.previousValue && !isEmpty(val.previousValue) ? (
+                  isEmpty(val.newValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="danger">
+                        {getfilteredoldval(val.previousValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilteredoldval(val.previousValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+            {val && val.newValue && !isEmpty(val.newValue) ? (
+              <td className="table-warning">
+                {val && val.newValue && !isEmpty(val.newValue) ? (
+                  isEmpty(val.previousValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="success">
+                        {getfilterednewval(val.newValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilterednewval(val.newValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+          </tr>
+        </>
+      );
+    });
+
+    return tablerow;
+  };
+  return (
+    <div>
+      {/* CREATE  */}
+      {action == "create" &&
+        objectClassType == 
ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+              India Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner}</div>
+            <h5 className="bold wrap-header m-t-sm">DatasetInProject 
Detail:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              {reportdata.map((datasetInProject) => {
+                return (
+                  <tbody>
+                    <tr key={datasetInProject.id}>
+                      <td 
className="table-warning">{datasetInProject.attributeName}</td>
+
+                      <td className="table-warning">
+                        {!isEmpty(datasetInProject.newValue) ? 
datasetInProject.newValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+
+      {/* UPDATE */}
+
+      {action == "update" &&
+        objectClassType == 
ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT.value && (
+          <div>
+            <div className="row">
+              <div className="col-md-6">
+                <div className="font-weight-bolder">Name: {objectName}</div>
+                <div className="font-weight-bolder">
+                  Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+                  India Standard Time
+                </div>
+                <div className="font-weight-bolder">Updated By: {owner}</div>
+              </div>
+              <div className="col-md-6 text-right">
+                <div className="bg-success legend"></div> {" Added "}
+                <div className="bg-danger legend"></div> {" Deleted "}
+              </div>
+            </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">DatasetInProject 
Detail:</h5>
+
+            <Table className="table  table-bordered table-striped w-75 ">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              <tbody>{updateDatasetInProjectOldNew(reportdata)}</tbody>
+            </Table>
+          </div>
+        )}
+      {/* DELETE  */}
+      {action == "delete" &&
+        objectClassType == 
ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India
+              Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner} </div>
+            <div className="font-weight-bolder">Deleted By: {owner} </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">DatasetInProject 
Details:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                </tr>
+              </thead>
+              {reportdata.map((datasetInProject) => {
+                return (
+                  <tbody>
+                    <tr>
+                      <td 
className="table-warning">{datasetInProject.attributeName}</td>
+                      <td className="table-warning">
+                        {!isEmpty(datasetInProject.previousValue) ? 
datasetInProject.previousValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+    </div>
+  );
+};
+
+export default DatasetInProjectLogs;
diff --git 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetLogs.jsx
 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetLogs.jsx
new file mode 100644
index 000000000..3194f728a
--- /dev/null
+++ 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetLogs.jsx
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+import { Table, Badge } from "react-bootstrap";
+import dateFormat from "dateformat";
+import { ClassTypes } from "../../../utils/XAEnums";
+import { isEmpty } from "lodash";
+
+export const DatasetLogs = ({ data, reportdata }) => {
+  const { objectName, objectClassType, createDate, owner, action } = data;
+
+  const updateDatasetOldNew = (userDetails) => {
+    var tablerow = [];
+
+    const getfilteredoldval = (oldvals) => {
+      return !isEmpty(oldvals) ? oldvals : "--";
+    };
+
+    const getfilterednewval = (newvals) => {
+      return !isEmpty(newvals) ? newvals : "--";
+    };
+
+    userDetails.map((val) => {
+      return tablerow.push(
+        <>
+          <tr key={val.id}>
+            <td className="table-warning">{val.attributeName}</td>
+            {val && val.previousValue && !isEmpty(val.previousValue) ? (
+              <td className="table-warning">
+                {val && val.previousValue && !isEmpty(val.previousValue) ? (
+                  isEmpty(val.newValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="danger">
+                        {getfilteredoldval(val.previousValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilteredoldval(val.previousValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+            {val && val.newValue && !isEmpty(val.newValue) ? (
+              <td className="table-warning">
+                {val && val.newValue && !isEmpty(val.newValue) ? (
+                  isEmpty(val.previousValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="success">
+                        {getfilterednewval(val.newValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilterednewval(val.newValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+          </tr>
+        </>
+      );
+    });
+
+    return tablerow;
+  };
+  return (
+    <div>
+      {/* CREATE  */}
+      {action == "create" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+              India Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner}</div>
+            <h5 className="bold wrap-header m-t-sm">Dataset Detail:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              {reportdata.map((dataset) => {
+                return (
+                  <tbody>
+                    <tr key={dataset.id}>
+                      <td 
className="table-warning">{dataset.attributeName}</td>
+
+                      <td className="table-warning">
+                        {!isEmpty(dataset.newValue) ? dataset.newValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+
+      {/* UPDATE */}
+
+      {action == "update" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET.value && (
+          <div>
+            <div className="row">
+              <div className="col-md-6">
+                <div className="font-weight-bolder">Name: {objectName}</div>
+                <div className="font-weight-bolder">
+                  Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+                  India Standard Time
+                </div>
+                <div className="font-weight-bolder">Updated By: {owner}</div>
+              </div>
+              <div className="col-md-6 text-right">
+                <div className="bg-success legend"></div> {" Added "}
+                <div className="bg-danger legend"></div> {" Deleted "}
+              </div>
+            </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">Dataset Detail:</h5>
+
+            <Table className="table  table-bordered table-striped w-75 ">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              <tbody>{updateDatasetOldNew(reportdata)}</tbody>
+            </Table>
+          </div>
+        )}
+      {/* DELETE  */}
+      {action == "delete" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India
+              Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner} </div>
+            <div className="font-weight-bolder">Deleted By: {owner} </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">Dataset Details:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                </tr>
+              </thead>
+              {reportdata.map((dataset) => {
+                return (
+                  <tbody>
+                    <tr>
+                      <td 
className="table-warning">{dataset.attributeName}</td>
+                      <td className="table-warning">
+                        {!isEmpty(dataset.previousValue) ? 
dataset.previousValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+    </div>
+  );
+};
+
+export default DatasetLogs;
diff --git 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/ProjectLogs.jsx
 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/ProjectLogs.jsx
new file mode 100644
index 000000000..dd13b4e73
--- /dev/null
+++ 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/ProjectLogs.jsx
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+import { Table, Badge } from "react-bootstrap";
+import dateFormat from "dateformat";
+import { ClassTypes } from "../../../utils/XAEnums";
+import { isEmpty } from "lodash";
+
+export const ProjectLogs = ({ data, reportdata }) => {
+  const { objectName, objectClassType, createDate, owner, action } = data;
+
+  const updateProjectOldNew = (userDetails) => {
+    var tablerow = [];
+
+    const getfilteredoldval = (oldvals) => {
+      return !isEmpty(oldvals) ? oldvals : "--";
+    };
+
+    const getfilterednewval = (newvals) => {
+      return !isEmpty(newvals) ? newvals : "--";
+    };
+
+    userDetails.map((val) => {
+      return tablerow.push(
+        <>
+          <tr key={val.id}>
+            <td className="table-warning">{val.attributeName}</td>
+            {val && val.previousValue && !isEmpty(val.previousValue) ? (
+              <td className="table-warning">
+                {val && val.previousValue && !isEmpty(val.previousValue) ? (
+                  isEmpty(val.newValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="danger">
+                        {getfilteredoldval(val.previousValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilteredoldval(val.previousValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+            {val && val.newValue && !isEmpty(val.newValue) ? (
+              <td className="table-warning">
+                {val && val.newValue && !isEmpty(val.newValue) ? (
+                  isEmpty(val.previousValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="success">
+                        {getfilterednewval(val.newValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilterednewval(val.newValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+          </tr>
+        </>
+      );
+    });
+
+    return tablerow;
+  };
+  return (
+    <div>
+      {/* CREATE  */}
+      {action == "create" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_PROJECT.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+              India Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner}</div>
+            <h5 className="bold wrap-header m-t-sm">Project Detail:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              {reportdata.map((project) => {
+                return (
+                  <tbody>
+                    <tr key={project.id}>
+                      <td 
className="table-warning">{project.attributeName}</td>
+
+                      <td className="table-warning">
+                        {!isEmpty(project.newValue) ? project.newValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+
+      {/* UPDATE */}
+
+      {action == "update" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_PROJECT.value && (
+          <div>
+            <div className="row">
+              <div className="col-md-6">
+                <div className="font-weight-bolder">Name: {objectName}</div>
+                <div className="font-weight-bolder">
+                  Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+                  India Standard Time
+                </div>
+                <div className="font-weight-bolder">Updated By: {owner}</div>
+              </div>
+              <div className="col-md-6 text-right">
+                <div className="bg-success legend"></div> {" Added "}
+                <div className="bg-danger legend"></div> {" Deleted "}
+              </div>
+            </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">Project Detail:</h5>
+
+            <Table className="table  table-bordered table-striped w-75 ">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              <tbody>{updateProjectOldNew(reportdata)}</tbody>
+            </Table>
+          </div>
+        )}
+      {/* DELETE  */}
+      {action == "delete" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_PROJECT.value && (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India
+              Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner} </div>
+            <div className="font-weight-bolder">Deleted By: {owner} </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">Project Details:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                </tr>
+              </thead>
+              {reportdata.map((project) => {
+                return (
+                  <tbody>
+                    <tr>
+                      <td 
className="table-warning">{project.attributeName}</td>
+                      <td className="table-warning">
+                        {!isEmpty(project.previousValue) ? 
project.previousValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+    </div>
+  );
+};
+
+export default ProjectLogs;
diff --git 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/SharedResourceLogs.jsx
 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/SharedResourceLogs.jsx
new file mode 100644
index 000000000..7243c9f1d
--- /dev/null
+++ 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/SharedResourceLogs.jsx
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+import { Table, Badge } from "react-bootstrap";
+import dateFormat from "dateformat";
+import { ClassTypes } from "../../../utils/XAEnums";
+import { isEmpty } from "lodash";
+
+export const SharedResourceLogs = ({ data, reportdata }) => {
+  const { objectName, objectClassType, createDate, owner, action } = data;
+
+  const updateSharedResourceOldNew = (userDetails) => {
+    var tablerow = [];
+
+    const getfilteredoldval = (oldvals) => {
+      return !isEmpty(oldvals) ? oldvals : "--";
+    };
+
+    const getfilterednewval = (newvals) => {
+      return !isEmpty(newvals) ? newvals : "--";
+    };
+
+    userDetails.map((val) => {
+      return tablerow.push(
+        <>
+          <tr key={val.id}>
+            <td className="table-warning">{val.attributeName}</td>
+            {val && val.previousValue && !isEmpty(val.previousValue) ? (
+              <td className="table-warning">
+                {val && val.previousValue && !isEmpty(val.previousValue) ? (
+                  isEmpty(val.newValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="danger">
+                        {getfilteredoldval(val.previousValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilteredoldval(val.previousValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+            {val && val.newValue && !isEmpty(val.newValue) ? (
+              <td className="table-warning">
+                {val && val.newValue && !isEmpty(val.newValue) ? (
+                  isEmpty(val.previousValue) ? (
+                    <h6>
+                      <Badge className="d-inline mr-1" variant="success">
+                        {getfilterednewval(val.newValue)}
+                      </Badge>
+                    </h6>
+                  ) : (
+                    getfilterednewval(val.newValue)
+                  )
+                ) : (
+                  "--"
+                )}
+              </td>
+            ) : (
+              <td>{"--"}</td>
+            )}
+          </tr>
+        </>
+      );
+    });
+
+    return tablerow;
+  };
+  return (
+    <div>
+      {/* CREATE  */}
+      {action == "create" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE.value 
&& (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+              India Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner}</div>
+            <h5 className="bold wrap-header m-t-sm">SharedResource Detail:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              {reportdata.map((sharedResource) => {
+                return (
+                  <tbody>
+                    <tr key={sharedResource.id}>
+                      <td 
className="table-warning">{sharedResource.attributeName}</td>
+
+                      <td className="table-warning">
+                        {!isEmpty(sharedResource.newValue) ? 
sharedResource.newValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+
+      {/* UPDATE */}
+
+      {action == "update" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE.value 
&& (
+          <div>
+            <div className="row">
+              <div className="col-md-6">
+                <div className="font-weight-bolder">Name: {objectName}</div>
+                <div className="font-weight-bolder">
+                  Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")}
+                  India Standard Time
+                </div>
+                <div className="font-weight-bolder">Updated By: {owner}</div>
+              </div>
+              <div className="col-md-6 text-right">
+                <div className="bg-success legend"></div> {" Added "}
+                <div className="bg-danger legend"></div> {" Deleted "}
+              </div>
+            </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">SharedResource Detail:</h5>
+
+            <Table className="table  table-bordered table-striped w-75 ">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                  <th>New Value</th>
+                </tr>
+              </thead>
+
+              <tbody>{updateSharedResourceOldNew(reportdata)}</tbody>
+            </Table>
+          </div>
+        )}
+      {/* DELETE  */}
+      {action == "delete" &&
+        objectClassType == ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE.value 
&& (
+          <div>
+            <div className="font-weight-bolder">Name : {objectName}</div>
+            <div className="font-weight-bolder">
+              Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India
+              Standard Time
+            </div>
+            <div className="font-weight-bolder">Created By: {owner} </div>
+            <div className="font-weight-bolder">Deleted By: {owner} </div>
+            <br />
+            <h5 className="bold wrap-header m-t-sm">SharedResource 
Details:</h5>
+
+            <Table className="table table-striped table-bordered w-50">
+              <thead className="thead-light">
+                <tr>
+                  <th>Fields</th>
+                  <th>Old Value</th>
+                </tr>
+              </thead>
+              {reportdata.map((sharedResource) => {
+                return (
+                  <tbody>
+                    <tr>
+                      <td 
className="table-warning">{sharedResource.attributeName}</td>
+                      <td className="table-warning">
+                        {!isEmpty(sharedResource.previousValue) ? 
sharedResource.previousValue : "--"}
+                      </td>
+                    </tr>
+                  </tbody>
+                );
+              })}
+            </Table>
+          </div>
+        )}
+    </div>
+  );
+};
+
+export default SharedResourceLogs;
diff --git 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/OperationAdminModal.jsx
 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/OperationAdminModal.jsx
index 0d30e3224..a99c4f27b 100644
--- 
a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/OperationAdminModal.jsx
+++ 
b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/OperationAdminModal.jsx
@@ -29,6 +29,12 @@ import ServiceLogs from "./AdminLogs/ServiceLogs";
 import PolicyLogs from "./AdminLogs/PolicyLogs";
 import PasswordLogs from "./AdminLogs/PasswordLogs";
 import UserprofileLogs from "./AdminLogs/UserprofileLogs";
+import DatasetLogs from "./AdminLogs/DatasetLogs";
+import ProjectLogs from "./AdminLogs/ProjectLogs";
+import DataShareLogs from "./AdminLogs/DataShareLogs";
+import SharedResourceLogs from "./AdminLogs/SharedResourceLogs";
+import DataShareInDatasetLogs from "./AdminLogs/DataShareInDatasetLogs";
+import DatasetInProjectLogs from "./AdminLogs/DatasetInProjectLogs";
 import { ModalLoader } from "../../components/CommonComponents";
 
 export const OperationAdminModal = ({ onHide, show, data = {} }) => {
@@ -116,6 +122,42 @@ export const OperationAdminModal = ({ onHide, show, data = 
{} }) => {
             {objectClassType == ClassTypes.CLASS_TYPE_PASSWORD_CHANGE.value && 
(
               <PasswordLogs reportdata={reportdata} data={data} />
             )}
+
+            {/* DATASET */}
+
+            {objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET.value && (
+              <DatasetLogs reportdata={reportdata} data={data} />
+            )}
+
+            {/* PROJECT */}
+
+            {objectClassType == ClassTypes.CLASS_TYPE_RANGER_PROJECT.value && (
+              <ProjectLogs reportdata={reportdata} data={data} />
+            )}
+
+            {/* DATA_SHARE */}
+
+            {objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE.value 
&& (
+              <DataShareLogs reportdata={reportdata} data={data} />
+            )}
+
+            {/* SHARED_RESOURCE */}
+
+            {objectClassType == 
ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE.value && (
+              <SharedResourceLogs reportdata={reportdata} data={data} />
+            )}
+
+            {/* DATA_SHARE_IN_DATASET */}
+
+            {objectClassType == 
ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET.value && (
+              <DataShareInDatasetLogs reportdata={reportdata} data={data} />
+            )}
+
+            {/* DATASET_IN_PROJECT */}
+
+            {objectClassType == 
ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT.value && (
+              <DatasetInProjectLogs reportdata={reportdata} data={data} />
+            )}
           </div>
         )}
       </Modal.Body>

Reply via email to