From b1652d17956b91d86c054b44bd68cc415371ff56 Mon Sep 17 00:00:00 2001
From: Joao Afonso <joao.afonso@cern.ch>
Date: Mon, 3 Feb 2025 13:48:05 +0100
Subject: [PATCH 1/5] Fixing fxid/disk_file_id incongruences

---
 cmdline/CtaAdminCmdParse.hpp                  | 12 ++-
 .../EosNamespaceInjection.cpp                 |  7 ++
 .../restore_files/RestoreFilesCmd.cpp         |  4 +-
 common/utils/utils.cpp                        | 11 +++
 common/utils/utils.hpp                        |  7 ++
 frontend/common/AdminCmd.cpp                  | 73 +++++++++++++++----
 xroot_plugins/XrdCtaRecycleTapeFileLs.hpp     | 27 ++++---
 xroot_plugins/XrdCtaTapeFileLs.hpp            | 26 +++++--
 8 files changed, 131 insertions(+), 36 deletions(-)

diff --git a/cmdline/CtaAdminCmdParse.hpp b/cmdline/CtaAdminCmdParse.hpp
index d341ae5fad..e6029f801a 100644
--- a/cmdline/CtaAdminCmdParse.hpp
+++ b/cmdline/CtaAdminCmdParse.hpp
@@ -343,7 +343,8 @@ const std::map<std::string, OptionString::Key> strOptions = {
   {"--guiurl",              OptionString::GUI_URL                    },
   {"--webcamurl",           OptionString::WEBCAM_URL                 },
   {"--location",            OptionString::LIBRARY_LOCATION           },
-  {"--archiveroutetype",    OptionString::ARCHIVE_ROUTE_TYPE         }
+  {"--archiveroutetype",    OptionString::ARCHIVE_ROUTE_TYPE         },
+  {"--diskfileid",          OptionString::DISK_FILE_ID               }
 };
 
 /*!
@@ -401,6 +402,7 @@ const Option opt_drivename_cmd {Option::OPT_CMD, "--drive", "", "<drive_name>"};
 const Option opt_encrypted {Option::OPT_BOOL, "--encrypted", "-e", R"( <"true" or "false">)"};
 const Option opt_encryptionkeyname {Option::OPT_STR, "--encryptionkeyname", "-k", " <encryption_key_name>"};
 const Option opt_fid {Option::OPT_STR, "--fxid", "-f", " <eos_fxid>"};
+const Option opt_diskfileid {Option::OPT_STR, "--diskfileid", "--dfid", " <disk_file_id>"};
 const Option opt_fidfile {Option::OPT_STR_LIST, "--fxidfile", "-F", " <filename>"};
 const Option opt_filename {Option::OPT_STR, "--file", "-f", " <filename>"};
 const Option opt_force {Option::OPT_BOOL, "--force", "-f", R"( <"true" or "false">)"};
@@ -883,6 +885,7 @@ recycletf (rtf)
   {{AdminCmd::CMD_RECYCLETAPEFILE, AdminCmd::SUBCMD_LS},
    {opt_vid.optional(),
     opt_fid.optional(),
+    opt_diskfileid.optional(),
     opt_fidfile.optional(),
     opt_copynb.optional(),
     opt_archivefileid.optional(),
@@ -1060,10 +1063,11 @@ tapefile (tf)
    {opt_vid.optional(),
     opt_instance.optional(),
     opt_fid.optional(),
+    opt_diskfileid.optional(),
     opt_fidfile.optional(),
     opt_archivefileid.optional()}                                                                                            },
   {{AdminCmd::CMD_TAPEFILE, AdminCmd::SUBCMD_RM},
-   {opt_vid, opt_instance.optional(), opt_fid.optional(), opt_archivefileid.optional(), opt_reason}                          },
+   {opt_vid, opt_instance.optional(), opt_fid.optional(), opt_diskfileid.optional(), opt_archivefileid.optional(), opt_reason}                          },
 
   /**md
 tapepool (tp)
@@ -1151,10 +1155,10 @@ virtualorganization (vo)
 
   // Used by cta-change-storageclass and cta-eos-namespace-inject
   {{AdminCmd::CMD_ARCHIVEFILE, AdminCmd::SUBCMD_CH},
-   {opt_storageclass.optional(), opt_archive_file_ids, opt_fid.optional(), opt_diskinstance.optional()}                      },
+   {opt_storageclass.optional(), opt_archive_file_ids, opt_fid.optional(), opt_diskfileid.optional(), opt_diskinstance.optional()}                      },
   // Used by cta-restore-deleted-files
   {{AdminCmd::CMD_RECYCLETAPEFILE, AdminCmd::SUBCMD_RESTORE},
-   {opt_vid.optional(), opt_fid, opt_copynb.optional(), opt_archivefileid.optional(), opt_instance.optional()}               },
+   {opt_vid.optional(), opt_fid.optional(), opt_diskfileid.optional(), opt_copynb.optional(), opt_archivefileid.optional(), opt_instance.optional()}               },
   /*-------------------------------------------------------------------------------------------------------------------------*/
 };
 
diff --git a/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp b/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp
index a31d8b56ca..60b2106eed 100644
--- a/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp
+++ b/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp
@@ -181,6 +181,13 @@ void EosNamespaceInjection::updateFxidAndDiskInstanceInCatalogue(const std::stri
     new_opt->set_value(fxId);
   }
 
+  {
+    const auto key = cta::admin::OptionString::DISK_FILE_ID;
+    const auto new_opt = admincmd->add_option_str();
+    new_opt->set_key(key);
+    new_opt->set_value(fxId);
+  }
+
   {
     const auto key = cta::admin::OptionString::DISK_INSTANCE;
     const auto new_opt = admincmd->add_option_str();
diff --git a/cmdline/standalone_cli_tools/restore_files/RestoreFilesCmd.cpp b/cmdline/standalone_cli_tools/restore_files/RestoreFilesCmd.cpp
index 519254c3c8..55e4569379 100644
--- a/cmdline/standalone_cli_tools/restore_files/RestoreFilesCmd.cpp
+++ b/cmdline/standalone_cli_tools/restore_files/RestoreFilesCmd.cpp
@@ -341,10 +341,10 @@ void RestoreFilesCmd::restoreDeletedFileCopyCta(const cta::admin::RecycleTapeFil
     new_opt->set_value(file.copy_nb());
   }
   {
-    auto key = cta::admin::OptionString::FXID;
+    auto key = cta::admin::OptionString::DISK_FILE_ID;
     auto new_opt = admincmd.add_option_str();
 
-    if (!utils::isValidID(file.disk_file_id())) {
+    if (!utils::isValidDecimal(file.disk_file_id()) && !utils::isValidUUID(file.disk_file_id())) {
       throw std::runtime_error(file.disk_file_id() + " is not a valid disk file ID");
     }
     params.emplace_back("fid", file.disk_file_id());
diff --git a/common/utils/utils.cpp b/common/utils/utils.cpp
index 7166019754..7891b7e534 100644
--- a/common/utils/utils.cpp
+++ b/common/utils/utils.cpp
@@ -1004,6 +1004,17 @@ std::string decimalToHexadecimal(const std::string& decimalNumber) {
   return fxIdStream.str();
 }
 
+std::string hexadecimalToDecimal(const std::string& hexadecimalNumber) {
+  try {
+    auto decimalNum = stol(hexadecimalNumber, nullptr, 16);
+    return std::to_string(decimalNum);
+  } catch (std::invalid_argument & ex) {
+    throw cta::exception::Exception(hexadecimalNumber + " is not a valid hexadecimal number.");
+  } catch (std::out_of_range & ex) {
+    throw cta::exception::Exception(hexadecimalNumber + " is out of range.");
+  }
+}
+
 // Check if uuid is correct
 bool isValidUUID(const std::string& uuid) {
   if (uuid.empty()) {
diff --git a/common/utils/utils.hpp b/common/utils/utils.hpp
index 4a1ed99f52..6e77370ac1 100644
--- a/common/utils/utils.hpp
+++ b/common/utils/utils.hpp
@@ -507,6 +507,13 @@ std::string listToCommaSeparatedString(const std::list<std::string>& list);
  */
 std::string decimalToHexadecimal(const std::string& decimalNumber);
 
+/**
+ * Converts a number from a hexadecimal number to a decimal number
+ * @param hexadecimalNumber The number that will be transformed
+ * @return the hexadecimal version of the number
+ */
+std::string hexadecimalToDecimal(const std::string& hexadecimalNumber);
+
 /**
  * Checks if a string is a valid UUID.
  * 
diff --git a/frontend/common/AdminCmd.cpp b/frontend/common/AdminCmd.cpp
index 3033b5e7be..10058da60c 100644
--- a/frontend/common/AdminCmd.cpp
+++ b/frontend/common/AdminCmd.cpp
@@ -1195,7 +1195,8 @@ void AdminCmd::processTapeFile_Rm(xrd::Response& response) {
   auto& reason        = getRequired(OptionString::REASON);
   auto archiveFileId  = getOptional(OptionUInt64::ARCHIVE_FILE_ID);
   auto instance       = getOptional(OptionString::INSTANCE);
-  auto diskFileId     = getOptional(OptionString::FXID);
+  auto diskFileIdHex  = getOptional(OptionString::FXID);
+  auto diskFileIdStr  = getOptional(OptionString::DISK_FILE_ID);
 
   catalogue::TapeFileSearchCriteria searchCriteria;
   searchCriteria.vid = vid;
@@ -1203,13 +1204,24 @@ void AdminCmd::processTapeFile_Rm(xrd::Response& response) {
   if(archiveFileId) {
     searchCriteria.archiveFileId = archiveFileId.value();
   }
-  if(diskFileId) {
-    auto fid = strtol(diskFileId.value().c_str(), nullptr, 16);
-    if(fid < 1 || fid == LONG_MAX) {
-      throw exception::UserError(diskFileId.value() + " is not a valid file ID");
+  if(diskFileIdHex && diskFileIdStr) {
+    throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
+  }
+  if(diskFileIdHex) {
+    try {
+      diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
+    } catch (exception::Exception &) {
+      throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
+    }
+  } else if(diskFileIdStr) {
+    if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
+      throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
     }
+  }
+
+  if(diskFileIdStr) {
     searchCriteria.diskFileIds = std::vector<std::string>();
-    searchCriteria.diskFileIds.value().push_back(std::to_string(fid));
+    searchCriteria.diskFileIds.value().push_back(diskFileIdStr.value());
   }
   if(instance) {
     searchCriteria.diskInstance = instance.value();
@@ -1600,11 +1612,26 @@ void AdminCmd::processRecycleTapeFile_Restore(xrd::Response& response) {
   catalogue::RecycleTapeFileSearchCriteria searchCriteria;
 
   searchCriteria.vid = getOptional(OptionString::VID, &has_any);
-  auto diskFileId = getRequired(OptionString::FXID);
-  
-  auto fid = strtol(diskFileId.c_str(), nullptr, 16);
-  if(fid < 1 || fid == LONG_MAX) {
-    throw exception::UserError(diskFileId + " is not a valid file ID");
+  auto diskFileIdHex = getOptional(OptionString::FXID);
+  auto diskFileIdStr = getOptional(OptionString::DISK_FILE_ID);
+
+  if(diskFileIdHex && diskFileIdStr) {
+    throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
+  }
+  if(!diskFileIdHex && !diskFileIdStr) {
+    throw exception::UserError("Must specify at least one of the following search options: fxid, diskfileid");
+  }
+
+  if(diskFileIdHex) {
+    try {
+      diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
+    } catch (exception::Exception &) {
+      throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
+    }
+  } else {
+    if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
+      throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
+    }
   }
 
   // Disk instance on its own does not give a valid set of search criteria (no &has_any)
@@ -1616,7 +1643,7 @@ void AdminCmd::processRecycleTapeFile_Restore(xrd::Response& response) {
   if(!has_any) {
     throw exception::UserError("Must specify at least one of the following search options: vid, fxid, fxidfile or archiveFileId");
   }
-  m_catalogue.FileRecycleLog()->restoreFileInRecycleLog(searchCriteria, std::to_string(fid));
+  m_catalogue.FileRecycleLog()->restoreFileInRecycleLog(searchCriteria, diskFileIdStr.value());
   response.set_type(xrd::Response::RSP_SUCCESS);
 }
 
@@ -1625,11 +1652,27 @@ void AdminCmd::processModifyArchiveFile(xrd::Response& response) {
 
   try {
     std::optional<std::string> newStorageClassName = getOptional(OptionString::STORAGE_CLASS);
-    std::optional<std::string> fxId = getOptional(OptionString::FXID);
+    std::optional<std::string> diskFileIdHex = getOptional(OptionString::FXID);
+    std::optional<std::string> diskFileIdStr = getOptional(OptionString::DISK_FILE_ID);
     std::optional<std::string> diskInstance = getOptional(OptionString::DISK_INSTANCE);
 
     auto archiveFileIds = getRequired(OptionStrList::FILE_ID);
 
+    if(diskFileIdHex && diskFileIdStr) {
+      throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
+    }
+    if(diskFileIdHex) {
+      try {
+        diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
+      } catch (exception::Exception &) {
+        throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
+      }
+    } else if (diskFileIdStr) {
+      if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
+        throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
+      }
+    }
+
     // call is from cta-change-storageclass
     if(newStorageClassName) {
       for(const auto& id : archiveFileIds) {
@@ -1638,9 +1681,9 @@ void AdminCmd::processModifyArchiveFile(xrd::Response& response) {
       }
     }
     // call is from cta-eos-namespace-inject
-    else if(fxId && diskInstance) {
+    else if(diskFileIdStr && diskInstance) {
       m_catalogue.ArchiveFile()->modifyArchiveFileFxIdAndDiskInstance(utils::toUint64(archiveFileIds[0]),
-        fxId.value(), diskInstance.value());
+        diskFileIdStr.value(), diskInstance.value());
     } else {
       throw exception::UserError("Must specify either Storage Class or Disk File ID and Disk Instance");
     }
diff --git a/xroot_plugins/XrdCtaRecycleTapeFileLs.hpp b/xroot_plugins/XrdCtaRecycleTapeFileLs.hpp
index 39d4d7e06c..b355a24f2a 100644
--- a/xroot_plugins/XrdCtaRecycleTapeFileLs.hpp
+++ b/xroot_plugins/XrdCtaRecycleTapeFileLs.hpp
@@ -68,18 +68,27 @@ RecycleTapeFileLsStream::RecycleTapeFileLsStream(const frontend::AdminCmdStream&
   
   searchCriteria.vid = requestMsg.getOptional(OptionString::VID, &has_any);
   
-  auto diskFileId = requestMsg.getOptional(OptionString::FXID, &has_any);
-
-  searchCriteria.diskFileIds = requestMsg.getOptional(OptionStrList::FILE_ID, &has_any);
-  
-  if (diskFileId){
-    if (auto fid = diskFileId.value(); !utils::isValidID(fid)) {
-      throw cta::exception::UserError(fid + " is not a valid file ID");
+  auto diskFileIdHex = requestMsg.getOptional(OptionString::FXID, &has_any);
+  auto diskFileIdStr = requestMsg.getOptional(OptionString::DISK_FILE_ID, &has_any);
+  if(diskFileIdHex && diskFileIdStr) {
+    throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
+  }
+  if(diskFileIdHex) {
+    try {
+      diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
+    } catch (exception::Exception &) {
+      throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
     }
+  } else if(diskFileIdStr) {
+    if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
+      throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
+    }
+  }
 
-    // single option on the command line we need to do the conversion ourselves.
+  searchCriteria.diskFileIds = requestMsg.getOptional(OptionStrList::FILE_ID, &has_any);
+  if (diskFileIdStr){
     if(!searchCriteria.diskFileIds) searchCriteria.diskFileIds = std::vector<std::string>();
-    searchCriteria.diskFileIds->push_back(diskFileId.value());
+    searchCriteria.diskFileIds->push_back(diskFileIdStr.value());
   }
   searchCriteria.diskInstance = requestMsg.getOptional(OptionString::INSTANCE, &has_any);
   searchCriteria.archiveFileId = requestMsg.getOptional(OptionUInt64::ARCHIVE_FILE_ID, &has_any);
diff --git a/xroot_plugins/XrdCtaTapeFileLs.hpp b/xroot_plugins/XrdCtaTapeFileLs.hpp
index 5c438b552b..63f9841434 100644
--- a/xroot_plugins/XrdCtaTapeFileLs.hpp
+++ b/xroot_plugins/XrdCtaTapeFileLs.hpp
@@ -64,15 +64,29 @@ TapeFileLsStream::TapeFileLsStream(const frontend::AdminCmdStream& requestMsg,
   cta::catalogue::TapeFileSearchCriteria searchCriteria;
 
   searchCriteria.vid = requestMsg.getOptional(OptionString::VID, &has_any);
+
+  auto diskFileIdHex = requestMsg.getOptional(OptionString::FXID, &has_any);
+  auto diskFileIdStr = requestMsg.getOptional(OptionString::DISK_FILE_ID, &has_any);
+  if(diskFileIdHex && diskFileIdStr) {
+    throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
+  }
+  if(diskFileIdHex) {
+    try {
+      diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
+    } catch (exception::Exception &) {
+      throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
+    }
+  } else if(diskFileIdStr) {
+    if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
+      throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
+    }
+  }
+
   // Disk file IDs can be a list or a single ID
-  auto diskFileId = requestMsg.getOptional(OptionString::FXID, &has_any);
   searchCriteria.diskFileIds = requestMsg.getOptional(OptionStrList::FILE_ID, &has_any);
-  if(diskFileId.has_value()) {
-    if (auto fid = diskFileId.value(); !utils::isValidID(fid)) {
-      throw cta::exception::UserError(fid + " is not a valid file ID");
-    }
+  if(diskFileIdStr) {
     if(!searchCriteria.diskFileIds) searchCriteria.diskFileIds = std::vector<std::string>();
-    searchCriteria.diskFileIds->push_back(diskFileId.value());
+    searchCriteria.diskFileIds->push_back(diskFileIdStr.value());
   }
   searchCriteria.diskInstance = requestMsg.getOptional(OptionString::INSTANCE, &has_any);
 
-- 
GitLab


From 768e69e70112931722afe1a71a779df1ced4b6b5 Mon Sep 17 00:00:00 2001
From: Joao Afonso <joao.afonso@cern.ch>
Date: Mon, 3 Feb 2025 13:52:20 +0100
Subject: [PATCH 2/5] Temporarily changing 'xrootd-ssi-protobuf-interface' to
 'cta-1060' branch

---
 xrootd-ssi-protobuf-interface | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/xrootd-ssi-protobuf-interface b/xrootd-ssi-protobuf-interface
index d3ab3e9ee6..f632da459b 160000
--- a/xrootd-ssi-protobuf-interface
+++ b/xrootd-ssi-protobuf-interface
@@ -1 +1 @@
-Subproject commit d3ab3e9ee657c9a0f67a9f2cc168cd9d7b6b7bf9
+Subproject commit f632da459bac1e11fb44747a056b3552d0955e53
-- 
GitLab


From af15100f2fb598d02a0b562cffba622c91afc8ea Mon Sep 17 00:00:00 2001
From: Joao Afonso <joao.afonso@cern.ch>
Date: Fri, 21 Feb 2025 10:13:24 +0100
Subject: [PATCH 3/5] Updating xrootd-ssi-protobuf-interface version

---
 xrootd-ssi-protobuf-interface | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/xrootd-ssi-protobuf-interface b/xrootd-ssi-protobuf-interface
index f632da459b..95ca6aca15 160000
--- a/xrootd-ssi-protobuf-interface
+++ b/xrootd-ssi-protobuf-interface
@@ -1 +1 @@
-Subproject commit f632da459bac1e11fb44747a056b3552d0955e53
+Subproject commit 95ca6aca153a6e72a33a281258e3372d54fe6a74
-- 
GitLab


From 9d8e0f954870ed325867cc47fce291996bec6a93 Mon Sep 17 00:00:00 2001
From: Joao Afonso <joao.afonso@cern.ch>
Date: Fri, 21 Feb 2025 12:06:50 +0100
Subject: [PATCH 4/5] Added function to handle FXID/DISK_FILE_ID conficts

---
 .../EosNamespaceInjection.cpp                 | 45 +++++-----
 .../EosNamespaceInjection.hpp                 | 12 +--
 .../eos_namespace_injection/MetaData.hpp      |  2 +-
 .../restore_files/RestoreFilesCmd.cpp         | 21 +++--
 common/utils/utils.cpp                        | 23 +++---
 common/utils/utils.hpp                        | 10 +--
 frontend/common/AdminCmd.cpp                  | 82 ++++++++-----------
 frontend/common/AdminCmd.hpp                  | 13 +++
 xroot_plugins/XrdCtaRecycleTapeFileLs.hpp     | 17 +---
 xroot_plugins/XrdCtaTapeFileLs.hpp            | 20 +----
 10 files changed, 99 insertions(+), 146 deletions(-)

diff --git a/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp b/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp
index 60b2106eed..a1c60dee1d 100644
--- a/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp
+++ b/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp
@@ -76,7 +76,7 @@ void IStreamBuffer<cta::xrd::Data>::DataCallback(cta::xrd::Data record) const {
       g_metaDataObjectCatalogue.size          = std::to_string(item.af().size());
       g_metaDataObjectCatalogue.storageClass  = item.af().storage_class();
       g_metaDataObjectCatalogue.creationTime  = std::to_string(item.af().creation_time());
-      g_metaDataObjectCatalogue.fxId          = item.df().disk_id();
+      g_metaDataObjectCatalogue.diskId          = item.df().disk_id();
       g_metaDataObjectCatalogue.diskInstance  = item.df().disk_instance();
 
       std::string checksumType("NONE");
@@ -152,10 +152,10 @@ int EosNamespaceInjection::exceptionThrowingMain(const int argc, char *const *co
     const auto newFid = createFileInEos(metaDataFromUser, parentId, uid, gid);
     checkFileCreated(newFid);
 
-    std::string newFxId = cta::utils::decimalToHexadecimal(std::to_string(newFid));
-    updateFxidAndDiskInstanceInCatalogue(metaDataFromUser.archiveId, newFxId, metaDataFromUser.diskInstance);
+    auto diskFileId = std::to_string(newFid);
+    updateDiskFileIdAndDiskInstanceInCatalogue(metaDataFromUser.archiveId, diskFileId, metaDataFromUser.diskInstance);
 
-    checkEosCtaConsistency(archiveId, newFxId, metaDataFromUser);
+    checkEosCtaConsistency(archiveId, diskFileId, metaDataFromUser);
   }
   createTxtFileWithSkippedMetadata();
   return 0;
@@ -164,7 +164,7 @@ int EosNamespaceInjection::exceptionThrowingMain(const int argc, char *const *co
 //------------------------------------------------------------------------------
 // updateFxidAndDiskInstanceInCatalogue
 //------------------------------------------------------------------------------
-void EosNamespaceInjection::updateFxidAndDiskInstanceInCatalogue(const std::string &archiveId, const std::string &fxId, const std::string &diskInstance) const {
+void EosNamespaceInjection::updateDiskFileIdAndDiskInstanceInCatalogue(const std::string &archiveId, const std::string &diskFileId, const std::string &diskInstance) const {
   cta::xrd::Request request;
 
   const auto admincmd = request.mutable_admincmd();
@@ -175,28 +175,21 @@ void EosNamespaceInjection::updateFxidAndDiskInstanceInCatalogue(const std::stri
   admincmd->set_subcmd(cta::admin::AdminCmd::SUBCMD_CH);
 
   {
-    const auto key = cta::admin::OptionString::FXID;
+    constexpr auto key = cta::admin::OptionString::DISK_FILE_ID;
     const auto new_opt = admincmd->add_option_str();
     new_opt->set_key(key);
-    new_opt->set_value(fxId);
+    new_opt->set_value(diskFileId);
   }
 
   {
-    const auto key = cta::admin::OptionString::DISK_FILE_ID;
-    const auto new_opt = admincmd->add_option_str();
-    new_opt->set_key(key);
-    new_opt->set_value(fxId);
-  }
-
-  {
-    const auto key = cta::admin::OptionString::DISK_INSTANCE;
+    constexpr auto key = cta::admin::OptionString::DISK_INSTANCE;
     const auto new_opt = admincmd->add_option_str();
     new_opt->set_key(key);
     new_opt->set_value(diskInstance);
   }
 
   {
-    const auto key = cta::admin::OptionStrList::FILE_ID;
+    constexpr auto key = cta::admin::OptionStrList::FILE_ID;
     const auto new_opt = admincmd->add_option_str_list();
     new_opt->set_key(key);
     new_opt->add_item(archiveId);
@@ -386,14 +379,15 @@ uint64_t EosNamespaceInjection::createFileInEos(const MetaDataObject &metaDataFr
 // getArchiveFileIdFromEOS
 //------------------------------------------------------------------------------
 std::pair<ArchiveId, Checksum> EosNamespaceInjection::getArchiveFileIdAndChecksumFromEOS(
-  const std::string& diskInstance, const std::string& fxId) {
-  auto fid = strtoul(fxId.c_str(), nullptr, 10);
+  const std::string& diskInstance, const std::string& diskFileId) const {
+  const auto fid = strtoul(diskFileId.c_str(), nullptr, 10);
   if(fid < 1) {
-    throw std::runtime_error(fid + " (base 10) is not a valid disk file ID");
+    throw std::runtime_error(diskFileId + " is not a valid EOS base-10 disk file ID");
   }
   {
     std::list<cta::log::Param> params;
     params.push_back(cta::log::Param("diskInstance", diskInstance));
+    params.push_back(cta::log::Param("diskFileId", diskFileId));
     params.push_back(cta::log::Param("fid", fid));
     std::stringstream ss;
     ss << std::hex << fid;
@@ -443,18 +437,18 @@ void EosNamespaceInjection::setCmdLineArguments(const int argc, char *const *con
 //------------------------------------------------------------------------------
 // checkEosCtaConsistency
 //------------------------------------------------------------------------------
-bool EosNamespaceInjection::checkEosCtaConsistency(const uint64_t& archiveId, const std::string& newFxIdEos, const MetaDataObject &metaDataFromUser) {
+bool EosNamespaceInjection::checkEosCtaConsistency(const uint64_t& archiveId, const std::string& newDiskFileId, const MetaDataObject &metaDataFromUser) {
   getMetaDataFromCatalogue(archiveId);
-  const auto [eosArchiveFileId, eosChecksumDecimal] = getArchiveFileIdAndChecksumFromEOS(metaDataFromUser.diskInstance, newFxIdEos);
+  const auto [eosArchiveFileId, eosChecksumDecimal] = getArchiveFileIdAndChecksumFromEOS(metaDataFromUser.diskInstance, newDiskFileId);
   const std::string eosChecksum = cta::utils::decimalToHexadecimal(eosChecksumDecimal);
   const auto& ctaChecksum = g_metaDataObjectCatalogue.checksumValue;
   std::list<cta::log::Param> params;
   params.push_back(cta::log::Param("archiveFileId", archiveId));
-  params.push_back(cta::log::Param("diskFileId in EOS for new file", newFxIdEos));
-  params.push_back(cta::log::Param("diskFileId in Catalogue", g_metaDataObjectCatalogue.fxId));
+  params.push_back(cta::log::Param("diskFileId in EOS for new file", newDiskFileId));
+  params.push_back(cta::log::Param("diskFileId in Catalogue", g_metaDataObjectCatalogue.diskId));
   params.push_back(cta::log::Param("diskInstance in Catalogue", g_metaDataObjectCatalogue.diskInstance));
   params.push_back(cta::log::Param("checksum", ctaChecksum));
-  if(eosArchiveFileId == archiveId && eosChecksum == ctaChecksum && g_metaDataObjectCatalogue.fxId == newFxIdEos) {
+  if(eosArchiveFileId == archiveId && eosChecksum == ctaChecksum && g_metaDataObjectCatalogue.diskId == newDiskFileId) {
     m_log(cta::log::INFO, "File metadata in EOS and CTA matches", params);
     return true;
   } else {
@@ -510,8 +504,7 @@ void EosNamespaceInjection::checkArchiveIdExistsInCatalogue(const uint64_t &arch
 // checkExistingPathHasInvalidMetadata
 //------------------------------------------------------------------------------
 void EosNamespaceInjection::checkExistingPathHasInvalidMetadata(const uint64_t &archiveId, const uint64_t& fid, const MetaDataObject& metaDataFromUser) {
-  const std::string fxId = cta::utils::decimalToHexadecimal(std::to_string(fid));
-  if(!checkEosCtaConsistency(archiveId, fxId, metaDataFromUser)) {
+  if(!checkEosCtaConsistency(archiveId, std::to_string(fid), metaDataFromUser)) {
     throw cta::cliTool::EosNameSpaceInjectionError("The file with path " + metaDataFromUser.eosPath + " already exists for instance " + metaDataFromUser.diskInstance + ". This tool does not overwrite existing files");
   }
 }
diff --git a/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.hpp b/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.hpp
index 1dca6860fa..7d014d6ef7 100644
--- a/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.hpp
+++ b/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.hpp
@@ -74,12 +74,12 @@ class EosNamespaceInjection final: public CmdLineTool {
     bool getMetaDataFromCatalogue(const uint64_t &archiveId) const;
 
     /**
-    * Updates the fxid and the disk instance in the catalogue.
+    * Updates the disk file ID and the disk instance in the catalogue.
     * @param archiveId the archive file id to check
-    * @param fxId The new fxId
-    * @param diskInstnace The new disk instance
+    * @param diskFileId The new diskFileID
+    * @param diskInstance The new disk instance
     */
-    void updateFxidAndDiskInstanceInCatalogue(const std::string &archiveId, const std::string &fxId, const std::string &diskInstance) const;
+    void updateDiskFileIdAndDiskInstanceInCatalogue(const std::string &archiveId, const std::string &diskFileId, const std::string &diskInstance) const;
 
     /**
     * Compares the meta data from the provided json and from the Catalogue
@@ -113,9 +113,9 @@ class EosNamespaceInjection final: public CmdLineTool {
     /**
     * Gets the archive file id and checksum from eos
     * @param diskInstance The eos disk instance
-    * @param fxId The eos file id
+    * @param diskFileId The eos disk file id
     */
-    std::pair<ArchiveId, Checksum> getArchiveFileIdAndChecksumFromEOS(const std::string& diskInstance, const std::string& fxId);
+    std::pair<ArchiveId, Checksum> getArchiveFileIdAndChecksumFromEOS(const std::string& diskInstance, const std::string& diskFileId) const;
 
     /**
     * Validates the command line arguments
diff --git a/cmdline/standalone_cli_tools/eos_namespace_injection/MetaData.hpp b/cmdline/standalone_cli_tools/eos_namespace_injection/MetaData.hpp
index 4f89ecc684..c51caeb13c 100644
--- a/cmdline/standalone_cli_tools/eos_namespace_injection/MetaData.hpp
+++ b/cmdline/standalone_cli_tools/eos_namespace_injection/MetaData.hpp
@@ -28,7 +28,7 @@ namespace cta::cliTool {
 struct MetaDataObject {
   std::string eosPath;
   std::string diskInstance;
-  std::string fxId;
+  std::string diskId;
   std::string creationTime;
   std::string archiveId;
   std::string size;
diff --git a/cmdline/standalone_cli_tools/restore_files/RestoreFilesCmd.cpp b/cmdline/standalone_cli_tools/restore_files/RestoreFilesCmd.cpp
index 55e4569379..c14dcc2117 100644
--- a/cmdline/standalone_cli_tools/restore_files/RestoreFilesCmd.cpp
+++ b/cmdline/standalone_cli_tools/restore_files/RestoreFilesCmd.cpp
@@ -317,37 +317,36 @@ void RestoreFilesCmd::restoreDeletedFileCopyCta(const cta::admin::RecycleTapeFil
   admincmd.set_subcmd(cta::admin::AdminCmd::SUBCMD_RESTORE);
 
   {
-    auto key = cta::admin::OptionString::VID;
-    auto new_opt = admincmd.add_option_str();
+    constexpr auto key = cta::admin::OptionString::VID;
+    const auto new_opt = admincmd.add_option_str();
     new_opt->set_key(key);
     new_opt->set_value(file.vid());
   }
   {
-    auto key = cta::admin::OptionString::INSTANCE;
-    auto new_opt = admincmd.add_option_str();
+    constexpr auto key = cta::admin::OptionString::INSTANCE;
+    const auto new_opt = admincmd.add_option_str();
     new_opt->set_key(key);
     new_opt->set_value(file.disk_instance());
   }
   {
-    auto key = cta::admin::OptionUInt64::ARCHIVE_FILE_ID;
-    auto new_opt = admincmd.add_option_uint64();
+    constexpr auto key = cta::admin::OptionUInt64::ARCHIVE_FILE_ID;
+    const auto new_opt = admincmd.add_option_uint64();
     new_opt->set_key(key);
     new_opt->set_value(file.archive_file_id());
   }
   {
-    auto key = cta::admin::OptionUInt64::COPY_NUMBER;
-    auto new_opt = admincmd.add_option_uint64();
+    constexpr auto key = cta::admin::OptionUInt64::COPY_NUMBER;
+    const auto new_opt = admincmd.add_option_uint64();
     new_opt->set_key(key);
     new_opt->set_value(file.copy_nb());
   }
   {
-    auto key = cta::admin::OptionString::DISK_FILE_ID;
-    auto new_opt = admincmd.add_option_str();
+    constexpr auto key = cta::admin::OptionString::DISK_FILE_ID;
+    const auto new_opt = admincmd.add_option_str();
 
     if (!utils::isValidDecimal(file.disk_file_id()) && !utils::isValidUUID(file.disk_file_id())) {
       throw std::runtime_error(file.disk_file_id() + " is not a valid disk file ID");
     }
-    params.emplace_back("fid", file.disk_file_id());
     new_opt->set_key(key);
     new_opt->set_value(file.disk_file_id());
   }
diff --git a/common/utils/utils.cpp b/common/utils/utils.cpp
index 7891b7e534..4bf6e5e1d8 100644
--- a/common/utils/utils.cpp
+++ b/common/utils/utils.cpp
@@ -998,21 +998,18 @@ std::string listToCommaSeparatedString(const std::list<std::string>& list) {
   return oss.str();
 }
 
-std::string decimalToHexadecimal(const std::string& decimalNumber) {
-  std::stringstream fxIdStream;
-  fxIdStream << std::hex << decimalNumber;
-  return fxIdStream.str();
+std::string decimalToHexadecimal(const std::string& decimalNumberStr) {
+  std::stringstream fxidStream;
+  const auto decimalNumber = stol(decimalNumberStr);
+  fxidStream << std::hex << decimalNumber;
+  return fxidStream.str();
 }
 
-std::string hexadecimalToDecimal(const std::string& hexadecimalNumber) {
-  try {
-    auto decimalNum = stol(hexadecimalNumber, nullptr, 16);
-    return std::to_string(decimalNum);
-  } catch (std::invalid_argument & ex) {
-    throw cta::exception::Exception(hexadecimalNumber + " is not a valid hexadecimal number.");
-  } catch (std::out_of_range & ex) {
-    throw cta::exception::Exception(hexadecimalNumber + " is out of range.");
-  }
+std::string hexadecimalToDecimal(const std::string& hexadecimalNumberStr) {
+  std::stringstream fidStream;
+  const auto decimalNumber = stol(hexadecimalNumberStr, nullptr, 16);
+  fidStream << std::dec << decimalNumber;
+  return fidStream.str();
 }
 
 // Check if uuid is correct
diff --git a/common/utils/utils.hpp b/common/utils/utils.hpp
index 6e77370ac1..e6de2884bf 100644
--- a/common/utils/utils.hpp
+++ b/common/utils/utils.hpp
@@ -502,17 +502,17 @@ std::string listToCommaSeparatedString(const std::list<std::string>& list);
 
 /**
  * Converts a number from a decimal number to a hexidecimal number
- * @param decimalNumber The number that will be transformed
+ * @param decimalNumberStr The number that will be transformed
  * @return the hexadecimal version of the number
  */
-std::string decimalToHexadecimal(const std::string& decimalNumber);
+std::string decimalToHexadecimal(const std::string& decimalNumberStr);
 
 /**
  * Converts a number from a hexadecimal number to a decimal number
- * @param hexadecimalNumber The number that will be transformed
- * @return the hexadecimal version of the number
+ * @param hexadecimalNumberStr The number that will be transformed
+ * @return the decimal version of the number
  */
-std::string hexadecimalToDecimal(const std::string& hexadecimalNumber);
+std::string hexadecimalToDecimal(const std::string& hexadecimalNumberStr);
 
 /**
  * Checks if a string is a valid UUID.
diff --git a/frontend/common/AdminCmd.cpp b/frontend/common/AdminCmd.cpp
index 10058da60c..79d0402fcb 100644
--- a/frontend/common/AdminCmd.cpp
+++ b/frontend/common/AdminCmd.cpp
@@ -1195,8 +1195,7 @@ void AdminCmd::processTapeFile_Rm(xrd::Response& response) {
   auto& reason        = getRequired(OptionString::REASON);
   auto archiveFileId  = getOptional(OptionUInt64::ARCHIVE_FILE_ID);
   auto instance       = getOptional(OptionString::INSTANCE);
-  auto diskFileIdHex  = getOptional(OptionString::FXID);
-  auto diskFileIdStr  = getOptional(OptionString::DISK_FILE_ID);
+  auto diskFileIdStr  = getAndValidateDiskFileIdOptional();
 
   catalogue::TapeFileSearchCriteria searchCriteria;
   searchCriteria.vid = vid;
@@ -1204,25 +1203,12 @@ void AdminCmd::processTapeFile_Rm(xrd::Response& response) {
   if(archiveFileId) {
     searchCriteria.archiveFileId = archiveFileId.value();
   }
-  if(diskFileIdHex && diskFileIdStr) {
-    throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
-  }
-  if(diskFileIdHex) {
-    try {
-      diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
-    } catch (exception::Exception &) {
-      throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
-    }
-  } else if(diskFileIdStr) {
-    if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
-      throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
-    }
-  }
 
   if(diskFileIdStr) {
     searchCriteria.diskFileIds = std::vector<std::string>();
     searchCriteria.diskFileIds.value().push_back(diskFileIdStr.value());
   }
+
   if(instance) {
     searchCriteria.diskInstance = instance.value();
   }
@@ -1603,35 +1589,46 @@ std::string AdminCmd::setDriveState(const std::string& regex, const common::data
   return cmdlineOutput.str();
 }
 
-void AdminCmd::processRecycleTapeFile_Restore(xrd::Response& response) {
+std::optional<std::string> AdminCmd::getAndValidateDiskFileIdOptional(bool* has_any) const {
   using namespace cta::admin;
-
-  response.set_type(xrd::Response::RSP_SUCCESS);
-
-  bool has_any = false;
-  catalogue::RecycleTapeFileSearchCriteria searchCriteria;
-
-  searchCriteria.vid = getOptional(OptionString::VID, &has_any);
-  auto diskFileIdHex = getOptional(OptionString::FXID);
-  auto diskFileIdStr = getOptional(OptionString::DISK_FILE_ID);
+  auto diskFileIdHex  = getOptional(OptionString::FXID, has_any);
+  auto diskFileIdStr  = getOptional(OptionString::DISK_FILE_ID, has_any);
 
   if(diskFileIdHex && diskFileIdStr) {
     throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
   }
-  if(!diskFileIdHex && !diskFileIdStr) {
-    throw exception::UserError("Must specify at least one of the following search options: fxid, diskfileid");
-  }
 
   if(diskFileIdHex) {
-    try {
-      diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
-    } catch (exception::Exception &) {
+    // If provided, convert FXID (hexadecimal) to DISK_FILE_ID (decimal)
+    if (!utils::isValidHex(diskFileIdHex.value())) {
       throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
     }
-  } else {
+    return utils::hexadecimalToDecimal(diskFileIdHex.value());
+  }
+
+  if(diskFileIdStr) {
     if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
       throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
     }
+    return diskFileIdStr;
+  }
+
+  return std::nullopt;
+}
+
+void AdminCmd::processRecycleTapeFile_Restore(xrd::Response& response) {
+  using namespace cta::admin;
+
+  response.set_type(xrd::Response::RSP_SUCCESS);
+
+  bool has_any = false;
+  catalogue::RecycleTapeFileSearchCriteria searchCriteria;
+
+  searchCriteria.vid = getOptional(OptionString::VID, &has_any);
+
+  const auto diskFileIdStr = getAndValidateDiskFileIdOptional();
+  if(!diskFileIdStr) {
+    throw exception::UserError("Must specify at least one of the following search options: fxid, diskfileid");
   }
 
   // Disk instance on its own does not give a valid set of search criteria (no &has_any)
@@ -1652,27 +1649,12 @@ void AdminCmd::processModifyArchiveFile(xrd::Response& response) {
 
   try {
     std::optional<std::string> newStorageClassName = getOptional(OptionString::STORAGE_CLASS);
-    std::optional<std::string> diskFileIdHex = getOptional(OptionString::FXID);
-    std::optional<std::string> diskFileIdStr = getOptional(OptionString::DISK_FILE_ID);
+
+    std::optional<std::string> diskFileIdStr = getAndValidateDiskFileIdOptional();
     std::optional<std::string> diskInstance = getOptional(OptionString::DISK_INSTANCE);
 
     auto archiveFileIds = getRequired(OptionStrList::FILE_ID);
 
-    if(diskFileIdHex && diskFileIdStr) {
-      throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
-    }
-    if(diskFileIdHex) {
-      try {
-        diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
-      } catch (exception::Exception &) {
-        throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
-      }
-    } else if (diskFileIdStr) {
-      if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
-        throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
-      }
-    }
-
     // call is from cta-change-storageclass
     if(newStorageClassName) {
       for(const auto& id : archiveFileIds) {
diff --git a/frontend/common/AdminCmd.hpp b/frontend/common/AdminCmd.hpp
index 6e0124f42f..cdacf4fd4d 100644
--- a/frontend/common/AdminCmd.hpp
+++ b/frontend/common/AdminCmd.hpp
@@ -112,6 +112,19 @@ public:
     return opt_it != m_option_bool.end() && opt_it->second;
   }
 
+  /*!
+   * Both parameters FXID and DISK_FILE_ID expect the same information but with different formats.
+   * They can't both be set simultaneously, to avoid inconsistencies.
+   *
+   * This function tries to parse one of these values and return it as a string (integer or UUID).
+   *
+   * @throws UserError if both FXID and DISK_FILE_ID are defined
+   * @throws UserError if format of FXID or DISK_FILE_ID is wrong
+   *
+   * @return       The disk file ID as a string (integer or UUID), or nullopt if none defined.
+   */
+  std::optional<std::string> getAndValidateDiskFileIdOptional(bool* has_any = nullptr) const;
+
 protected:
   /*!
    * Convert AdminCmd <Cmd, SubCmd> pair to an integer so that it can be used in a switch statement
diff --git a/xroot_plugins/XrdCtaRecycleTapeFileLs.hpp b/xroot_plugins/XrdCtaRecycleTapeFileLs.hpp
index b355a24f2a..3d9c560d73 100644
--- a/xroot_plugins/XrdCtaRecycleTapeFileLs.hpp
+++ b/xroot_plugins/XrdCtaRecycleTapeFileLs.hpp
@@ -68,22 +68,7 @@ RecycleTapeFileLsStream::RecycleTapeFileLsStream(const frontend::AdminCmdStream&
   
   searchCriteria.vid = requestMsg.getOptional(OptionString::VID, &has_any);
   
-  auto diskFileIdHex = requestMsg.getOptional(OptionString::FXID, &has_any);
-  auto diskFileIdStr = requestMsg.getOptional(OptionString::DISK_FILE_ID, &has_any);
-  if(diskFileIdHex && diskFileIdStr) {
-    throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
-  }
-  if(diskFileIdHex) {
-    try {
-      diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
-    } catch (exception::Exception &) {
-      throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
-    }
-  } else if(diskFileIdStr) {
-    if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
-      throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
-    }
-  }
+  auto diskFileIdStr = requestMsg.getAndValidateDiskFileIdOptional(&has_any);
 
   searchCriteria.diskFileIds = requestMsg.getOptional(OptionStrList::FILE_ID, &has_any);
   if (diskFileIdStr){
diff --git a/xroot_plugins/XrdCtaTapeFileLs.hpp b/xroot_plugins/XrdCtaTapeFileLs.hpp
index 63f9841434..d19810387d 100644
--- a/xroot_plugins/XrdCtaTapeFileLs.hpp
+++ b/xroot_plugins/XrdCtaTapeFileLs.hpp
@@ -64,23 +64,7 @@ TapeFileLsStream::TapeFileLsStream(const frontend::AdminCmdStream& requestMsg,
   cta::catalogue::TapeFileSearchCriteria searchCriteria;
 
   searchCriteria.vid = requestMsg.getOptional(OptionString::VID, &has_any);
-
-  auto diskFileIdHex = requestMsg.getOptional(OptionString::FXID, &has_any);
-  auto diskFileIdStr = requestMsg.getOptional(OptionString::DISK_FILE_ID, &has_any);
-  if(diskFileIdHex && diskFileIdStr) {
-    throw exception::UserError("File ID can't be received in both string (" + diskFileIdStr.value() + ") and hexadecimal (" + diskFileIdHex.value() + ") formats");
-  }
-  if(diskFileIdHex) {
-    try {
-      diskFileIdStr = utils::hexadecimalToDecimal(diskFileIdHex.value());
-    } catch (exception::Exception &) {
-      throw cta::exception::UserError(diskFileIdHex.value() + " is not a valid hexadecimal file ID value");
-    }
-  } else if(diskFileIdStr) {
-    if (!utils::isValidDecimal(diskFileIdStr.value()) && !utils::isValidUUID(diskFileIdStr.value())) {
-      throw cta::exception::UserError(diskFileIdStr.value() + " is not a valid decimal or UUID file ID value");
-    }
-  }
+  auto diskFileIdStr = requestMsg.getAndValidateDiskFileIdOptional(&has_any);
 
   // Disk file IDs can be a list or a single ID
   searchCriteria.diskFileIds = requestMsg.getOptional(OptionStrList::FILE_ID, &has_any);
@@ -93,7 +77,7 @@ TapeFileLsStream::TapeFileLsStream(const frontend::AdminCmdStream& requestMsg,
   searchCriteria.archiveFileId = requestMsg.getOptional(OptionUInt64::ARCHIVE_FILE_ID, &has_any);
 
   if(!has_any) {
-    throw cta::exception::UserError("Must specify at least one of the following search options: vid, fxid, fxidfile or archiveFileId");
+    throw cta::exception::UserError("Must specify at least one of the following search options: vid, fxid, diskfileid, fxidfile or archiveFileId");
   }
 
   m_tapeFileItor = m_catalogue.ArchiveFile()->getArchiveFilesItor(searchCriteria);
-- 
GitLab


From 470855bccdb0a62b0dc538a10b44fac65a3f1254 Mon Sep 17 00:00:00 2001
From: Joao Afonso <joao.afonso@cern.ch>
Date: Mon, 24 Feb 2025 13:53:28 +0100
Subject: [PATCH 5/5] Implementing MR suggestions

---
 .../EosNamespaceInjection.cpp                        |  6 +++---
 .../eos_namespace_injection/MetaData.hpp             |  2 +-
 common/utils/utils.hpp                               | 12 ++++++------
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp b/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp
index a1c60dee1d..4d09c8dc4c 100644
--- a/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp
+++ b/cmdline/standalone_cli_tools/eos_namespace_injection/EosNamespaceInjection.cpp
@@ -76,7 +76,7 @@ void IStreamBuffer<cta::xrd::Data>::DataCallback(cta::xrd::Data record) const {
       g_metaDataObjectCatalogue.size          = std::to_string(item.af().size());
       g_metaDataObjectCatalogue.storageClass  = item.af().storage_class();
       g_metaDataObjectCatalogue.creationTime  = std::to_string(item.af().creation_time());
-      g_metaDataObjectCatalogue.diskId          = item.df().disk_id();
+      g_metaDataObjectCatalogue.diskFileId    = item.df().disk_id();
       g_metaDataObjectCatalogue.diskInstance  = item.df().disk_instance();
 
       std::string checksumType("NONE");
@@ -445,10 +445,10 @@ bool EosNamespaceInjection::checkEosCtaConsistency(const uint64_t& archiveId, co
   std::list<cta::log::Param> params;
   params.push_back(cta::log::Param("archiveFileId", archiveId));
   params.push_back(cta::log::Param("diskFileId in EOS for new file", newDiskFileId));
-  params.push_back(cta::log::Param("diskFileId in Catalogue", g_metaDataObjectCatalogue.diskId));
+  params.push_back(cta::log::Param("diskFileId in Catalogue", g_metaDataObjectCatalogue.diskFileId));
   params.push_back(cta::log::Param("diskInstance in Catalogue", g_metaDataObjectCatalogue.diskInstance));
   params.push_back(cta::log::Param("checksum", ctaChecksum));
-  if(eosArchiveFileId == archiveId && eosChecksum == ctaChecksum && g_metaDataObjectCatalogue.diskId == newDiskFileId) {
+  if(eosArchiveFileId == archiveId && eosChecksum == ctaChecksum && g_metaDataObjectCatalogue.diskFileId == newDiskFileId) {
     m_log(cta::log::INFO, "File metadata in EOS and CTA matches", params);
     return true;
   } else {
diff --git a/cmdline/standalone_cli_tools/eos_namespace_injection/MetaData.hpp b/cmdline/standalone_cli_tools/eos_namespace_injection/MetaData.hpp
index c51caeb13c..0dd2867afb 100644
--- a/cmdline/standalone_cli_tools/eos_namespace_injection/MetaData.hpp
+++ b/cmdline/standalone_cli_tools/eos_namespace_injection/MetaData.hpp
@@ -28,7 +28,7 @@ namespace cta::cliTool {
 struct MetaDataObject {
   std::string eosPath;
   std::string diskInstance;
-  std::string diskId;
+  std::string diskFileId;
   std::string creationTime;
   std::string archiveId;
   std::string size;
diff --git a/common/utils/utils.hpp b/common/utils/utils.hpp
index e6de2884bf..6860f947e9 100644
--- a/common/utils/utils.hpp
+++ b/common/utils/utils.hpp
@@ -501,16 +501,16 @@ std::list<std::string> commaSeparatedStringToList(const std::string& commaSepara
 std::string listToCommaSeparatedString(const std::list<std::string>& list);
 
 /**
- * Converts a number from a decimal number to a hexidecimal number
- * @param decimalNumberStr The number that will be transformed
- * @return the hexadecimal version of the number
+ * Converts a number from decimal to hexadecimal representation
+ * @param decimalNumberStr String containing the decimal number that will be transformed
+ * @return the hexadecimal representation of the number
  */
 std::string decimalToHexadecimal(const std::string& decimalNumberStr);
 
 /**
- * Converts a number from a hexadecimal number to a decimal number
- * @param hexadecimalNumberStr The number that will be transformed
- * @return the decimal version of the number
+ * Converts a number from hexadecimal to decimal representation
+ * @param hexadecimalNumberStr String containing the hexadecimal number that will be transformed
+ * @return the decimal representation of the number
  */
 std::string hexadecimalToDecimal(const std::string& hexadecimalNumberStr);
 
-- 
GitLab