RANGER-4648: updated GDS validation for name length

Signed-off-by: Madhan Neethiraj <madhan@apache.org>
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/errors/ValidationErrorCode.java b/agents-common/src/main/java/org/apache/ranger/plugin/errors/ValidationErrorCode.java
index 38b302e..dccd8f4 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/errors/ValidationErrorCode.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/errors/ValidationErrorCode.java
@@ -66,7 +66,7 @@
     SERVICE_DEF_VALIDATION_ERR_ENUM_DEF_INVALID_DEFAULT_INDEX(2019, "default index[{0}] for enum [{1}] is invalid"),
     SERVICE_DEF_VALIDATION_ERR_ENUM_DEF_NULL_ENUM_ELEMENT(2020, "An enum element in enum element collection of enum [{0}] is null"),
     SERVICE_DEF_VALIDATION_ERR_INVALID_SERVICE_RESOURCE_LEVELS(2021, "Resource-def levels are not in increasing order in an hierarchy"),
-	SERVICE_DEF_VALIDATION_ERR_NOT_LOWERCASE_NAME(2022, "{0}:[{1}] Invalid resource name. Resource name should consist of only lowercase, hyphen or underscore characters"),
+    SERVICE_DEF_VALIDATION_ERR_NOT_LOWERCASE_NAME(2022, "{0}:[{1}] Invalid resource name. Resource name should consist of only lowercase, hyphen or underscore characters"),
     SERVICE_DEF_VALIDATION_ERR_INVALID_MANADORY_VALUE_FOR_SERVICE_RESOURCE(2023, "{0} cannot be mandatory because {1}(parent) is not mandatory"),
 
     // POLICY VALIDATION
@@ -164,6 +164,9 @@
     GDS_VALIDATION_ERR_UPDATE_IMMUTABLE_FIELD(4126, "[{0}] can't be updated"),
     GDS_VALIDATION_ERR_DATASET_IN_PROJECT_ID_NOT_FOUND(4127, "Dataset-in-project with ID [{0}] does not exist"),
     GDS_VALIDATION_ERR_SHARED_RESOURCE_CONFLICT(4128, "Shared resource with resources [{0}] already exists for data share [{1}]"),
+    GDS_DATASET_NAME_TOO_LONG(4129, "Invalid dataset name=[{0}]. Dataset name should not be longer than 512 characters"),
+    GDS_DATASHARE_NAME_TOO_LONG(4130, "Invalid datashare name=[{0}]. Datashare name should not be longer than 512 characters"),
+    GDS_PROJECT_NAME_TOO_LONG(4131, "Invalid project name=[{0}]. Project name should not be longer than 512 characters"),
     ;
 
 
diff --git a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
index 27e7cc1..6efe9f4 100755
--- a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
+++ b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
@@ -53,6 +53,8 @@
 
     private final RangerGdsValidationDataProvider dataProvider;
 
+    public static final Integer GDS_ENTITIES_NAME_MAX_LENGTH = 512;
+
     @Autowired
     RESTErrorUtil restErrorUtil;
 
@@ -70,6 +72,10 @@
             result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_NAME_CONFLICT, "name", dataset.getName(), existing));
         }
 
+        if (dataset.getName().length() > GDS_ENTITIES_NAME_MAX_LENGTH) {
+            result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_DATASET_NAME_TOO_LONG, "name", dataset.getName()));
+        }
+
         validateAcl(dataset.getAcl(), "acl", result);
 
         if (!result.isSuccess()) {
@@ -98,6 +104,10 @@
                 if (existingDatasetNameId != null) {
                     result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_NAME_CONFLICT, "name", dataset.getName(), existingDatasetNameId));
                 }
+
+                if (dataset.getName().length() > GDS_ENTITIES_NAME_MAX_LENGTH) {
+                    result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_DATASET_NAME_TOO_LONG, "name", dataset.getName()));
+                }
             }
         }
 
@@ -136,6 +146,10 @@
             result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_PROJECT_NAME_CONFLICT, "name", project.getName(), existing));
         }
 
+        if (project.getName().length() > GDS_ENTITIES_NAME_MAX_LENGTH) {
+            result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_PROJECT_NAME_TOO_LONG, "name", project.getName()));
+        }
+
         validateAcl(project.getAcl(), "acl", result);
 
         if (!result.isSuccess()) {
@@ -164,6 +178,10 @@
                 if (existingProjectNameId != null) {
                     result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_PROJECT_NAME_CONFLICT, "name", project.getName(), existingProjectNameId));
                 }
+
+                if (project.getName().length() > GDS_ENTITIES_NAME_MAX_LENGTH) {
+                    result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_PROJECT_NAME_TOO_LONG, "name", project.getName()));
+                }
             }
         }
 
@@ -202,6 +220,10 @@
             result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_NAME_CONFLICT, "name", dataShare.getName(), existing));
         }
 
+        if (dataShare.getName().length() > GDS_ENTITIES_NAME_MAX_LENGTH) {
+            result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_DATASHARE_NAME_TOO_LONG, "name", dataShare.getName()));
+        }
+
         validateServiceZoneAdmin(dataShare.getService(), dataShare.getZone(), result);
 
         validateAcl(dataShare.getAcl(), "acl", result);
@@ -236,6 +258,10 @@
                 if (existingDataShareNameId != null) {
                     result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_NAME_CONFLICT, "name", dataShare.getName(), existingDataShareNameId));
                 }
+
+                if (dataShare.getName().length() > GDS_ENTITIES_NAME_MAX_LENGTH) {
+                    result.addValidationFailure(new ValidationFailureDetails(ValidationErrorCode.GDS_DATASHARE_NAME_TOO_LONG, "name", dataShare.getName()));
+                }
             }
         }
 
diff --git a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/AddDatasetView.jsx b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/AddDatasetView.jsx
index 6f15af0..7851e7c 100755
--- a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/AddDatasetView.jsx
+++ b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/AddDatasetView.jsx
@@ -149,6 +149,11 @@
         toast.error("Dataset name cannot be empty!!");
         return;
       }
+      else if (datasetName.length>512)
+      {
+        toast.error("Dataset name must not exceed 512 characters!!");
+        return;
+      }
       setSaveButtonText("Continue");
       setStep(step + 1);
     }
diff --git a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/DatasetDetailLayout.jsx b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/DatasetDetailLayout.jsx
index cba038c..a8857e0 100755
--- a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/DatasetDetailLayout.jsx
+++ b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Dataset/DatasetDetailLayout.jsx
@@ -1500,16 +1500,27 @@
               </Button>
               <Button
                 variant="primary"
-                onClick={
-                  activeKey == "accessGrants" &&
-                  accessGrantFormValues != undefined &&
-                  datasetNameEditable
-                    ? updateDatasetAndAccessGrant
-                    : activeKey != "accessGrants" ||
-                      (activeKey == "accessGrants" && datasetNameEditable)
-                    ? updateDatasetDetails
-                    : updateDatasetAccessGrant
-                }
+                onClick={() => {
+                  if(datasetName.length > 512) {
+                    toast.error('Dataset name must be 512 characters or less');
+                  }
+                  else {
+                    if (
+                      activeKey === 'accessGrants' &&
+                      accessGrantFormValues !== undefined &&
+                      datasetNameEditable
+                    ) {
+                      updateDatasetAndAccessGrant();
+                    } else if (
+                      activeKey !== 'accessGrants' ||
+                      (activeKey === 'accessGrants' && datasetNameEditable)
+                    ) {
+                      updateDatasetDetails();
+                    } else {
+                      updateDatasetAccessGrant();
+                    }
+                  }
+                }}
                 size="sm"
                 data-id="save"
                 data-cy="save"
diff --git a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/AddDatashareView.jsx b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/AddDatashareView.jsx
index 4306864..4a835c5 100755
--- a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/AddDatashareView.jsx
+++ b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/AddDatashareView.jsx
@@ -177,6 +177,10 @@
       if (datashareName == undefined) {
         toast.error("Please add Datashare Name");
         return;
+      } else if (datashareName.length>512)
+      {
+        toast.error("DataShare Name must not exceed 512 characters");
+        return;
       } else if (selectedService == undefined) {
         toast.error("Please add Service Name");
         return;
diff --git a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/DatashareDetailLayout.jsx b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/DatashareDetailLayout.jsx
index dfa3d40..b6c83c9 100755
--- a/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/DatashareDetailLayout.jsx
+++ b/security-admin/src/main/webapp/react-webapp/src/views/GovernedData/Datashare/DatashareDetailLayout.jsx
@@ -553,6 +553,12 @@
     datashareInfo.conditionExpr = datashareConditionExpr;
     datashareInfo.defaultAccessTypes = [];
 
+    if(datashareName.length>512)
+    {
+      toast.error("Datashare name must be 512 characters or less!");
+      return;
+    }
+
     accessType?.forEach((access) =>
       datashareInfo.defaultAccessTypes.push(access.value)
     );