From 86e0552e5240f6407dbc7646f86d037672290561 Mon Sep 17 00:00:00 2001 From: "toni.zamparetti" Date: Tue, 17 Mar 2026 08:18:12 -0300 Subject: [PATCH 1/4] NPE correction when informing removed project in the 'listProjectRoles' --- .../api/command/admin/acl/project/ListProjectRolesCmd.java | 7 +++++-- .../org/apache/cloudstack/acl/ProjectRoleManagerImpl.java | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java index dedbb410ea56..6ab7075cb751 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.List; +import com.cloud.exception.InvalidParameterValueException; import org.apache.cloudstack.acl.ProjectRole; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; @@ -55,7 +56,6 @@ public class ListProjectRolesCmd extends BaseListCmd { /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// - public Long getProjectRoleId() { return projectRoleId; } public Long getProjectId() { @@ -72,7 +72,10 @@ public String getRoleName() { @Override public void execute() { - List projectRoles = new ArrayList<>(); + if (getProjectId() != null && _projectService.getProject(getProjectId()) == null) { + throw new InvalidParameterValueException("Failed to find project by ID."); + } + List projectRoles; if (getProjectId() != null && getProjectRoleId() != null) { projectRoles = Collections.singletonList(projRoleService.findProjectRole(getProjectRoleId(), getProjectId())); } else if (StringUtils.isNotBlank(getRoleName())) { diff --git a/server/src/main/java/org/apache/cloudstack/acl/ProjectRoleManagerImpl.java b/server/src/main/java/org/apache/cloudstack/acl/ProjectRoleManagerImpl.java index 91bbb349a07e..6c8b952ddf86 100644 --- a/server/src/main/java/org/apache/cloudstack/acl/ProjectRoleManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/acl/ProjectRoleManagerImpl.java @@ -168,9 +168,9 @@ public ProjectRole findProjectRole(Long roleId, Long projectId) { @Override public List findProjectRoles(Long projectId, String keyword) { - if (projectId == null || projectId < 1L || projectDao.findById(projectId) == null) { - logger.warn("Invalid project ID provided"); - return null; + if (projectId == null) { + logger.warn("Invalid project ID provided; thus, an empty list is being returned."); + return Collections.emptyList(); } return ListUtils.toListOfInterface(projRoleDao.findAllRoles(projectId, keyword)); } From 3f860921365684de158768761a647662be9315e3 Mon Sep 17 00:00:00 2001 From: Tonitzpp <134986282+Tonitzpp@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:24:50 -0300 Subject: [PATCH 2/4] Refactor ListProjectRolesCmd to improve project handling --- .../admin/acl/project/ListProjectRolesCmd.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java index 6ab7075cb751..ccb7a7fd950d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java @@ -72,9 +72,14 @@ public String getRoleName() { @Override public void execute() { - if (getProjectId() != null && _projectService.getProject(getProjectId()) == null) { - throw new InvalidParameterValueException("Failed to find project by ID."); + Project project = null; + if (getProjectId() != null && getProjectId() > 0) { + project = _projectService.getProject(getProjectId()); + if (project == null) { + throw new InvalidParameterValueException("Unable to find project by ID."); + } } + final String projectUuid = project != null ? project.getUuid() : null; List projectRoles; if (getProjectId() != null && getProjectRoleId() != null) { projectRoles = Collections.singletonList(projRoleService.findProjectRole(getProjectRoleId(), getProjectId())); @@ -89,17 +94,17 @@ public void execute() { if (role == null) { continue; } - roleResponses.add(setupProjectRoleResponse(role)); + roleResponses.add(setupProjectRoleResponse(role, projectUuid)); } response.setResponses(roleResponses); response.setResponseName(getCommandName()); setResponseObject(response); } - private ProjectRoleResponse setupProjectRoleResponse(final ProjectRole role) { + private ProjectRoleResponse setupProjectRoleResponse(final ProjectRole role, final String projectUuid) { final ProjectRoleResponse response = new ProjectRoleResponse(); response.setId(role.getUuid()); - response.setProjectId(_projectService.getProject(role.getProjectId()).getUuid()); + response.setProjectId(projectUuid); response.setRoleName(role.getName()); response.setDescription(role.getDescription()); response.setObjectName("projectrole"); @@ -111,3 +116,4 @@ public long getEntityOwnerId() { return CallContext.current().getCallingAccountId(); } } +} From 03a92dad4316b5e8516b390f132a63ec69e1179d Mon Sep 17 00:00:00 2001 From: Tonitzpp <134986282+Tonitzpp@users.noreply.github.com> Date: Wed, 22 Apr 2026 07:56:45 -0300 Subject: [PATCH 3/4] Update error message for project ID lookup failure --- .../api/command/admin/acl/project/ListProjectRolesCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java index ccb7a7fd950d..b93114dc5f96 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java @@ -76,7 +76,7 @@ public void execute() { if (getProjectId() != null && getProjectId() > 0) { project = _projectService.getProject(getProjectId()); if (project == null) { - throw new InvalidParameterValueException("Unable to find project by ID."); + throw new InvalidParameterValueException("Failed to find project by ID."); } } final String projectUuid = project != null ? project.getUuid() : null; From 9f3f3cd9a17a3c85a4c84909aea82f35237e5f21 Mon Sep 17 00:00:00 2001 From: Tonitzpp <134986282+Tonitzpp@users.noreply.github.com> Date: Wed, 22 Apr 2026 07:58:15 -0300 Subject: [PATCH 4/4] Add import for Project class in ListProjectRolesCmd --- .../api/command/admin/acl/project/ListProjectRolesCmd.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java index b93114dc5f96..c1203a6eaebe 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java @@ -22,6 +22,7 @@ import java.util.List; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.projects.Project; import org.apache.cloudstack.acl.ProjectRole; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand;