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 <[email protected]>
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>